Ejemplo n.º 1
0
        public void QuantileEstimator_AllEqualTest()
        {
            double middle = 3.4;
            double next   = MMath.NextDouble(middle);

            double[] x     = { middle, middle, middle };
            var      outer = new OuterQuantiles(x);

            Assert.Equal(0.0, outer.GetProbLessThan(middle));
            Assert.Equal(middle, outer.GetQuantile(0.0));
            Assert.Equal(middle, outer.GetQuantile(0.75));
            Assert.Equal(1.0, outer.GetProbLessThan(next));
            Assert.Equal(next, outer.GetQuantile(1.0));
            foreach (int weight in new[] { 1, 2, 3 })
            {
                var est = new QuantileEstimator(0.01);
                foreach (var item in x)
                {
                    est.Add(item, weight);
                }
                Assert.Equal(0.0, est.GetProbLessThan(middle));
                Assert.Equal(middle, est.GetQuantile(0.0));
                Assert.Equal(1.0, est.GetProbLessThan(next));
                Assert.Equal(next, est.GetQuantile(1.0));
            }
        }
Ejemplo n.º 2
0
        public void QuantileEstimator_DoubleDuplicationTest()
        {
            double first   = 1;
            double second  = 2;
            double between = (first + second) / 2;
            double next    = MMath.NextDouble(second);

            double[] x = { first, first, second, second };
            // quantiles are 0, 1/3, 2/3, 1
            var outer = new OuterQuantiles(x);

            Assert.Equal(0.0, outer.GetProbLessThan(first));
            Assert.Equal(first, outer.GetQuantile(0.0));
            Assert.Equal(0.5, outer.GetProbLessThan(between));
            Assert.Equal(between, outer.GetQuantile(0.5));
            Assert.Equal(2.0 / 3, outer.GetProbLessThan(second));
            Assert.Equal(second, outer.GetQuantile(2.0 / 3));
            Assert.Equal(1.0, outer.GetProbLessThan(next));
            Assert.Equal(next, outer.GetQuantile(1.0));
            CheckGetQuantile(outer, outer);
            var inner = InnerQuantiles.FromDistribution(5, outer);

            CheckGetQuantile(inner, inner, (int)Math.Ceiling(100.0 / 6), (int)Math.Floor(100.0 * 5 / 6));
            var est = new QuantileEstimator(0.01);

            est.Add(first, 2);
            est.Add(second, 2);
            Assert.Equal(0.0, est.GetProbLessThan(first));
            Assert.Equal(first, est.GetQuantile(0.0));
            Assert.Equal(0.5, est.GetProbLessThan(between));
            Assert.Equal(second, est.GetQuantile(2.0 / 3));
            Assert.Equal(1.0, est.GetProbLessThan(next));
            Assert.Equal(next, est.GetQuantile(1.0));
            CheckGetQuantile(est, est);
        }
Ejemplo n.º 3
0
        public void QuantileEstimator_DuplicationTest()
        {
            double middle = 3.4;

            double[] x     = { 1.2, middle, middle, middle, 5.6 };
            var      outer = new OuterQuantiles(x);

            Assert.Equal(0.25, outer.GetProbLessThan(middle));
            Assert.Equal(outer.GetQuantile(0.3), middle);
            Assert.Equal(outer.GetQuantile(0.5), middle);
            Assert.Equal(outer.GetQuantile(0.7), middle);
            CheckGetQuantile(outer, outer);
            var inner = InnerQuantiles.FromDistribution(7, outer);

            Assert.Equal(0.25, inner.GetProbLessThan(middle));
            Assert.Equal(outer.GetQuantile(0.3), middle);
            Assert.Equal(outer.GetQuantile(0.5), middle);
            Assert.Equal(outer.GetQuantile(0.7), middle);
            CheckGetQuantile(inner, inner, (int)Math.Ceiling(100.0 / 8), (int)Math.Floor(100.0 * 7 / 8));
            var est = new QuantileEstimator(0.01);

            est.AddRange(x);
            Assert.Equal(est.GetQuantile(0.3), middle);
            Assert.Equal(est.GetQuantile(0.5), middle);
            // InterpolationType==1 returns NextDouble(middle)
            Assert.Equal(est.GetQuantile(0.7), middle, 1e-15);
            CheckGetQuantile(est, est);
        }
