From 34016386eafbb87725bf0b489c74ac579f402e49 Mon Sep 17 00:00:00 2001 From: Jon Smit Date: Tue, 5 Jul 2016 22:08:44 +0200 Subject: [PATCH 1/3] UnitTest: checked whether some correlations are equal to 1. --- .../StatisticsTests/CorrelationTests.cs | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/UnitTests/StatisticsTests/CorrelationTests.cs b/src/UnitTests/StatisticsTests/CorrelationTests.cs index b2da9c84..94aa7b67 100644 --- a/src/UnitTests/StatisticsTests/CorrelationTests.cs +++ b/src/UnitTests/StatisticsTests/CorrelationTests.cs @@ -104,6 +104,35 @@ namespace MathNet.Numerics.UnitTests.StatisticsTests AssertHelpers.AlmostEqual(corr, corr2, 14); } + /// + /// Constant-weighted Pearson correlation test. + /// + [Test] + public void WeightedPearsonCorrelationEqualsOneTest() + { + int n = 5; + double maxWeight = 1e5; + var dataA = Generate.LinearRange(1, n); + var dataB = Generate.LinearRange(1, n); + var weights1 = Generate.LinearRange(1, n); + var weights2 = Generate.LogSpaced(n, 1, 5); + var weights3 = Generate.LogSpaced(n, 5, 1); + var weights4 = Generate.Repeat(n, maxWeight); + var weights5 = Generate.Repeat(n, 1/maxWeight); + + var corr1 = Correlation.WeightedPearson(dataA, dataB, weights1); + var corr2 = Correlation.WeightedPearson(dataA, dataB, weights2); + var corr3 = Correlation.WeightedPearson(dataA, dataB, weights3); + var corr4 = Correlation.WeightedPearson(dataA, dataB, weights4); + var corr5 = Correlation.WeightedPearson(dataA, dataB, weights5); + + AssertHelpers.AlmostEqual(corr1, 1, 14); + AssertHelpers.AlmostEqual(corr2, 1, 14); + AssertHelpers.AlmostEqual(corr3, 1, 14); + AssertHelpers.AlmostEqual(corr4, 1, 14); + AssertHelpers.AlmostEqual(corr5, 1, 14); + } + /// /// Pearson correlation test fail. /// From 2c83a519b8474c95a496b603ff548846877d7d12 Mon Sep 17 00:00:00 2001 From: Jon Smit Date: Tue, 28 Jun 2016 16:37:12 +0200 Subject: [PATCH 2/3] Statistics: Fixed incorrect formula in WeightedPearson that could cause the correlation to be greater than 1. --- src/Numerics/Statistics/Correlation.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Numerics/Statistics/Correlation.cs b/src/Numerics/Statistics/Correlation.cs index e2646a2b..fb096fa7 100644 --- a/src/Numerics/Statistics/Correlation.cs +++ b/src/Numerics/Statistics/Correlation.cs @@ -146,9 +146,8 @@ namespace MathNet.Numerics.Statistics meanB += rY; varB += sumWeight*deltaY*rY; + covariance += deltaX*deltaY*wi*(sumWeight/temp); sumWeight = temp; - - covariance += deltaX*deltaY*(n - 1)*wi/n; } if (ieB.MoveNext()) { From 2442a96ffd93498366a9ee4678f9eb01e17ef6cd Mon Sep 17 00:00:00 2001 From: Jon Smit Date: Tue, 5 Jul 2016 22:28:47 +0200 Subject: [PATCH 3/3] Corrected comments. --- src/UnitTests/StatisticsTests/CorrelationTests.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/UnitTests/StatisticsTests/CorrelationTests.cs b/src/UnitTests/StatisticsTests/CorrelationTests.cs index 94aa7b67..7afd9c43 100644 --- a/src/UnitTests/StatisticsTests/CorrelationTests.cs +++ b/src/UnitTests/StatisticsTests/CorrelationTests.cs @@ -105,7 +105,8 @@ namespace MathNet.Numerics.UnitTests.StatisticsTests } /// - /// Constant-weighted Pearson correlation test. + /// Correlation between two identical data sets should always equal one, + /// regardless of the weights used. /// [Test] public void WeightedPearsonCorrelationEqualsOneTest()