diff --git a/src/distribution/empirical.rs b/src/distribution/empirical.rs index 6075a454..b95c194c 100644 --- a/src/distribution/empirical.rs +++ b/src/distribution/empirical.rs @@ -243,7 +243,8 @@ impl Distribution for Empirical { } fn variance(&self) -> Option { - if self.data.is_empty() { + // The `n - 1` denominator is zero for a single sample, so the sample variance is undefined. + if self.sum < 2 { None } else { Some(self.var / (self.sum as f64 - 1.)) @@ -345,6 +346,12 @@ mod tests { let dist = Empirical::from_iter(vec![]); assert!(dist.variance().is_none()); + // A single sample has no `n - 1` denominator; the sample variance is undefined. + let one = Empirical::from_iter(vec![4.0]); + assert!(one.variance().is_none()); + assert!(one.std_dev().is_none()); + test_var_for_samples(2.0, vec![1.0, 3.0]); + test_var_for_samples(0.0, vec![4.0; 100]); test_var_for_samples(0.0, vec![-0.2; 100]); test_var_for_samples(190.36666666666667, vec![21.3, 38.4, 12.7, 41.6]);