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) }); }
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); }
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); }
public void TukeyOutlierDetectorHdQeTest([NotNull] string testDataKey) => Check(HdQeTestDataMap[testDataKey], values => TukeyOutlierDetector.Create(values, quantileEstimator: HarrellDavisQuantileEstimator.Instance));
public void TukeyOutlierDetectorSimpleQeTest([NotNull] string testDataKey) => Check(SimpleQeTestDataMap[testDataKey], values => TukeyOutlierDetector.Create(values, quantileEstimator: SimpleQuantileEstimator.Instance));