Использование Apache Commons Math для определения доверительных интервалов - PullRequest
14 голосов
/ 06 апреля 2011

У меня есть набор эталонных данных, для которых я вычисляю сводную статистику, используя Apache Math Commons.Теперь я хочу использовать пакет для вычисления доверительных интервалов для арифметических средств, например, измерений времени выполнения.

Возможно ли это вообще?Я убежден, что пакет поддерживает это, однако я не знаю, с чего начать.

Это решение, которое я в итоге использовал с помощью предложения Брента Уордена:

private double getConfidenceIntervalWidth(StatisticalSummary statistics, double significance) {
    TDistribution tDist = new TDistribution(statistics.getN() - 1);
    double a = tDist.inverseCumulativeProbability(1.0 - significance / 2);
    return a * statistics.getStandardDeviation() / Math.sqrt(statistics.getN());
}

Ответы [ 2 ]

15 голосов
/ 07 апреля 2011

Apache Commons Math не имеет прямой поддержки для построения доверительных интервалов.Тем не менее, он имеет все необходимое для их вычисления.

Во-первых, используйте SummaryStatistics или какую-либо другую реализацию StatisticalSummary , чтобы объединить ваши данные в статистику выборки.

Далее, используйте TDistribution , чтобы вычислить критические значения для желаемого уровня достоверности.Степени свободы могут быть выведены из свойства n сводной статистики.

Last, используйте значения свойства mean, variance и n из статистики итогов и критическое значение tиз дистрибутива, чтобы вычислить ваши нижние и верхние пределы достоверности.

1 голос
/ 19 апреля 2015

Если вы все еще хотите вычислить бином в java, используя только стандартную версию, вы можете использовать класс ниже, как показано ниже.

calling sample BinomialConfidenceCalc.calcBin(13, 100,95.0D);

public class BinomialConfidenceCalc {

    public static double binP(double N,double p,double x1,double x2){
        double q = p/(1-p);
        double k = 0.0;
        double v = 1.0;
        double s = 0.0;
        double tot = 0.0;

        while(k<=N){                    
            tot += v;
            if(k >= x1 && k <= x2){                
                s += v;
            }    
            if(tot > Math.pow(10,30)){                    
                s = s/Math.pow(10,30);
                tot = tot/Math.pow(10,30);
                v = v/Math.pow(10,30);
            }
            k += 1;
            v = v*q*(N+1-k)/k;

        }
        return s/tot;
    }


    public static double[] calcBin(double vx,double vN,Double vCL){

        double vTU = (100 - vCL)/2;
        double vTL = vTU;
        double dl = 0.0;
        double vP = vx/vN;
        if(vx==0){            
            dl = 0.0;
        }
        else{
            double v = vP/2;
            double  vsL = 0;
            double vsH = vP;
            double p = vTL/100;

            while((vsH-vsL) > Math.pow(10,-5)){
                if(binP(vN, v, vx, vN) > p){
                    vsH = v;
                    v = (vsL+v)/2;
                }else{
                    vsL = v;
                    v = (v+vsH)/2;
                }
            }
            dl = v;                             
        }

        double ul = 0.0;
        if(vx==vN){            
            ul = 1.0;
        }
        else{

            double v = (1+vP)/2;
            double vsL =vP;
            double vsH = 1;
            double p = vTU/100;
            while((vsH-vsL) > Math.pow(10,-5)){
                if(binP(vN, v, 0, vx) < p){
                    vsH = v;
                    v = (vsL+v)/2;
                }
                else{
                    vsL = v;
                    v = (v+vsH)/2;
                }
            }
            ul = v;
        }
        double dlUl[] = new double[]{dl,ul};
        return dlUl;
    }



}
...