我正在计算z分数,以查看某个值是否远离分布的均值/中位数。 我最初使用平均值完成它,然后将它们变成双面pvalues。但现在使用中位数我注意到p值中有一些Na。
我确定这对于距离中位数非常远的值而言确实存在。 并且看起来与pnorm计算有关。 " ' qnorm'基于Wichura的算法AS 241提供 精确的结果,最多约16位数。 "
有没有人知道这方面的方法,因为我想要非常小的pvalues。 谢谢,
> z<- -12.5
> 2-2*pnorm(abs(z))
[1] 0
> z<- -10
> 2-2*pnorm(abs(z))
[1] 0
> z<- -8
> 2-2*pnorm(abs(z))
[1] 1.332268e-15
答案 0 :(得分:2)
中间,您实际上正在计算非常高 p值:
options(digits=22)
z <- c(-12.5,-10,-8)
pnorm(abs(z))
# [1] 1.0000000000000000000000 1.0000000000000000000000 0.9999999999999993338662
2-2*pnorm(abs(z))
# [1] 0.000000000000000000000e+00 0.000000000000000000000e+00 1.332267629550187848508e-15
我认为你最好使用低p值(接近于零)但我在数学方面不够好,不知道接近一个p值的误差是在AS241算法中还是在浮点存储。看看低值出现的好坏:
pnorm(z)
# [1] 3.732564298877713761239e-36 7.619853024160526919908e-24 6.220960574271784860433e-16
请注意1 - pnorm(x)
相当于pnorm(-x)
。因此,2-2*pnorm(abs(x))
相当于2*(1 - pnorm(abs(x))
相当于2*pnorm(-abs(x))
,所以请选择:
2 * pnorm(-abs(z))
# [1] 7.465128597755427522478e-36 1.523970604832105383982e-23 1.244192114854356972087e-15
哪个应该更准确地得到你想要的东西。
答案 1 :(得分:1)
有人想过,你必须使用精度更高的exp(),但是你可以使用log(p)来获得更精确的尾部,否则你实际上是0根据可计算的范围计算非log p值:
> z<- -12.5
> pnorm(abs(z),log.p=T)
[1] -7.619853e-24
转换回p值并不好用,但你可以比较log(p)...
> exp(pnorm(abs(z),log.p=T))
[1] 1
答案 2 :(得分:0)
pnorm是一个函数,它根据给定的x给出P值。如果未指定更多参数,则默认分布为“正常”,均值为0,标准差为1
基于simetrity,pnorm(a)= 1-pnorm(-a)。
在R中,如果你添加正数,它将围绕它们。但是,如果你添加负数,则不会进行舍入。因此,使用此公式和负数,您可以计算所需的值。
> pnorm(0.25)
[1] 0.5987063
> 1-pnorm(-0.25)
[1] 0.5987063
> pnorm(20)
[1] 1
> pnorm(-20)
[1] 2.753624e-89