我要寻找支持的Beta分布(分位数的估计又名) 以合理的精度逆累积分布函数的计算一个java库/执行。
当然,我已经试过阿帕奇百科全书数学 ,但在第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 -package 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 -package 统计
qbeta(c(0.025,0.975),10007+1,161750-10007+1)
[1] 0.06070355 0.06305171
第二来自R的结果,这里是Wolfram Alpha的告诉我
- InverseBetaRegularized [0025.10007 + 1.161750至10007 + 1] => 0.06070354631 ...
- InverseBetaRegularized [0975.10007 + 1.161750至10007 + 1] => 0.06305170794 ...
在要求最后要注意的:
- 我需要运行很多这些计算的。 因此,任何解决方案不应该需要更长的时间超过1秒(这仍然是一个很大相比的41ms(尽管是错误的)阿帕奇百科全书数学)。
- 我知道一个可以的Java中使用R上。 至于原因,我在这里就不细说了,这是最后的选择,如果别的(纯Java)失败。
更新12年8月21日
看来 ,该问题已得到修复或Apache的公地数学的3.1-SNAPSHOT至少提高。 对于上面的用例
2.5 percentile :0.06070354581340706
mean: 0.06187249616697166
median: 0.06187069085946604
97.5 percentile :0.06305170793994147
更新13年2月23日
虽然乍一看这个问题,它的反应可能过于本地化,我觉得这很好说明了一些数值问题不能(有效)与解决的是什么先来到到心灵黑客的方法。 所以,我希望它保持打开状态。