pub fn calculate_chi_square(observed: &[f64], expected: &[f64]) -> f64 {
observed
.iter()
.zip(expected.iter())
.map(|(&obs, &exp)| {
if exp > 0.0 {
let diff = obs - exp;
(diff * diff) / exp
} else {
0.0
}
})
.sum()
}
pub fn calculate_p_value(chi_square: f64, degrees_of_freedom: i32) -> f64 {
if chi_square <= 0.0 {
return 1.0;
}
match degrees_of_freedom {
8 => {
if chi_square >= 20.09 {
0.01
}
else if chi_square >= 15.51 {
0.05
}
else if chi_square >= 13.36 {
0.1
}
else {
0.5
} }
_ => {
if chi_square >= 20.0 {
0.01
} else if chi_square >= 15.0 {
0.05
} else if chi_square >= 12.0 {
0.1
} else {
0.5
}
}
}
}
pub fn calculate_mad(observed: &[f64], expected: &[f64]) -> f64 {
let sum: f64 = observed
.iter()
.zip(expected.iter())
.map(|(&obs, &exp)| (obs - exp).abs())
.sum();
sum / observed.len() as f64
}