簡體   English   中英

計算卡方分布的極小數 - 數值精度

[英]Calculating miniscule numbers for chi-squared distribution — numerical precision

我在 R 中使用pchisq函數來計算卡方分布的累積分布函數。 我想計算非常小的值,這樣1-pchisq(...)的值可以小於 2.2e-16(這是 R 數字格式的數字精度限制)。 現在,這些非常小的值只是變成了 0。

我嘗試過的事情:

  • 將數字顯示選項設置為 22(最大)

  • 使用Rmpfr包提高精度,但該數字格式不適用於pchisq函數

  • 將 CDF 函數分解為其分量伽馬函數,但這會導致類似的精度限制。 關於如何計算我想要的任何想法?

背景:我使用Fisher 的方法來組合一堆 p 值。 是的,我知道這些 p 值很小,但它實際上對我正在分析的內容很有用。

幾件事。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM