在 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
也有一个类似于 pnorm
的 log.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)
})
给定一个 -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
也有一个类似于 pnorm
的 log.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)
})