diff --git a/examples/correlation.rs b/examples/correlation.rs new file mode 100644 index 0000000..b873e0a --- /dev/null +++ b/examples/correlation.rs @@ -0,0 +1,45 @@ +use rustframe::compute::stats::{covariance, covariance_matrix, pearson}; +use rustframe::matrix::{Axis, Matrix}; + +/// Demonstrates covariance and correlation utilities. +fn main() { + pairwise_cov(); + println!("\n-----\n"); + matrix_cov(); +} + +fn pairwise_cov() { + println!("Covariance & Pearson r\n----------------------"); + let x = Matrix::from_vec(vec![1.0, 2.0, 3.0, 4.0], 2, 2); + let y = Matrix::from_vec(vec![1.0, 2.0, 3.0, 5.0], 2, 2); + println!("covariance : {:.2}", covariance(&x, &y)); + println!("pearson r : {:.3}", pearson(&x, &y)); +} + +fn matrix_cov() { + println!("Covariance matrix\n-----------------"); + let data = Matrix::from_rows_vec(vec![1.0, 2.0, 3.0, 4.0], 2, 2); + let cov = covariance_matrix(&data, Axis::Col); + println!("cov matrix : {:?}", cov.data()); +} + +#[cfg(test)] +mod tests { + use super::*; + const EPS: f64 = 1e-8; + + #[test] + fn test_pairwise_cov() { + let x = Matrix::from_vec(vec![1.0, 2.0, 3.0, 4.0], 2, 2); + let y = Matrix::from_vec(vec![1.0, 2.0, 3.0, 5.0], 2, 2); + assert!((covariance(&x, &y) - 1.625).abs() < EPS); + assert!((pearson(&x, &y) - 0.9827076298239908).abs() < 1e-5,); + } + + #[test] + fn test_matrix_cov() { + let data = Matrix::from_rows_vec(vec![1.0, 2.0, 3.0, 4.0], 2, 2); + let cov = covariance_matrix(&data, Axis::Col); + assert_eq!(cov.data(), &[2.0, 2.0, 2.0, 2.0]); + } +}