コード例 #1
0
 public TestIntegral(Func <double, double> f, Interval r, double I)
 {
     this.Integrand = f;
     this.Range     = r;
     this.Result    = I;
 }
コード例 #2
0
        public void DistributionProbabilityIntegral()
        {
            Random rng = new Random(1);

            // if integral is very small, we still want to get it very accurately
            IntegrationSettings settings = new IntegrationSettings()
            {
                AbsolutePrecision = 0.0
            };

            foreach (ContinuousDistribution distribution in distributions)
            {
                for (int i = 0; i < 4; i++)
                {
                    double x;
                    if (Double.IsNegativeInfinity(distribution.Support.LeftEndpoint) && Double.IsPositiveInfinity(distribution.Support.RightEndpoint))
                    {
                        // pick an exponentially distributed random point with a random sign
                        double y = rng.NextDouble();
                        x = -Math.Log(y);
                        if (rng.NextDouble() < 0.5)
                        {
                            x = -x;
                        }
                    }
                    else if (Double.IsPositiveInfinity(distribution.Support.RightEndpoint))
                    {
                        // pick an exponentially distributed random point
                        double y = rng.NextDouble();
                        x = distribution.Support.LeftEndpoint - Math.Log(y);
                    }
                    else
                    {
                        // pick a random point within the support
                        x = distribution.Support.LeftEndpoint + rng.NextDouble() * distribution.Support.Width;
                    }
                    double P = FunctionMath.Integrate(distribution.ProbabilityDensity, Interval.FromEndpoints(distribution.Support.LeftEndpoint, x), settings).Value;
                    double Q = FunctionMath.Integrate(distribution.ProbabilityDensity, Interval.FromEndpoints(x, distribution.Support.RightEndpoint), settings).Value;
                    if (!TestUtilities.IsNearlyEqual(P + Q, 1.0))
                    {
                        // the numerical integral for the triangular distribution can be inaccurate, because
                        // its locally low-polynomial behavior fools the integration routine into thinking it need
                        // not integrate as much near the inflection point as it must; this is a problem
                        // of the integration routine (or arguably the integral), not the triangular distribution,
                        // so skip it here
                        continue;
                    }

                    Assert.IsTrue(TestUtilities.IsNearlyEqual(P, distribution.LeftProbability(x)));
                    Assert.IsTrue(TestUtilities.IsNearlyEqual(Q, distribution.RightProbability(x)));
                }
            }
        }
コード例 #3
0
 public static ContinuousDistribution[] GetDistributions()
 {
     return(new ContinuousDistribution[] {
         new CauchyDistribution(1.0, 2.0),
         new UniformDistribution(Interval.FromEndpoints(-2.0, 1.0)), new UniformDistribution(Interval.FromEndpoints(7.0, 9.0)),
         new NormalDistribution(3.0, 2.0),
         new ExponentialDistribution(2.0),
         new ChiSquaredDistribution(3),
         new StudentDistribution(5),
         new LognormalDistribution(0.2, 0.4),
         new WeibullDistribution(2.0, 3.0),
         new LogisticDistribution(-4.0, 5.0),
         new FisherDistribution(4.0, 7.0),
         new KuiperDistribution(),
         new KolmogorovDistribution(),
         new TriangularDistribution(1.0, 2.0, 4.0),
         new BetaDistribution(0.5, 2.0),
         new ParetoDistribution(1.0, 3.0),
         new WaldDistribution(3.0, 1.0),
         new PearsonRDistribution(7),
         new GammaDistribution(0.8), new GammaDistribution(3.0, 5.0), new GammaDistribution(96.2),
         new GumbelDistribution(1.2, 2.3)
     });
 }
コード例 #4
0
        // We see a reliabile failure of KS or Kuiper tests for Beta distribution with small parameters, e.g. Beta(0.01,0.01).
        // This appears to occur whether we use inverse CDF or x/(x+y) to generate beta deviates.
        // Perhaps it indicates a problem with P computation for beta in this region?

        private static List <ContinuousDistribution> CreateDistributions()
        {
            List <ContinuousDistribution> distributions = new List <ContinuousDistribution>(new ContinuousDistribution[] {
                new NoncentralChiSquaredDistribution(2, 3.0),
                new CauchyDistribution(1.0, 2.0),
                new UniformDistribution(Interval.FromEndpoints(-2.0, 1.0)), new UniformDistribution(Interval.FromEndpoints(7.0, 9.0)),
                new NormalDistribution(3.0, 2.0),
                new ExponentialDistribution(2.0),
                new ChiSquaredDistribution(3),
                new StudentDistribution(5),
                new LognormalDistribution(0.2, 0.4),
                new WeibullDistribution(2.0, 3.0),
                new LogisticDistribution(-4.0, 5.0),
                new FisherDistribution(4.0, 7.0),
                new KuiperDistribution(),
                new KolmogorovDistribution(),
                new TriangularDistribution(1.0, 2.0, 4.0),
                new BetaDistribution(0.5, 2.0),
                new ParetoDistribution(1.0, 3.0),
                new WaldDistribution(3.0, 1.0),
                new PearsonRDistribution(7),
                new GammaDistribution(0.8), new GammaDistribution(3.0, 5.0), new GammaDistribution(96.2),
                new GumbelDistribution(1.2, 2.3),
                new LaplaceDistribution(4.5, 6.0),
                new ChiDistribution(1), new ChiDistribution(4),
                new RayleighDistribution(3.0),
                new FrechetDistribution(2.9, 4.0)
            });

            // Add some distributions that come from tests.
            Sample small = TestUtilities.CreateSample(distributions[0], 7);
            Sample large = TestUtilities.CreateSample(distributions[1], 127);

            distributions.Add(small.KolmogorovSmirnovTest(distributions[2]).Statistic.Distribution);
            distributions.Add(large.KolmogorovSmirnovTest(distributions[3]).Statistic.Distribution);
            //distributions.Add(small.KuiperTest(distributions[4]).Distribution);
            //distributions.Add(large.KuiperTest(distributions[5]).Distribution);
            //distributions.Add(Sample.MannWhitneyTest(small, large).Distribution);

            BivariateSample two = new BivariateSample();

            two.Add(new double[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }, new double[] { 6.0, 5.0, 4.0, 3.0, 2.0, 1.0 });
            //distributions.Add(two.SpearmanRhoTest().Distribution);
            //distributions.Add(two.KendallTauTest().Distribution);

            return(distributions);
        }