为什么apache math中的尾部概率在1E-16之后下降到零?

为什么apache math中的尾部概率在1E-16之后下降到零?,apache,math,apache-commons-math,Apache,Math,Apache Commons Math,Apache Math 3.4(和3.3),java 1.8.0_25 import org.apache.commons.math3.distribution.ChiSquaredDistribution; ChiSquaredDistribution chisq = new ChiSquaredDistribution(23) System.out.println(1.0 - chisq.cumulativeProbability(130) // 1.1102230246251565E-1

Apache Math 3.4(和3.3),java 1.8.0_25

import org.apache.commons.math3.distribution.ChiSquaredDistribution;
ChiSquaredDistribution chisq = new ChiSquaredDistribution(23)
System.out.println(1.0 - chisq.cumulativeProbability(130) //  1.1102230246251565E-16
System.out.println(1.0 - chisq.cumulativeProbability(131) //  0.0
为什么Apache Math在第二次调用中返回0.0?一些统计库(Excel,但不是R)返回的尾部概率值远小于1E-16

附加编辑:在下面的评论中,Robert提供了一种使用Apache数学库(RegulatizedGammaq)中的另一个函数直接计算卡方尾概率的方法,该函数没有这种精度问题


请注意,从1.0中减去1.0得出小于1.0的最小值约为1e-16;您可以直接验证这一点。也许你应该打印出chisq.cumulativeProbability(131)本身。我不知道它是否正确,但无论如何,让我们不要混淆问题,从1.0中减去它。

谢谢。关于双打的减法部分,你是对的,因为1-1e-16是0.999等,但1-1e-17是1,因为双打的精度是数字。但是chisq.累积概率(131)正好是1.0。我从ApacheMath人员那里得到了与CDF计算相关的输入;R和倍频程中的stock函数的行为也类似(但Excel提供了一个小的非零值,可能它直接计算尾部和/或使用更高的精度)。当我更好地理解时,将更新此线程。@来自commons math 3.4的clarity源代码显示ChiSquaredDistribution.cumulativeProbability是由Gamma.RegulatizedGamMap计算的。如果我没有弄错(您可能想验证一下),它在第319行接受分支x>=a+1,因此它将结果计算为1.0-regulazedgammaq(…)。由于从1.0减去,结果不能在0.0和浮点ε1e-16之间。@这很不幸,尽管我不得不怀疑这是否真的重要。如果你在做任何类型的实际工作,错误的模型(几乎可以肯定是这样)所带来的错误要多得多。真的值得费心去计算非常小的尾概率吗?这完全取决于你的申请。你是对的。我很好奇。一个有用的特性是,它提供了一个从p值到统计量的1-1函数(因此可以从给定分布的p值恢复统计量)。有一个名为dcdflib的fortran库完成了tail(有一个带有gotos的C版本),一个名为prob的后续cleaner库似乎没有tail函数。Excel提供了它。作为一名新成员,我无法关闭此线程或对您的答案进行投票。@好吧,如果您确实需要尾部概率,您可以通过
regularizedGammaQ
自行计算。如果我没有弄错的话,尾值是
regulatedgammaq(n/2,x/2)
其中
n
是自由度(示例中为23),而
x
是尾的左侧边界(示例中为131)。当然,您需要验证该公式。我还没有检查
regularizedGammaQ
是否存在浮点计算问题。