#![cfg(feature = "stats")]
use anyhow::Result;
use approx::assert_abs_diff_eq;
use ndarray::Axis;
use ndarray::array;
use ndarray_glm::{Linear, Logistic, ModelBuilder, Poisson};
#[test]
fn linear_pvalues() -> Result<()> {
let y = array![0.3_f64, 1.5, 0.8, 2.1, 1.7, 3.2, 2.5, 0.9];
let x = array![
[0.1_f64, 0.4],
[0.5, 0.1],
[0.2, 0.3],
[0.8, 0.7],
[0.6, 0.2],
[1.1, 0.5],
[0.9, 0.8],
[0.3, 0.6]
];
let model = ModelBuilder::<Linear>::data(&y, &x).build()?;
let fit = model.fit()?;
let model_nostd = ModelBuilder::<Linear>::data(&y, &x)
.no_standardize()
.build()?;
let fit_nostd = model_nostd.fit()?;
let lr_p = fit.pvalue_lr_test();
let lr_p_nostd = fit_nostd.pvalue_lr_test();
assert_abs_diff_eq!(lr_p, 0.04085231, epsilon = 1e-5);
assert_abs_diff_eq!(lr_p_nostd, 0.04085231, epsilon = 1e-5);
let p_r = array![0.1203156, 4.007292e-06, 0.2835236];
let wald_p = fit.pvalue_wald()?;
let wald_p_nostd = fit_nostd.pvalue_wald()?;
assert_abs_diff_eq!(wald_p, p_r, epsilon = 1e-6);
assert_abs_diff_eq!(wald_p_nostd, p_r, epsilon = 1e-6);
let exact_p = fit.pvalue_exact()?;
let exact_p_nostd = fit_nostd.pvalue_exact()?;
assert_abs_diff_eq!(exact_p, p_r, epsilon = 1e-6);
assert_abs_diff_eq!(exact_p_nostd, p_r, epsilon = 1e-6);
Ok(())
}
#[test]
fn logistic_pvalues() -> Result<()> {
let y = array![
true, false, true, true, false, true, false, false, true, false, true, true
];
let x = array![
0.5_f64, -0.3, 0.2, 0.8, 0.1, 0.6, -0.1, -0.4, 0.3, 0.4, 0.7, -0.2
]
.insert_axis(Axis(1));
let model = ModelBuilder::<Logistic>::data(&y, &x).build()?;
let fit = model.fit()?;
let lr_p = fit.pvalue_lr_test();
assert_abs_diff_eq!(lr_p, 0.0249562, epsilon = 1e-4);
let wald_p = fit.pvalue_wald()?;
assert_abs_diff_eq!(wald_p[0], 0.6150234, epsilon = 1e-3);
assert_abs_diff_eq!(wald_p[1], 0.07092299, epsilon = 1e-3);
let exact_p = fit.pvalue_exact()?;
assert_abs_diff_eq!(exact_p[0], 0.6042003, epsilon = 1e-4);
assert_abs_diff_eq!(exact_p[1], 0.02496, epsilon = 1e-3);
Ok(())
}
#[test]
fn poisson_pvalues() -> Result<()> {
let y = array![1_usize, 3, 2, 5, 4, 7, 6, 2];
let x = array![0.1_f64, 0.4, 0.3, 0.8, 0.6, 1.0, 0.9, 0.2].insert_axis(Axis(1));
let model = ModelBuilder::<Poisson>::data(&y, &x).build()?;
let fit = model.fit()?;
let lr_p = fit.pvalue_lr_test();
assert_abs_diff_eq!(lr_p, 0.003744379, epsilon = 1e-5);
let wald_p = fit.pvalue_wald()?;
assert_abs_diff_eq!(wald_p[0], 0.6136655, epsilon = 1e-4);
assert_abs_diff_eq!(wald_p[1], 0.00560404, epsilon = 1e-4);
let exact_p = fit.pvalue_exact()?;
assert_abs_diff_eq!(exact_p[0], 0.6222284, epsilon = 1e-4);
assert_abs_diff_eq!(exact_p[1], 0.003744, epsilon = 1e-3);
Ok(())
}
#[test]
fn wald_exact_agreement() -> Result<()> {
let y = array![0.3_f64, 1.5, 0.8, 2.1, 1.7, 3.2, 2.5, 0.9];
let x = array![
[0.1_f64, 0.4],
[0.5, 0.1],
[0.2, 0.3],
[0.8, 0.7],
[0.6, 0.2],
[1.1, 0.5],
[0.9, 0.8],
[0.3, 0.6]
];
let model = ModelBuilder::<Linear>::data(&y, &x).build()?;
let fit = model.fit()?;
let wald_p = fit.pvalue_wald()?;
let exact_p = fit.pvalue_exact()?;
assert_abs_diff_eq!(wald_p, exact_p, epsilon = 1e-6);
Ok(())
}