R binom.test ошибка округления?

Я запутался в работе binom.test.

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

P (X <= 4) + P (X>= 6) или P(X <= 4) + 1-P(X <= 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 против p = 0,66. Здесь ожидаемое значение равно 99, поэтому значение P должно быть

P(X <= 95) + P(X >= 103) или P(X <= 95) + 1-P(X <= 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

На самом деле, разница в двух значениях P точно dbinom(103,150,.66), Таким образом, кажется, что R не смог включить X=103.

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

1 ответ

Решение

Вот код для вычисления p-значения в binom.test(x = 95, n = 150, p= 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 успехов, вплоть до коэффициента выдумки в relErr. Таким образом, вместо того, чтобы сказать, что p - это вероятность достижения "по крайней мере такого большого расстояния от ожидаемого значения", они говорят, что p - это вероятность того, что вероятность, по крайней мере, столь же мала, как и полученное вами значение.

В этом случае,

dbinom(95,n,p)

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

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

что составляет 0,4914044.

Другие вопросы по тегам