public static double CalculateMValue([NotNull] Statistics originalStatistics) { try { var s = new Statistics(originalStatistics.WithoutOutliers()); double mValue = 0; double binSize = s.GetOptimalBinSize(); if (Abs(binSize) < 1e-9) { binSize = 1; } while (true) { var histogram = HistogramBuilder.Adaptive.BuildWithFixedBinSize(s.GetSortedValues(), 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 > s.Max - s.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) } }
private static bool AreSame(Statistics x, Statistics y) { if (x.N >= 3 && y.N >= 3) { var tost = StatisticalTestHelper.CalculateTost(MannWhitneyTest.Instance, x.GetSortedValues().ToArray(), y.GetSortedValues().ToArray(), RelativeThreshold.Default); if (tost.Conclusion != EquivalenceTestConclusion.Unknown) { return(tost.Conclusion == EquivalenceTestConclusion.Same); } } return(Math.Abs(x.Mean - y.Mean) < Math.Abs(x.Mean + y.Mean) / 2 * 0.01); }