Exemplo n.º 1
0
        public static double Calculate([NotNull] double[] values)
        {
            try
            {
                var clearedValues = TukeyOutlierDetector.Create(values).WithoutAllOutliers(values).ToList();
                int n             = clearedValues.Count;
                var quartiles     = Quartiles.Create(clearedValues);
                var moments       = Moments.Create(clearedValues);

                double mValue = 0;

                double binSize = AdaptiveHistogramBuilder.GetOptimalBinSize(n, moments.StandardDeviation);
                if (Abs(binSize) < 1e-9)
                {
                    binSize = 1;
                }
                while (true)
                {
                    var histogram = HistogramBuilder.Adaptive.Build(clearedValues, binSize);
                    var x         = new List <int> {
                        0
                    };
                    x.AddRange(histogram.Bins.Select(bin => bin.Count));
                    x.Add(0);

                    int sum = 0;
                    for (int i = 1; i < x.Count; i++)
                    {
                        sum += Abs(x[i] - x[i - 1]);
                    }
                    mValue = Max(mValue, sum * 1.0 / x.Max());

                    if (binSize > quartiles.Max - quartiles.Min)
                    {
                        break;
                    }
                    binSize *= 2.0;
                }

                return(mValue);
            }
            catch (Exception)
            {
                return(1); // In case of any bugs, we return 1 because it's an invalid value (mValue is always >= 2)
            }
        }
        public void Run()
        {
            var simple    = SimpleQuantileEstimator.Instance;
            var hd        = HarrellDavisQuantileEstimator.Instance;
            var detectors = new[]
            {
                new Detector("TukeySimple", values => TukeyOutlierDetector.Create(values, quantileEstimator: simple)),
                new Detector("TukeyHd", values => TukeyOutlierDetector.Create(values, quantileEstimator: hd)),
                new Detector("MadSimple", values => MadOutlierDetector.Create(values, quantileEstimator: simple)),
                new Detector("MadHd", values => MadOutlierDetector.Create(values, quantileEstimator: hd)),
                new Detector("DoubleMadSimple", values => DoubleMadOutlierDetector.Create(values, quantileEstimator: simple)),
                new Detector("DoubleMadHd", values => DoubleMadOutlierDetector.Create(values, quantileEstimator: hd))
            };

            Case.DumpBaseSample();
            BuildTable(detectors, new[] { new Case(1, 0), new Case(2, 0), new Case(3, 0) });
            BuildTable(detectors, new[] { new Case(0, 1), new Case(0, 2), new Case(0, 3) });
            BuildTable(detectors, new[] { new Case(1, 1), new Case(2, 2), new Case(3, 3) });
        }
Exemplo n.º 3
0
        public Statistics(IEnumerable <double> values)
        {
            OriginalValues = values.Where(d => !double.IsNaN(d)).ToArray();
            SortedValues   = OriginalValues.OrderBy(value => value).ToArray();
            N = SortedValues.Count;
            if (N == 0)
            {
                throw new InvalidOperationException("Sequence of values contains no elements, Statistics can't be calculated");
            }

            var quartiles = Quartiles.FromSorted(SortedValues);

            Min                = quartiles.Min;
            Q1                 = quartiles.Q1;
            Median             = quartiles.Median;
            Q3                 = quartiles.Q3;
            Max                = quartiles.Max;
            InterquartileRange = quartiles.InterquartileRange;

            var moments = Moments.Create(SortedValues);

            Mean = moments.Mean;
            StandardDeviation = moments.StandardDeviation;
            Variance          = moments.Variance;
            Skewness          = moments.Skewness;
            Kurtosis          = moments.Kurtosis;

            var tukey = TukeyOutlierDetector.FromQuartiles(quartiles);

            LowerFence      = tukey.LowerFence;
            UpperFence      = tukey.UpperFence;
            AllOutliers     = SortedValues.Where(tukey.IsOutlier).ToArray();
            LowerOutliers   = SortedValues.Where(tukey.IsLowerOutlier).ToArray();
            UpperOutliers   = SortedValues.Where(tukey.IsUpperOutlier).ToArray();
            outlierDetector = tukey;

            StandardError      = StandardDeviation / Math.Sqrt(N);
            ConfidenceInterval = new ConfidenceInterval(Mean, StandardError, N);
            Percentiles        = new PercentileValues(SortedValues);
        }
Exemplo n.º 4
0
        public Statistics(IEnumerable <double> values)
        {
            var sortedValues = new SegmentedList <double>(values.Where(d => !double.IsNaN(d)));

            sortedValues.Sort();
            if (sortedValues.Count < 1)
            {
                return;
            }

            var quartiles = Quartiles.FromSorted(sortedValues);

            Min    = quartiles.Min;
            Q1     = quartiles.Q1;
            Median = quartiles.Median;
            Q3     = quartiles.Q3;
            Max    = quartiles.Max;

            Mean = sortedValues.Average();

            var tukey = TukeyOutlierDetector.FromQuartiles(quartiles);

            LowerFence = tukey.LowerFence;
            UpperFence = tukey.UpperFence;

            P0   = SimpleQuantileEstimator.Instance.GetQuantileFromSorted(sortedValues, 0.0);
            P25  = SimpleQuantileEstimator.Instance.GetQuantileFromSorted(sortedValues, 0.25);
            P50  = SimpleQuantileEstimator.Instance.GetQuantileFromSorted(sortedValues, 0.50);
            P67  = SimpleQuantileEstimator.Instance.GetQuantileFromSorted(sortedValues, 0.67);
            P80  = SimpleQuantileEstimator.Instance.GetQuantileFromSorted(sortedValues, 0.80);
            P85  = SimpleQuantileEstimator.Instance.GetQuantileFromSorted(sortedValues, 0.85);
            P90  = SimpleQuantileEstimator.Instance.GetQuantileFromSorted(sortedValues, 0.90);
            P95  = SimpleQuantileEstimator.Instance.GetQuantileFromSorted(sortedValues, 0.95);
            P99  = SimpleQuantileEstimator.Instance.GetQuantileFromSorted(sortedValues, 0.99);
            P100 = SimpleQuantileEstimator.Instance.GetQuantileFromSorted(sortedValues, 1.00);
        }
Exemplo n.º 5
0
 public void TukeyOutlierDetectorHdQeTest([NotNull] string testDataKey) => Check(HdQeTestDataMap[testDataKey],
                                                                                 values => TukeyOutlierDetector.Create(values, quantileEstimator: HarrellDavisQuantileEstimator.Instance));
Exemplo n.º 6
0
 public void TukeyOutlierDetectorSimpleQeTest([NotNull] string testDataKey) => Check(SimpleQeTestDataMap[testDataKey],
                                                                                     values => TukeyOutlierDetector.Create(values, quantileEstimator: SimpleQuantileEstimator.Instance));