public override double GetValue(Sample a, Sample b, Probability probability) { Assertion.NotNull(nameof(a), a); Assertion.NotNull(nameof(b), b); try { double aMad = MedianAbsoluteDeviation.CalcMad(a); double bMad = MedianAbsoluteDeviation.CalcMad(b); if (aMad < Eps && bMad < Eps) { double aMedian = QuantileEstimator.GetMedian(a); double bMedian = QuantileEstimator.GetMedian(b); if (Math.Abs(aMedian - bMedian) < Eps) { return(0); } return(aMedian < bMedian ? double.PositiveInfinity : double.NegativeInfinity); } double aQuantile = QuantileEstimator.GetQuantile(a, probability); double bQuantile = QuantileEstimator.GetQuantile(b, probability); double pooledMad = PooledMad(a.Count, b.Count, aMad, bMad); return((bQuantile - aQuantile) / pooledMad); } catch (Exception) { return(double.NaN); } }
public override double[] GetValues(Sample a, Sample b, IReadOnlyList <Probability> probabilities) { Assertion.NotNull(nameof(a), a); Assertion.NotNull(nameof(b), b); Assertion.NotNullOrEmpty(nameof(probabilities), probabilities); int k = probabilities.Count; try { double aMad = MedianAbsoluteDeviation.CalcMad(a); double bMad = MedianAbsoluteDeviation.CalcMad(b); if (aMad < Eps && bMad < Eps) { double aMedian = QuantileEstimator.GetMedian(a); double bMedian = QuantileEstimator.GetMedian(b); if (Math.Abs(aMedian - bMedian) < Eps) { return(ConstantSequence.Zero.GenerateArray(k)); } return(aMedian < bMedian ? ConstantSequence.PositiveInfinity.GenerateArray(k) : ConstantSequence.NegativeInfinity.GenerateArray(k)); } double[] aQuantile = QuantileEstimator.GetQuantiles(a, probabilities); double[] bQuantile = QuantileEstimator.GetQuantiles(b, probabilities); double pooledMad = PooledMad(a.Count, b.Count, aMad, bMad); double[] values = new double[k]; for (int i = 0; i < k; i++) { values[i] = (bQuantile[i] - aQuantile[i]) / pooledMad; } return(values); } catch (Exception) { return(ConstantSequence.NaN.GenerateArray(k)); } }