Shared Rust kernels
ported/paired_stats_common
All modules · quoted at commit 9e1884369a67 of DnaCalc/DnaCalc. Comments are the source's own.
means · 10 lines · calc-func/src/ported/paired_stats_common.rs on GitHubfn means(pairs: &[(f64, f64)]) -> Result<(f64, f64), WorksheetErrorCode> {
if pairs.is_empty() {
return Err(WorksheetErrorCode::Div0);
}
let (sum_x, sum_y) = pairs
.iter()
.fold((0.0, 0.0), |(ax, ay), (x, y)| (ax + x, ay + y));
let n = pairs.len() as f64;
Ok((sum_x / n, sum_y / n))
}
Used by 8 functions.
covariance_from_pairs · 22 lines · calc-func/src/ported/paired_stats_common.rs on GitHubpub fn covariance_from_pairs(
pairs: &[(f64, f64)],
divisor: CovarianceDivisor,
) -> Result<f64, WorksheetErrorCode> {
if pairs.is_empty() {
return Err(WorksheetErrorCode::Div0);
}
if matches!(divisor, CovarianceDivisor::Sample) && pairs.len() < 2 {
return Err(WorksheetErrorCode::Div0);
}
let (mean_x, mean_y) = means(pairs)?;
let sum = pairs
.iter()
.map(|(x, y)| (x - mean_x) * (y - mean_y))
.sum::<f64>();
let denom = match divisor {
CovarianceDivisor::Population => pairs.len() as f64,
CovarianceDivisor::Sample => (pairs.len() - 1) as f64,
};
Ok(sum / denom)
}
Used by 3 functions.
correlation_from_pairs · 24 lines · calc-func/src/ported/paired_stats_common.rs on GitHubpub fn correlation_from_pairs(pairs: &[(f64, f64)]) -> Result<f64, WorksheetErrorCode> {
if pairs.len() < 2 {
return Err(WorksheetErrorCode::Div0);
}
let (mean_x, mean_y) = means(pairs)?;
let mut sum_xy = 0.0;
let mut sum_x2 = 0.0;
let mut sum_y2 = 0.0;
for (x, y) in pairs {
let dx = *x - mean_x;
let dy = *y - mean_y;
sum_xy += dx * dy;
sum_x2 += dx * dx;
sum_y2 += dy * dy;
}
if sum_x2 == 0.0 || sum_y2 == 0.0 {
return Err(WorksheetErrorCode::Div0);
}
let denom = (pairs.len() - 1) as f64;
let covariance = sum_xy / denom;
let variance_x = sum_x2 / denom;
let variance_y = sum_y2 / denom;
Ok(covariance / (variance_x.sqrt() * variance_y.sqrt()))
}
Used by 3 functions.
slope_from_pairs · 17 lines · calc-func/src/ported/paired_stats_common.rs on GitHubpub fn slope_from_pairs(pairs: &[(f64, f64)]) -> Result<f64, WorksheetErrorCode> {
if pairs.len() < 2 {
return Err(WorksheetErrorCode::Div0);
}
let (mean_x, mean_y) = means(pairs)?;
let mut sum_xy = 0.0;
let mut sum_x2 = 0.0;
for (x, y) in pairs {
let dx = *x - mean_x;
sum_xy += dx * (*y - mean_y);
sum_x2 += dx * dx;
}
if sum_x2 == 0.0 {
return Err(WorksheetErrorCode::Div0);
}
Ok(sum_xy / sum_x2)
}
Used by 2 functions.