15

Apache Math Commons を使用して要約統計を計算する一連のベンチマーク データがあります。ここで、このパッケージを使用して、実行時間測定などの算術平均の信頼区間を計算したいと考えています。

これはまったく可能ですか?パッケージがこれをサポートしていると確信していますが、どこから始めればよいか途方に暮れています。

これは、Brent Worden の提案の助けを借りて最終的に使用したソリューションです。

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());
}
4

2 に答える 2

15

Apache Commons Math は、信頼区間の構築を直接サポートしていません。ただし、それらを計算するために必要なすべてが含まれています。

まず、SummaryStatisticsまたはその他のStatisticalSummary実装を使用して、データをサンプル統計に要約します。

次に、TDistributionを使用して、目的の信頼レベルの臨界値を計算します。n自由度は、要約統計量のプロパティから推測できます。

最後に、要約統計量のmeanvariance、およびnプロパティ値と、分布の t 臨界値を使用して、信頼限界の下限と上限を計算します。

于 2011-04-07T05:06:34.253 に答える
1

標準版のみを使用して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;
    }



}
于 2015-04-18T21:14:32.167 に答える