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.