diff --git a/src/Numerics/GoodnessOfFit/RSquared.cs b/src/Numerics/GoodnessOfFit.cs similarity index 53% rename from src/Numerics/GoodnessOfFit/RSquared.cs rename to src/Numerics/GoodnessOfFit.cs index 251eff31..1908d8ec 100644 --- a/src/Numerics/GoodnessOfFit/RSquared.cs +++ b/src/Numerics/GoodnessOfFit.cs @@ -1,4 +1,4 @@ -// +// // Math.NET Numerics, part of the Math.NET Project // http://numerics.mathdotnet.com // http://github.com/mathnet/mathnet-numerics @@ -26,13 +26,12 @@ // OTHER DEALINGS IN THE SOFTWARE. // -using System; using System.Collections.Generic; -using System.Linq; +using MathNet.Numerics.Statistics; -namespace MathNet.Numerics.GoodnessOfFit +namespace MathNet.Numerics { - public static class RSquared + public static class GoodnessOfFit { /// /// Calculated the R-Squared value given modelled and observed values @@ -40,32 +39,10 @@ namespace MathNet.Numerics.GoodnessOfFit /// The values expected from the modelled /// The actual data set values obtained /// - public static double RSqr(IEnumerable modelledValues, IEnumerable observedValues) + public static double RSquared(IEnumerable modelledValues, IEnumerable observedValues) { - var modelledData = modelledValues as double[] ?? modelledValues.ToArray(); - var observedData = observedValues as double[] ?? observedValues.ToArray(); - var observedDataCount = observedData.Count(); - if ( modelledData.Count() != observedDataCount) - { - throw new ArgumentException("Dataset length mismatch"); - } - - var observedSum = observedData.Sum(); - var modelledSum = modelledData.Sum(); - - var sumObservedByModelled = 0d; - - for (var itemIndex = 0; itemIndex < observedDataCount; itemIndex++) - { - sumObservedByModelled += (observedData[itemIndex] * modelledData[itemIndex]); - } - - var sumObservedSquared = observedData.Sum(item => item * item); - var sumModelledSquared = modelledData.Sum(item => item * item); - - return Math.Pow(( observedDataCount * sumObservedByModelled - observedSum * modelledSum ) / - Math.Sqrt((observedDataCount * sumObservedSquared - Math.Pow(observedSum, 2)) - * (observedDataCount * sumModelledSquared - Math.Pow(modelledSum, 2))), 2); + var corr = Correlation.Pearson(modelledValues, observedValues); + return corr * corr; } } } diff --git a/src/Numerics/Numerics.csproj b/src/Numerics/Numerics.csproj index ff06c46e..001ec730 100644 --- a/src/Numerics/Numerics.csproj +++ b/src/Numerics/Numerics.csproj @@ -87,7 +87,7 @@ - + diff --git a/src/UnitTests/GoodnessOfFit/RSquaredTest.cs b/src/UnitTests/GoodnessOfFit/RSquaredTest.cs index 33efb930..9dfe8a72 100644 --- a/src/UnitTests/GoodnessOfFit/RSquaredTest.cs +++ b/src/UnitTests/GoodnessOfFit/RSquaredTest.cs @@ -1,9 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using MathNet.Numerics.GoodnessOfFit; using NUnit.Framework; namespace MathNet.Numerics.UnitTests.GoodnessOfFit @@ -21,11 +17,11 @@ namespace MathNet.Numerics.UnitTests.GoodnessOfFit for (int i = 1; i <= 10; i++) data.Add(i); - Assert.That(RSquared.RSqr(data, data), Is.EqualTo(1)); + Assert.That(Numerics.GoodnessOfFit.RSquared(data, data), Is.EqualTo(1)); } [Test] - [ExpectedException(typeof(ArgumentException))] + [ExpectedException(typeof(ArgumentOutOfRangeException))] public void WhenGivenTwoDatasetsOfDifferentSizeThenThrowsArgumentException() { var observedData = new List() @@ -49,7 +45,7 @@ namespace MathNet.Numerics.UnitTests.GoodnessOfFit ,10 }; - RSquared.RSqr(modelledData, observedData); + Numerics.GoodnessOfFit.RSquared(modelledData, observedData); Assert.Fail("Expected ArgumentException exception wasn't thrown"); } @@ -67,7 +63,7 @@ namespace MathNet.Numerics.UnitTests.GoodnessOfFit 2.6, 2.8, 3.1, 4.7, 5.1, 5.3 }; - Assert.That(Math.Round(RSquared.RSqr(modelledData, observedData), 11), Is.EqualTo(Math.Round(0.94878520708673d, 11))); + Assert.That(Math.Round(Numerics.GoodnessOfFit.RSquared(modelledData, observedData), 11), Is.EqualTo(Math.Round(0.94878520708673d, 11))); } } }