妥当な精度でベータ分布の逆累積分布関数の計算 (別名、分位数の推定) をサポートする Java ライブラリ/実装を探しています。
もちろん、 apache commons mathも試しましたが、バージョン 3 ではまだ精度に問題があるようです。この質問につながる問題を以下に詳しく説明します。
試行回数が多いベータ分布の信頼区間を計算したいとします。Apacheコモンズ数学では...
final int trials = 161750;
final int successes = 10007;
final double alpha = 0.05d;
// the supplied precision is the default precision according to the source code
BetaDistribution betaDist = new BetaDistribution(successes + 1, trials - successes + 1, 1e-9);
System.out.println("2.5 percentile :" + betaDist.inverseCumulativeProbability(alpha / 2d));
System.out.println("mean: " + betaDist.getNumericalMean());
System.out.println("median: " + betaDist.inverseCumulativeProbability(0.5));
System.out.println("97.5 percentile :" + betaDist.inverseCumulativeProbability(1 - alpha / 2d));
配信する
2.5 percentile :0.062030402074808505
mean: 0.06187249616697166
median: 0.062030258659508855
97.5 percentile :0.06305170793994147
問題は、2.5 パーセンタイルと中央値が同じである一方で、どちらも平均よりも大きいことです。
比較すると、Rパッケージbinomは以下を実現します。
binom.confint(10007+1,161750+2,methods=c("agresti-coull","exact","wilson"))
method x n mean lower upper
1 agresti-coull 10008 161752 0.0618725 0.06070873 0.06305707
2 exact 10008 161752 0.0618725 0.06070317 0.06305756
3 wilson 10008 161752 0.0618725 0.06070877 0.06305703
およびRパッケージ統計
qbeta(c(0.025,0.975),10007+1,161750-10007+1)
[1] 0.06070355 0.06305171
R の結果に次ぐために、Wolfram Alphaが私に言ったことは次のとおりです。
- InverseBetaRegularized[0.025,10007+1,161750-10007+1] => 0.06070354631...
- InverseBetaRegularized[0.975,10007+1,161750-10007+1] => 0.06305170794...
要件に関する最終的な注意事項:
- これらの計算をたくさん実行する必要があります。したがって、どのソリューションも 1 秒よりも長くかかるべきではありません ((間違っているとはいえ) Apache Commons の数学の 41 ミリ秒と比較すると、これはまだ多くの時間です)。
- Java内でRを使用できることを認識しています。ここでは詳しく説明しませんが、これは他の方法 (純粋な Java) が失敗した場合の最後のオプションです。
更新 21.08.12
この問題は apache-commons-math の 3.1-SNAPSHOT で修正または少なくとも改善されたようです。上記のユースケースの場合
2.5 percentile :0.06070354581340706
mean: 0.06187249616697166
median: 0.06187069085946604
97.5 percentile :0.06305170793994147
更新 23.02.13
一見すると、この質問とその回答は局所的すぎるかもしれませんが、最初に頭に浮かぶハッカーのアプローチでは、いくつかの数値問題を (効率的に) 解決できないことを非常によく示していると思います。ですので、このまま開いていてほしいです。