025c7f24创建于 2025年10月29日历史提交
package scientific.stats.correlation

/* F statistic and p-value */

import std.unittest.*
import std.unittest.testmacro.*

import scientific.linear.*
import scientific.numbers.*
import scientific.stats.random.*
import scientific.stats.summary.*

// foreign func fdtrc(a: Int64, b: Int64, c: Float64): Float64

// public func f_oneway(data: Array<Vector<Float64>>): (Float64, Float64) {
//     let r = data.size
//     var n = 0
//     for (i in 0..r) {
//         n += data[i].shape()[0]
//     }
//     var sse = 0.0
//     var ssa = 0.0 

//     /* mean of total data */
//     var sumvalue = 0.0
//     for (i in 0..r) {
//         sumvalue += sum(data[i])
//     }
//     let ymn = Float64(sumvalue) / Float64(n)

//     /* calculate ssa */
//     for (i in 0..r) {
//         ssa += Float64(data[i].shape()[0]) * (mean(data[i]) - ymn) * (mean(data[i]) - ymn)
//     }

//     /* calculate sse */
//     for (i in 0..r) {
//         for (j in 0..(data[i].shape()[0])) {
//             sse += (data[i][j] - mean(data[i])) * (data[i][j] - mean(data[i]))
//         }
//     }

//     let msa = ssa / Float64(r - 1) 
//     let mse = sse / Float64(n - r)
//     let f_statistic = msa / mse

//     let p_value = unsafe { fdtrc( 1, 8, f_statistic) }
//     return (f_statistic, p_value)
// }

// @Test
// public class TestFOneway {
//     @TestCase
//     func testf_oneway(): Unit {
//         let data = [vector<Float64>([1.0, 2.0, 3.0, 4.0, 5.0]),
//                     vector<Float64>([10.0, 9.0, 2.5, 6.0, 4.0])]
//         let (r, prob) = f_oneway(data)

//         @Assert(approxEqual(r, 4.287401574803149, atol:1e-5))
//         // @Assert(approxEqual(prob, 0.07216130255701617, atol:1e-5))   p-value seems incompatible
//     }
// }