R小p值

时间:2014-10-20 14:12:20

标签: r p-value

我正在计算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

3 个答案:

答案 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