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
// }
// }