我正在寻找一个支持计算Beta分布的反累积分布函数(也称为量化估计)的Java库/实现,具有合理的精度。当然,我已经尝试过Apache Commons Math,但在版本3中仍存在一些精度问题。下面详细描述了导致这个问题的情况。假设我想计算具有大量试验的Beta分布的可信区间,在apache commons math中...
问题在于2.5百分位数和中位数相同,同时两者均大于平均值。
相比之下,R包binom提供了
为了支持R的结果,以下是 Wolfram Alpha提供的信息:
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 语言中的 stats 包
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 math的41ms相比还是很多)。
- 我知道可以在java中使用R。由于我不想在这里详细介绍原因,这是如果其他所有选项(纯java)失败的情况下的最后一种选择。
2.5 percentile :0.06070354581340706
mean: 0.06187249616697166
median: 0.06187069085946604
97.5 percentile :0.06305170793994147
更新 23.02.13
虽然乍一看这个问题及其回复可能过于具体,但我认为它很好地说明了有些数值问题不能用头脑风暴式的方法来高效地解决。因此,我希望它能保持开放。