Пример #1
0
        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);
            }
        }
Пример #2
0
        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));
            }
        }