public void FisherFromChiSquared() { // we will need a RNG Random rng = new Random(314159); int n1 = 1; int n2 = 2; // define chi squared distributions ContinuousDistribution d1 = new ChiSquaredDistribution(n1); ContinuousDistribution d2 = new ChiSquaredDistribution(n2); // create a sample of chi-squared variates Sample s = new Sample(); for (int i = 0; i < 250; i++) { double x1 = d1.GetRandomValue(rng); double x2 = d2.GetRandomValue(rng); double x = (x1 / n1) / (x2 / n2); s.Add(x); } // it should match a Fisher distribution with the appropriate parameters ContinuousDistribution f0 = new FisherDistribution(n1, n2); TestResult t0 = s.KuiperTest(f0); Assert.IsTrue(t0.Probability > 0.05); // it should be distinguished from a Fisher distribution with different parameters ContinuousDistribution f1 = new FisherDistribution(n1 + 1, n2); TestResult t1 = s.KuiperTest(f1); Assert.IsTrue(t1.Probability < 0.05); }
public void AnovaDistribution() { Distribution sDistribution = new NormalDistribution(); Random rng = new Random(1); Sample fSample = new Sample(); // do 100 ANOVAs for (int t = 0; t < 100; t++) { // each ANOVA has 4 groups List<Sample> groups = new List<Sample>(); for (int g = 0; g < 4; g++) { // each group has 3 data points Sample group = new Sample(); for (int i = 0; i < 3; i++) { group.Add(sDistribution.GetRandomValue(rng)); } groups.Add(group); } OneWayAnovaResult result = Sample.OneWayAnovaTest(groups); fSample.Add(result.Factor.Result.Statistic); } // compare the distribution of F statistics to the expected distribution Distribution fDistribution = new FisherDistribution(3, 8); Console.WriteLine("m={0} s={1}", fSample.PopulationMean, fSample.PopulationStandardDeviation); TestResult kResult = fSample.KolmogorovSmirnovTest(fDistribution); Console.WriteLine(kResult.LeftProbability); Assert.IsTrue(kResult.LeftProbability < 0.95); }
public void BivariateLinearRegressionGoodnessOfFitDistribution() { // create uncorrelated x and y values // the distribution of F-test statistics returned by linear fits should follow the expected F-distribution Random rng = new Random(987654321); NormalDistribution xd = new NormalDistribution(1.0, 2.0); NormalDistribution yd = new NormalDistribution(-3.0, 4.0); Sample fs = new Sample(); for (int i = 0; i < 127; i++) { BivariateSample xys = new BivariateSample(); for (int j = 0; j < 7; j++) { xys.Add(xd.GetRandomValue(rng), yd.GetRandomValue(rng)); } double f = xys.LinearRegression().GoodnessOfFit.Statistic; fs.Add(f); } Distribution fd = new FisherDistribution(1, 5); Console.WriteLine("{0} v. {1}", fs.PopulationMean, fd.Mean); TestResult t = fs.KolmogorovSmirnovTest(fd); Console.WriteLine(t.LeftProbability); Assert.IsTrue(t.LeftProbability < 0.95); }
public void BivariateLinearRegressionNullDistribution() { // create uncorrelated x and y values // the distribution of F-test statistics returned by linear fits should follow the expected F-distribution Random rng = new Random(987654321); NormalDistribution xd = new NormalDistribution(1.0, 2.0); NormalDistribution yd = new NormalDistribution(-3.0, 4.0); Sample fs = new Sample(); Sample rSample = new Sample(); ContinuousDistribution rDistribution = null; Sample fSample = new Sample(); ContinuousDistribution fDistribution = null; for (int i = 0; i < 127; i++) { BivariateSample sample = new BivariateSample(); for (int j = 0; j < 7; j++) { sample.Add(xd.GetRandomValue(rng), yd.GetRandomValue(rng)); } LinearRegressionResult result = sample.LinearRegression(); double f = result.F.Statistic; fs.Add(f); rSample.Add(result.R.Statistic); rDistribution = result.R.Distribution; fSample.Add(result.F.Statistic); fDistribution = result.F.Distribution; Assert.IsTrue(result.F.Statistic == result.Anova.Result.Statistic); Assert.IsTrue(TestUtilities.IsNearlyEqual( result.R.Probability, result.F.Probability, new EvaluationSettings() { RelativePrecision = 1.0E-14, AbsolutePrecision = 1.0E-16 } )); } ContinuousDistribution fd = new FisherDistribution(1, 5); Console.WriteLine("{0} v. {1}", fs.PopulationMean, fd.Mean); TestResult t = fs.KolmogorovSmirnovTest(fd); Console.WriteLine(t.LeftProbability); Assert.IsTrue(t.LeftProbability < 0.95); Assert.IsTrue(rSample.KuiperTest(rDistribution).Probability > 0.05); Assert.IsTrue(fSample.KuiperTest(fDistribution).Probability > 0.05); }
public void Bug5886() { // the inverse CDF of the F-distribution would fail for d2 <= 2 double d1 = 1.0; double d2 = 0.1; FisherDistribution F = new FisherDistribution(d1, d2); double x1 = F.InverseLeftProbability(0.6); Console.WriteLine(x1); double P = F.LeftProbability(x1); Console.WriteLine(P); }
public void FisherInversion() { // x ~ Fisher(a,b) => 1/x ~ Fisher(b,a) FisherDistribution f = new FisherDistribution(2.3, 5.6); FisherDistribution fi = new FisherDistribution(f.DenominatorDegreesOfFreedom, f.NumeratorDegreesOfFreedom); Random rng = new Random(1); for (int i = 0; i < 10; i++) { double x = f.GetRandomValue(rng); double xi = 1.0 / x; // LeftProbability <-> RightProbability because as x increases, 1/x decreases Assert.IsTrue(TestUtilities.IsNearlyEqual(f.LeftProbability(x), fi.RightProbability(xi))); } }
public void FisherTest() { // we will need a RNG Random rng = new Random(314159); int n1 = 1; int n2 = 2; // define chi squared distributions Distribution d1 = new ChiSquaredDistribution(n1); Distribution d2 = new ChiSquaredDistribution(n2); // create a sample of chi-squared variates Sample s = new Sample(); for (int i = 0; i < 250; i++) { double x1 = d1.InverseLeftProbability(rng.NextDouble()); double x2 = d2.InverseLeftProbability(rng.NextDouble()); double x = (x1/n1) / (x2/n2); s.Add(x); } // it should match a Fisher distribution with the appropriate parameters Distribution f0 = new FisherDistribution(n1, n2); TestResult t0 = s.KuiperTest(f0); Console.WriteLine(t0.LeftProbability); Assert.IsTrue(t0.LeftProbability < 0.95); // it should be distinguished from a Fisher distribution with different parameters Distribution f1 = new FisherDistribution(n1 + 1, n2); TestResult t1 = s.KuiperTest(f1); Console.WriteLine(t1.LeftProbability); Assert.IsTrue(t1.LeftProbability > 0.95); }
// the internal linear regression routine, which assumes inputs are entirely valid private FitResult LinearRegression_Internal(int outputIndex) { // to do a fit, we need more data than parameters if (Count < Dimension) { throw new InsufficientDataException(); } // construct the design matrix SymmetricMatrix D = new SymmetricMatrix(Dimension); for (int i = 0; i < Dimension; i++) { for (int j = 0; j <= i; j++) { if (i == outputIndex) { if (j == outputIndex) { D[i, j] = Count; } else { D[i, j] = storage[j].Mean * Count; } } else { if (j == outputIndex) { D[i, j] = storage[i].Mean * Count; } else { double Dij = 0.0; for (int k = 0; k < Count; k++) { Dij += storage[i][k] * storage[j][k]; } D[i, j] = Dij; } } } } // construct the right hand side ColumnVector b = new ColumnVector(Dimension); for (int i = 0; i < Dimension; i++) { if (i == outputIndex) { b[i] = storage[i].Mean * Count; } else { double bi = 0.0; for (int k = 0; k < Count; k++) { bi += storage[outputIndex][k] * storage[i][k]; } b[i] = bi; } } // solve the system for the linear model parameters CholeskyDecomposition CD = D.CholeskyDecomposition(); ColumnVector parameters = CD.Solve(b); // find total sum of squares, with dof = # points - 1 (minus one for the variance-minimizing mean) double totalSumOfSquares = storage[outputIndex].Variance * Count; // find remaining unexplained sum of squares, with dof = # points - # parameters double unexplainedSumOfSquares = 0.0; for (int r = 0; r < Count; r++) { double y = 0.0; for (int c = 0; c < Dimension; c++) { if (c == outputIndex) { y += parameters[c]; } else { y += parameters[c] * storage[c][r]; } } unexplainedSumOfSquares += MoreMath.Sqr(y - storage[outputIndex][r]); } int unexplainedDegreesOfFreedom = Count - Dimension; double unexplainedVariance = unexplainedSumOfSquares / unexplainedDegreesOfFreedom; // find explained sum of squares, with dof = # parameters - 1 double explainedSumOfSquares = totalSumOfSquares - unexplainedSumOfSquares; int explainedDegreesOfFreedom = Dimension - 1; double explainedVariance = explainedSumOfSquares / explainedDegreesOfFreedom; // compute F statistic from sums of squares double F = explainedVariance / unexplainedVariance; Distribution fDistribution = new FisherDistribution(explainedDegreesOfFreedom, unexplainedDegreesOfFreedom); SymmetricMatrix covariance = unexplainedVariance * CD.Inverse(); return(new FitResult(parameters, covariance, new TestResult("F", F, TestType.RightTailed, fDistribution))); }