2016-11-19 3 views
4

Я смущен о работе binom.test.R binom.test ошибка округления?

Скажем, я хочу проверить образец успеха 4/10 против p = 0,5. Значение Р должно быть:

Р (Х < = 4) + Р (Х> = 6) или Р (Х < = 4) + 1-Р (Х < = 5)

и в самом деле:

>pbinom(4,10,p=0.5) + 1-pbinom(5,10,0.5) 
[1] 0.7539063 

или:

>binom.test(4,10,p=0.5) 

Exact binomial test 

data: 4 and 10 
number of successes = 4, number of trials = 10, p-value = 0.7539 

Но теперь я хочу, чтобы проверить образец 95/150 от р = 0,66 Здесь, ожидаемое значение 99, так что значение Р должно быть

Р (Х < = 95) + Р (Х> = 103) или Р (Х < = 95) + 1-Р (Х < = 102)

который

>pbinom(95,150,.66) + 1-pbinom(102,150,.66) 
[1] 0.5464849 

но

>binom.test(95,150,.66) 

    Exact binomial test 

data: 95 and 150 
number of successes = 95, number of trials = 150, p-value = 0.4914 

в самом деле, разница в двух Pv alues ​​- это точно dbinom(103,150,.66). Таким образом, кажется, что R не включил X = 103.

Единственное объяснение, которое я могу догадаться, заключается в том, что существует ошибка округления из-за неточного представления .66, заставляя R просто пропустить X = 103. Это все, или есть что-то еще?

+0

Я бы сказал, что пришло время копаться в коде ... –

ответ

4

Вот код для вычисления р-значение в binom.test (х = 95, п = 150, р = 0,66)

relErr <- 1 + 1e-07 
d <- dbinom(x, n, p) 
m <- n * p 
i <- seq.int(from = ceiling(m), to = n) 
y <- sum(dbinom(i, n, p) <= d * relErr) 
pbinom(x, n, p) + pbinom(n - y, n, p, lower.tail = FALSE) 

Так, binom.test не выглядит симметрично относительно ожидаемое значение. Он ищет первое целое число C, такое, что C больше или равно ожидаемому значению, а вероятность получения ровно C успехов меньше или равна вероятности получения ровно x успехов, вплоть до коэффициента fudge в relErr. Таким образом, вместо того, чтобы говорить, что p - вероятность получить «по крайней мере, что далеко от ожидаемого значения», говорят, что p - вероятность того, что вероятность будет по крайней мере такой же малой, как полученное вами значение.

В этом случае

dbinom(95,n,p) 

является 0,05334916. Итак, binom.test ищет значения x, так что dbinom (x, n, p) меньше 0,05343416. Оказывается, что это 0:95 и 104: 150. Таким образом, binom.test возвращает значение

sum(dbinom(0:95,n,p)) + sum(dbinom(104:150,n,p)) 

который составляет 0,4914044.

Смежные вопросы