use crate::weightstats::{ttest_ind, Alternative, UseVar};
use ndarray::Array1;
use solow_core::error::Result;
#[derive(Debug, Clone, Copy)]
pub struct TostResult {
pub pvalue: f64,
pub t1: f64,
pub pv1: f64,
pub t2: f64,
pub pv2: f64,
}
pub fn ttost_ind(
x1: &Array1<f64>,
x2: &Array1<f64>,
low: f64,
upp: f64,
usevar: UseVar,
) -> Result<TostResult> {
let tt1 = ttest_ind(x1, x2, Alternative::Larger, usevar, low);
let tt2 = ttest_ind(x1, x2, Alternative::Smaller, usevar, upp);
let pvalue = tt1.pvalue.max(tt2.pvalue);
Ok(TostResult {
pvalue,
t1: tt1.statistic,
pv1: tt1.pvalue,
t2: tt2.statistic,
pv2: tt2.pvalue,
})
}
#[cfg(test)]
mod tests {
use super::*;
use ndarray::array;
#[test]
fn tost_runs_pooled_and_unequal() {
let x1 = array![1.0, 1.2, 0.9, 1.1, 1.05, 0.95, 1.15, 0.85];
let x2 = array![1.05, 1.1, 1.0, 0.9, 1.2, 1.0, 0.95, 1.1];
for uv in [UseVar::Pooled, UseVar::Unequal] {
let r = ttost_ind(&x1, &x2, -0.5, 0.5, uv).unwrap();
assert!((0.0..=1.0).contains(&r.pvalue));
assert!((r.pvalue - r.pv1.max(r.pv2)).abs() < 1e-15);
}
}
}