Ejemplo n.º 4
0
        public void QuantileEstimator_DuplicationTest()
        {
            double middle = 3.4;

            double[] x     = { 1.2, middle, middle, middle, 5.6 };
            var      outer = new OuterQuantiles(x);

            Assert.Equal(0.25, outer.GetProbLessThan(middle));
            Assert.Equal(outer.GetQuantile(0.3), middle);
            Assert.Equal(outer.GetQuantile(0.5), middle);
            Assert.Equal(outer.GetQuantile(0.7), middle);
            CheckGetQuantile(outer, outer);
            var inner = new InnerQuantiles(7, outer);

            Assert.Equal(0.25, inner.GetProbLessThan(middle));
            Assert.Equal(outer.GetQuantile(0.3), middle);
            Assert.Equal(outer.GetQuantile(0.5), middle);
            Assert.Equal(outer.GetQuantile(0.7), middle);
            CheckGetQuantile(inner, inner, 100 / 8, 100 * 7 / 8);
            var est = new QuantileEstimator(0.01);

            est.AddRange(x);
            Assert.Equal(0.25, est.GetProbLessThan(middle));
            Assert.Equal(est.GetQuantile(0.3), middle);
            Assert.Equal(est.GetQuantile(0.5), middle);
            Assert.Equal(est.GetQuantile(0.7), middle);
            CheckGetQuantile(est, est);
        }
Ejemplo n.º 5
0
        public void QuantileTest()
        {
            // draw many samples from N(m,v)
            Rand.Restart(0);
            int           n      = 10000;
            double        m      = 2;
            double        stddev = 3;
            Gaussian      prior  = new Gaussian(m, stddev * stddev);
            List <double> x      = new List <double>();

            for (int i = 0; i < n; i++)
            {
                x.Add(prior.Sample());
            }
            x.Sort();
            var sortedData = new OuterQuantiles(x.ToArray());

            // compute quantiles
            var quantiles = InnerQuantiles.FromDistribution(100, sortedData);

            // loop over x's and compare true quantile rank
            var    testPoints = EpTests.linspace(MMath.Min(x) - stddev, MMath.Max(x) + stddev, 100);
            double maxError   = 0;

            foreach (var testPoint in testPoints)
            {
                var trueRank = MMath.NormalCdf((testPoint - m) / stddev);
                var estRank  = quantiles.GetProbLessThan(testPoint);
                var error    = System.Math.Abs(trueRank - estRank);
                //Trace.WriteLine($"{testPoint} trueRank={trueRank} estRank={estRank} error={error}");
                Assert.True(error < 0.02);
                maxError = System.Math.Max(maxError, error);

                double estQuantile = quantiles.GetQuantile(estRank);
                error = MMath.AbsDiff(estQuantile, testPoint, 1e-8);
                //Trace.WriteLine($"{testPoint} estRank={estRank} estQuantile={estQuantile} error={error}");
                Assert.True(error < 1e-8);

                estRank = sortedData.GetProbLessThan(testPoint);
                error   = System.Math.Abs(trueRank - estRank);
                //Trace.WriteLine($"{testPoint} trueRank={trueRank} estRank={estRank} error={error}");
                Assert.True(error < 0.02);
            }
            //Trace.WriteLine($"max rank error = {maxError}");
        }
Ejemplo n.º 6
0
        public void QuantileEstimator_SinglePointIsMedian()
        {
            QuantileEstimator est   = new QuantileEstimator(0.1);
            double            point = 2;

            est.Add(point);
            Assert.Equal(point, est.GetQuantile(0.5));
            Assert.Equal(0.0, est.GetProbLessThan(point));

            OuterQuantiles outer = new OuterQuantiles(new[] { point });

            Assert.Equal(point, outer.GetQuantile(0.5));
            Assert.Equal(0.0, outer.GetProbLessThan(point));

            InnerQuantiles inner = new InnerQuantiles(new[] { point });

            Assert.Equal(point, inner.GetQuantile(0.5));
            Assert.Equal(0.5, inner.GetProbLessThan(point));
        }
Ejemplo n.º 7
0
        private void CheckProbLessThan(CanGetProbLessThan canGetProbLessThan, List <double> x, double maximumError)
        {
            x.Sort();
            var sortedData = new OuterQuantiles(x.ToArray());
            // check that quantiles match within the desired accuracy
            var    min        = MMath.Min(x);
            var    max        = MMath.Max(x);
            var    range      = max - min;
            var    margin     = range * 0.01;
            var    testPoints = EpTests.linspace(min - margin, max + margin, 100);
            double maxError   = 0;

            foreach (var testPoint in testPoints)
            {
                var trueRank = sortedData.GetProbLessThan(testPoint);
                var estRank  = canGetProbLessThan.GetProbLessThan(testPoint);
                var error    = System.Math.Abs(trueRank - estRank);
                maxError = System.Math.Max(maxError, error);
            }
            Console.WriteLine($"max rank error = {maxError}");
            Assert.True(maxError <= maximumError);
        }