簡體   English   中英

當Z得分很大時,如何計算R中z分數的p值(pvalue遠低於零)?

[英]How to compute p-values from z-scores in R when the Z score is large (pvalue much below zero)?

在遺傳學中,非常小的p值是常見的(例如10 ^ -400),當我在R中得分很大時,我正在尋找一種獲得非常小的p值(雙尾)的方法,例如:

z=40
pvalue = 2*pnorm(abs(z), lower.tail = F)

這給了我零而不是非常小的值,這是非常重要的。

無法處理小於大約10 ^( - 308)(。 .Machine$double.xmin )的p值並不是R的錯誤,而是使用雙精度(64位)浮點數的任何計算系統的通用限制存儲數字信息。

通過計算對數刻度來解決問題並不難,但是你不能將結果存儲為R中的數值; 相反,您需要將結果存儲(或打印)為尾數加指數。

pvalue.extreme <- function(z) {
   log.pvalue <- log(2) + pnorm(abs(z), lower.tail = FALSE, log.p = TRUE)
   log10.pvalue <- log.pvalue/log(10) ## from natural log to log10
   mantissa <- 10^(log10.pvalue %% 1)
   exponent <- log10.pvalue %/% 1
   ## or return(c(mantissa,exponent))
   return(sprintf("p value is %1.2f times 10^(%d)",mantissa,exponent))
}

使用不太極端的情況進行測試:

pvalue.extreme(5)
## [1] "p value is 5.73 times 10^(-7)"
2*pnorm(5,lower.tail=FALSE)
## [1] 5.733031e-07

更極端:

pvalue.extreme(40)
## [1] "p value is 7.31 times 10^(-350)"

在R(Brobdingnag,Rmpfr,...)中有各種各樣的包處理極大/小數字並具有擴展的精度。例如,

2*Rmpfr::pnorm(mpfr(40, precBits=100), lower.tail=FALSE, log.p = FALSE)
## 1 'mpfr' number of precision  100   bits 
## [1] 7.3117870818300594074979715966414e-350

但是,在使用任意精度系統時,您將在計算效率和方便性方面付出巨大代價。

暫無
暫無

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

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