我正在计算z分数,看看一个值是否远离分布的均值/中位数。我最初是用平均值来做的,然后把这些转化成两面的pvalue。但是现在使用中间值,我注意到在对数值中有一些Na。
我确定这发生在离中位数很远的值上。并且看起来与pnorm的计算有关。“'qnorm‘是以Wichura的算法AS 241为基础的,它提供了大约16位的精确结果。”
有没有人知道如何绕过这一点,因为我想要非常小的对值。谢谢,
> 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
发布于 2014-10-20 15:54:37
中间,您实际上是在计算非常高的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值(接近于零)会更好,但我在数学上还不够好,不知道接近1 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
这样才能更准确地找到你要找的东西。
发布于 2014-10-20 17:05:38
有一个想法是,您必须使用一个精度更高的exp(),但是您可能可以使用log(p)在尾部获得更高的精度,否则,就可以计算的范围而言,非log p值实际上是0:
> 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
发布于 2014-10-20 14:40:52
pnorm是一个函数,它给出了基于给定x的P值。如果不指定更多的参数,则默认分布是正态分布,平均值为0,而standart偏差为1。
基于可测性,p范数(A)=1-p范数(-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
https://stackoverflow.com/questions/26467736
复制相似问题