use crate::core::VifResult;
use crate::feature_importance::types::VifRankingOutput;
pub fn vif_ranking(vif_results: &[VifResult]) -> VifRankingOutput {
VifRankingOutput::from_vif_results(vif_results)
}
pub fn vif_importance_scores(vif_results: &[VifResult]) -> (Vec<String>, Vec<f64>) {
let mut names = Vec::with_capacity(vif_results.len());
let mut scores = Vec::with_capacity(vif_results.len());
for vif in vif_results {
names.push(vif.variable.clone());
let importance = if vif.vif.is_finite() && vif.vif > 0.0 {
1.0 / vif.vif
} else {
0.0
};
scores.push(importance);
}
(names, scores)
}
#[cfg(test)]
mod tests {
use super::*;
fn create_vif_result(name: &str, vif: f64) -> VifResult {
VifResult {
variable: name.to_string(),
vif,
rsquared: if vif.is_finite() { 1.0 - 1.0 / vif } else { 1.0 },
interpretation: "Test".to_string(),
}
}
#[test]
fn test_vif_ranking_basic() {
let vif_results = vec![
create_vif_result("X1", 2.5),
create_vif_result("X2", 8.0),
create_vif_result("X3", 1.2),
];
let ranking = vif_ranking(&vif_results);
assert_eq!(ranking.variable_names, vec!["X1", "X2", "X3"]);
assert_eq!(ranking.vif_values, vec![2.5, 8.0, 1.2]);
let ranked = ranking.ranking();
assert_eq!(ranked[0].0, "X3"); assert_eq!(ranked[1].0, "X1"); assert_eq!(ranked[2].0, "X2"); }
#[test]
fn test_vif_importance_scores() {
let vif_results = vec![
create_vif_result("X1", 1.0),
create_vif_result("X2", 5.0),
create_vif_result("X3", 10.0),
];
let (names, scores) = vif_importance_scores(&vif_results);
assert_eq!(names, vec!["X1", "X2", "X3"]);
assert_eq!(scores[0], 1.0); assert_eq!(scores[1], 0.2); assert_eq!(scores[2], 0.1); }
#[test]
fn test_vif_ranking_with_high_vif() {
let vif_results = vec![
create_vif_result("X1", 1.5),
create_vif_result("X2", 15.0), create_vif_result("X3", 3.0),
];
let ranking = vif_ranking(&vif_results);
let ranked = ranking.ranking();
assert_eq!(ranked[0], ("X1".to_string(), 1.5));
assert_eq!(ranked[2], ("X2".to_string(), 15.0));
}
#[test]
fn test_vif_empty() {
let vif_results = vec![];
let ranking = vif_ranking(&vif_results);
assert!(ranking.variable_names.is_empty());
assert!(ranking.vif_values.is_empty());
assert!(ranking.ranking().is_empty());
}
}