use greeners::diagnostics::Diagnostics;
use ndarray::{Array1, Array2};
#[test]
fn test_vif_basic() {
let x = Array2::from_shape_vec(
(10, 3),
vec![
1.0, 1.0, 2.3, 1.0, 2.0, 5.1, 1.0, 3.0, 3.8, 1.0, 4.0, 7.2, 1.0, 5.0, 4.5, 1.0, 6.0,
9.1, 1.0, 7.0, 6.7, 1.0, 8.0, 8.3, 1.0, 9.0, 5.9, 1.0, 10.0, 10.2,
],
)
.unwrap();
let vif_results = Diagnostics::vif(&x).unwrap();
assert_eq!(vif_results.len(), 3);
assert!(vif_results[0].is_nan());
for &vif_value in vif_results.iter().skip(1) {
assert!(vif_value >= 1.0); assert!(vif_value.is_finite());
}
}
#[test]
fn test_vif_multicollinearity() {
let x = Array2::from_shape_vec(
(10, 3),
vec![
1.0, 1.0, 1.2, 1.0, 2.0, 2.1, 1.0, 3.0, 3.3, 1.0, 4.0, 3.9, 1.0, 5.0, 5.1, 1.0, 6.0,
5.8, 1.0, 7.0, 7.2, 1.0, 8.0, 7.9, 1.0, 9.0, 9.1, 1.0, 10.0, 9.8,
],
)
.unwrap();
let vif_results = Diagnostics::vif(&x).unwrap();
assert_eq!(vif_results.len(), 3);
assert!(vif_results[0].is_nan());
let max_vif = vif_results
.iter()
.skip(1)
.filter(|v| v.is_finite())
.max_by(|a, b| a.partial_cmp(b).unwrap())
.unwrap();
assert!(max_vif > &5.0); }
#[test]
fn test_condition_number_well_conditioned() {
let x = Array2::from_shape_vec(
(5, 2),
vec![1.0, 1.0, 1.0, 2.0, 1.0, 3.0, 1.0, 4.0, 1.0, 5.0],
)
.unwrap();
let cond_num = Diagnostics::condition_number(&x).unwrap();
assert!(cond_num.is_finite());
assert!(cond_num > 0.0);
}
#[test]
fn test_jarque_bera_normal() {
let residuals = Array1::from(vec![
-0.1, 0.2, -0.05, 0.15, -0.2, 0.1, 0.0, -0.15, 0.05, -0.1, 0.2, -0.05,
]);
let (jb_stat, p_value) = Diagnostics::jarque_bera(&residuals).unwrap();
assert!(jb_stat >= 0.0);
assert!((0.0..=1.0).contains(&p_value));
}
#[test]
fn test_durbin_watson() {
let residuals = Array1::from(vec![0.1, -0.1, 0.2, -0.2, 0.1, -0.1, 0.15, -0.15]);
let dw = Diagnostics::durbin_watson(&residuals);
assert!((0.0..=4.0).contains(&dw));
}
#[test]
fn test_durbin_watson_no_autocorrelation() {
let residuals = Array1::from(vec![0.1, -0.2, 0.15, -0.1, 0.05, -0.15, 0.2, -0.05]);
let dw = Diagnostics::durbin_watson(&residuals);
assert!(dw > 0.0 && dw < 4.0);
}
#[test]
fn test_breusch_pagan() {
let residuals = Array1::from(vec![0.1, -0.2, 0.3, -0.1, 0.2, -0.3, 0.15, -0.25]);
let x = Array2::from_shape_vec(
(8, 2),
vec![
1.0, 1.0, 1.0, 2.0, 1.0, 3.0, 1.0, 4.0, 1.0, 5.0, 1.0, 6.0, 1.0, 7.0, 1.0, 8.0,
],
)
.unwrap();
let (lm_stat, p_value) = Diagnostics::breusch_pagan(&residuals, &x).unwrap();
assert!(lm_stat >= 0.0);
assert!((0.0..=1.0).contains(&p_value));
}
#[test]
fn test_vif_single_variable() {
let x = Array2::from_shape_vec((5, 1), vec![1.0, 1.0, 1.0, 1.0, 1.0]).unwrap();
let vif_results = Diagnostics::vif(&x).unwrap();
assert_eq!(vif_results.len(), 1);
}
#[test]
fn test_condition_number_ill_conditioned() {
let x = Array2::from_shape_vec(
(5, 2),
vec![1.0, 1.0, 1.0, 1.001, 1.0, 1.002, 1.0, 1.003, 1.0, 1.004],
)
.unwrap();
let cond_num = Diagnostics::condition_number(&x).unwrap();
assert!(cond_num > 10.0);
}