在 log space 中将 P 转换为 Z

Convert P to Z in log space

给定一个 -log10(P) 值,我想计算 log space 中的 Z 分数,我该怎么做?

那么,给定以下代码,如何重新编码最后一行,以便它从日志中的 log10P 计算 Z space?

Z=10
log10P  = -1*(pnorm(-abs(Z),log.p = T)*1/log(10) + log10(2))
Z== -1*(qnorm(10^-log10P/2)) # <- this needs to be in log space. 

qnorm 也有一个类似于 pnormlog.p 参数,因此您可以首先反转用于获得 log10P 的操作(我试了几次才弄好...)

我稍微重新安排了您的 log10P 计算。

log10P_from_Z <- function(Z) {
    abs((pnorm(-abs(Z),log.p=TRUE)+log(2))/log(10))
}
Z_from_log10P <- function(log10P) {
    -1*qnorm(-(log10P*log(10))-log(2), log.p=TRUE)
}

我们可以检查往返精度(即从 -log10(p) 转换为 Z 并返回,看看我们与原始值的接近程度。)这对于 20 左右的值非常有效,但对于较大的值确实会产生一点舍入误差(必须更仔细地查看是否有任何可以解决的问题)。

zvec <- seq(20,400)
err <- sapply(zvec, function(z) {
   abs(Z_from_log10P(log10P_from_Z(z))-z)
})