diff --git a/src/Numerics.Tests/GoodnessOfFit/RSquaredTest.cs b/src/Numerics.Tests/GoodnessOfFit/RSquaredTest.cs
index 19660cf3..6cec573c 100644
--- a/src/Numerics.Tests/GoodnessOfFit/RSquaredTest.cs
+++ b/src/Numerics.Tests/GoodnessOfFit/RSquaredTest.cs
@@ -51,6 +51,55 @@ namespace MathNet.Numerics.UnitTests.GoodnessOfFit
Assert.That(Numerics.GoodnessOfFit.RSquared(data, data), Is.EqualTo(1));
}
+ ///
+ /// Test the R-squared value of values with itself
+ ///
+ [Test]
+ public void CoefficentOfDetermination_OfDataWithItself_EqualsOne()
+ {
+ var data = Generate.LinearRange(1, 100);
+ AssertHelpers.AlmostEqual(Numerics.GoodnessOfFit.CoefficientOfDetermination(data, data), 1.0, 14);
+ }
+
+ ///
+ /// Test the R-squared value of values with correlated values
+ ///
+ [Test]
+ public void CoefficentOfDetermination_OfCorrelatedData_DoesNotEqualOne()
+ {
+ // parameters
+ int n = 100;
+ int offset = 1;
+
+ // actual values and comparison
+ var data = Generate.LinearRange(1, n);
+ var model = Generate.LinearRange(1+offset, n+offset);
+ double R2Calc = Numerics.GoodnessOfFit.CoefficientOfDetermination(model, data);
+ Assert.That(R2Calc, Is.Not.EqualTo(1));
+ }
+
+ ///
+ /// Test the R-squared value of values with correlated values
+ ///
+ [Test]
+ public void CoefficentOfDetermination_OfCorrelatedData_KnownOutput()
+ {
+ // parameters
+ int n = 100;
+ int offset = 1;
+
+ // theoretical values
+ double ssTot = (n*(n-1)*(n+1))/12.0;
+ double ssRes = n*offset*offset;
+ double R2 = 1-ssRes/ssTot;
+
+ // actual values and comparison
+ var data = Generate.LinearRange(1, n);
+ var model = Generate.LinearRange(1+offset, n+offset);
+ double R2Calc = Numerics.GoodnessOfFit.CoefficientOfDetermination(model, data);
+ AssertHelpers.AlmostEqual(R2Calc, R2, 14);
+ }
+
[Test]
public void WhenGivenTwoDatasetsOfDifferentSizeThenThrowsArgumentException()
{