use crate::accum::moments::{checked_variance, pooled_var};
use crate::error::StatError;
use crate::htest::anova::anova_sums;
use crate::htest::chi2::contingency_chi2;
pub fn cohen_d(a: &[f64], b: &[f64]) -> Result<f64, StatError> {
let (sa, sb) = (checked_variance(a)?, checked_variance(b)?);
let sp = pooled_var(&sa, &sb).sqrt();
Ok((sa.mean() - sb.mean()) / sp)
}
pub fn eta_squared(groups: &[&[f64]]) -> Result<f64, StatError> {
let (_grand_n, ssb, ssw) = anova_sums(groups)?;
Ok(ssb / (ssb + ssw))
}
pub fn cramers_v(table: &[&[f64]]) -> Result<f64, StatError> {
let (chi2, grand) = contingency_chi2(table);
let k = ((table.len() - 1).min(table[0].len() - 1)) as f64;
Ok((chi2 / (grand * k)).sqrt())
}