计算卡方分布的微小数字——数值精度
Calculating miniscule numbers for chi-squared distribution -- numerical precision
我正在使用 R 中的 pchisq
函数来计算卡方分布的累积分布函数。我想计算非常小的值,这样 1-pchisq(...)
可以有一个小于 2.2e-16 的值(这是 R 的数字格式的数字精度限制)。现在,这些非常小的值变成了 0。
我尝试过的事情:
将数字显示选项设置为 22(最大)
使用 Rmpfr
包来提高精度,但该数字格式不适用于 pchisq
函数
将 CDF 函数分解为其分量伽玛函数,但这会导致类似的精度限制。关于如何计算我想要的有什么想法吗?
背景:我正在使用 Fisher's method 来组合一堆 p 值。是的,我知道这些 p 值很小,但它实际上对我正在分析的内容很有用。
几件事。
- 2.2e-16 不是 R 中值的精度下限;这只是 R 默认情况下使用
format.pval
: 打印非常小的 p 值的方式
format.pval(1e-20)
## [1] "< 2.22e-16"
- 值小于大约 1e-320 do 四舍五入为零:
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 方法的东西。
我正在使用 R 中的 pchisq
函数来计算卡方分布的累积分布函数。我想计算非常小的值,这样 1-pchisq(...)
可以有一个小于 2.2e-16 的值(这是 R 的数字格式的数字精度限制)。现在,这些非常小的值变成了 0。
我尝试过的事情:
将数字显示选项设置为 22(最大)
使用
Rmpfr
包来提高精度,但该数字格式不适用于pchisq
函数将 CDF 函数分解为其分量伽玛函数,但这会导致类似的精度限制。关于如何计算我想要的有什么想法吗?
背景:我正在使用 Fisher's method 来组合一堆 p 值。是的,我知道这些 p 值很小,但它实际上对我正在分析的内容很有用。
几件事。
- 2.2e-16 不是 R 中值的精度下限;这只是 R 默认情况下使用
format.pval
: 打印非常小的 p 值的方式
format.pval(1e-20)
## [1] "< 2.22e-16"
- 值小于大约 1e-320 do 四舍五入为零:
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 方法的东西。