计算卡方分布的极小数——数值精度

Van*_*nce 5 precision statistics r chi-squared

我正在使用pchisqR 中的函数来计算卡方分布的累积分布函数。我想计算非常小的值,这样1-pchisq(...)的值可以小于 2.2e-16(这是 R 数字格式的数字精度限制)。现在,这些非常小的值只是变成了 0。

我尝试过的事情:

  • 将数字显示选项设置为 22(最大)

  • 使用Rmpfr包来提高精度,但该数字格式不适用于该pchisq函数

  • 将 CDF 函数分解为其分量伽马函数,但这会导致类似的精度限制。关于如何计算我想要的任何想法?

背景:我使用Fisher 的方法来组合一堆 p 值。是的,我知道这些 p 值很小,但它实际上对我正在分析的内容很有用。

Ben*_*ker 4

有几件事。

  • 2.2e-16不是R中数值的精度下限;这就是 R 默认打印非常小的 p 值的方式,使用format.pval
format.pval(1e-20)
## [1] "< 2.22e-16"
Run Code Online (Sandbox Code Playgroud)
  • 小于大约 1e-320 的值向下舍入为零:
1e-330
## [1] 0
Run Code Online (Sandbox Code Playgroud)

@SeverinPappadeux 的建议是完全正确的:

pchisq(121231,1,lower.tail=FALSE,log.p=TRUE)
## [1] -60621.58
Run Code Online (Sandbox Code Playgroud)

这相当于 10^(-26327):

-60621.58/log(10)
## -26327.62
Run Code Online (Sandbox Code Playgroud)

检查是否有一个不太极端的值:

log10(pchisq(100,1,lower.tail=FALSE) )
## [1] -22.81702
pchisq(100,1,lower.tail=FALSE,log.p=TRUE)/log(10)
## [1] -22.81702
Run Code Online (Sandbox Code Playgroud)

此外,log(p)这正是您需要用于费舍尔方法的内容。