2014-10-20 1 views
2

Я вычисляю z-баллы, чтобы увидеть, далеко ли значение от среднего/медиана распределения. Я изначально сделал это, используя среднее значение, а затем превратил их в 2-сторонние значения. Но теперь, используя медиану, я заметил, что есть некоторые Na в pvalues.R small pvalues ​​

Я определил, что это происходит для значений, которые очень далеки от медианного. И похоже, что он связан с вычислением 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 

ответ

2

с промежуточными, вы на самом деле вычислениями самых высоких р-значений:

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 в алгоритме 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.5383982e-23 1.244192114854356972087e-15 

, которые должны получить более точно то, что вы ищете.

0

pnorm это функция, которая дает то, что значение P основано на заданном х. Если вы не укажете больше аргументов, тогда распределение по умолчанию равно Normal со средним 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 
+1

Мне кажется, что это не работает для сценария, описанного в вопросе '2-2 * pnorm (abs (z))'. – SimonG

1

Одна мысль, вам нужно использовать exp() с большей точностью, но вы можете использовать log (p), чтобы получить немного больше точности в хвостах, в противном случае вы эффективно используете 0 для не- -log значения р в терминах диапазона, которые могут быть вычислены:

> z<- -12.5 
> pnorm(abs(z),log.p=T) 
[1] -7.619853e-24 

Преобразование обратно к значению р не работает хорошо, но вы могли бы сравнить на лога (р) ...

> exp(pnorm(abs(z),log.p=T)) 
[1] 1