【问题标题】:Calculating miniscule numbers for chi-squared distribution -- numerical precision计算卡方分布的微小数字——数值精度
【发布时间】:2016-10-20 02:02:15
【问题描述】:

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

我尝试过的事情:

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

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

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

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

【问题讨论】:

  • 这可能是一个错误的地方询问统计数据。
  • 你能计算 log(1-pchisq) 吗?

标签: r statistics precision chi-squared


【解决方案1】:

几件事。

  • 2.2e-16 不是 R 中值的精度下限;这只是 R 默认打印非常小的 p 值的方式,使用 format.pval:
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 方法的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-06
    • 2019-08-15
    • 2014-11-20
    • 1970-01-01
    • 2022-01-12
    • 2015-07-29
    • 1970-01-01
    相关资源
    最近更新 更多