计算R - 数值精度中卡方分布的微小数

时间:2016-10-20 02:02:15

标签: r statistics precision chi-squared

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

我尝试过的事情:

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

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

  • 将CDF功能分解为其组件伽玛函数,但这导致类似的精度限制。关于如何计算我想要的东西的任何想法?

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

1 个答案:

答案 0 :(得分:2)

有几件事。

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

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

pchisq(121231,1,lower.tail=FALSE,log.p=TRUE)
## [1] -60621.58

这相当于10 ^( - 26327):

-60621.58/log(10)
## -26327.62

检查一个不太极端的值:

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

此外,log(p)正是您需要用于Fisher方法的。