gpt4 book ai didi

r - 当 Z 分数很大(p 值远低于零)时,如何从 R 中的 z 分数计算 p 值?

转载 作者:行者123 更新时间:2023-12-04 22:56:04 26 4
gpt4 key购买 nike

在遗传学中,非常小的 p 值很常见(例如 10^-400),我正在寻找一种方法,当 R 中的 z 分数很大时,可以获得非常小的 p 值(双尾),例如:

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

这给了我一个零而不是一个非常重要的非常小的值。

最佳答案

无法处理小于 10^(-308) ( .Machine$double.xmin ) 的 p 值并不是真正的 R 的错,而是任何使用 double (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

但是,您将在计算效率和使用任意精度系统的便利性方面付出巨大代价。

关于r - 当 Z 分数很大(p 值远低于零)时,如何从 R 中的 z 分数计算 p 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46416027/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com