/// <summary> /// Computes the Pearson product-moment correlation coefficient. /// </summary> /// <param name="dataA">Sample data A.</param> /// <param name="dataB">Sample data B.</param> /// <returns>The Pearson product-moment correlation coefficient.</returns> public static double Pearson(IEnumerable<double> dataA, IEnumerable<double> dataB) { int n = 0; double r = 0.0; double meanA = dataA.Mean(); double meanB = dataB.Mean(); double sdevA = dataA.StandardDeviation(); double sdevB = dataB.StandardDeviation(); IEnumerator<double> ieA = dataA.GetEnumerator(); IEnumerator<double> ieB = dataB.GetEnumerator(); while (ieA.MoveNext()) { if (ieB.MoveNext() == false) { throw new ArgumentOutOfRangeException("Datasets dataA and dataB need to have the same length."); } n++; r += (ieA.Current - meanA) * (ieB.Current - meanB) / (sdevA * sdevB); } if (ieB.MoveNext() == true) { throw new ArgumentOutOfRangeException("Datasets dataA and dataB need to have the same length."); } return r / (n - 1); }
/// <summary> /// Computes the Pearson product-moment correlation coefficient. /// </summary> /// <param name="dataA">Sample data A.</param> /// <param name="dataB">Sample data B.</param> /// <returns>The Pearson product-moment correlation coefficient.</returns> public static double Pearson(IEnumerable<double> dataA, IEnumerable<double> dataB) { int n = 0; double r = 0.0; // BUG: PERFORMANCE degraded due to tripple iteration over both IEnumerables double meanA = dataA.Mean(); double meanB = dataB.Mean(); double sdevA = dataA.StandardDeviation(); double sdevB = dataB.StandardDeviation(); using (IEnumerator<double> ieA = dataA.GetEnumerator()) using (IEnumerator<double> ieB = dataB.GetEnumerator()) { while (ieA.MoveNext()) { if (!ieB.MoveNext()) { throw new ArgumentOutOfRangeException("dataB", "Datasets dataA and dataB need to have the same length. dataB is shorter."); } n++; r += (ieA.Current - meanA) * (ieB.Current - meanB) / (sdevA * sdevB); } if (ieB.MoveNext()) { throw new ArgumentOutOfRangeException("dataA", "Datasets dataA and dataB need to have the same length. dataA is shorter."); } } return r / (n - 1); }
public MeanStandardDeviation(IEnumerable<double> values) { this.Mean = values.Mean(); this.StdDev = values.StandardDeviation(); this.Count = values.Count(); }