Они считаются симметричными, потому что довольно часто используется нормальное приближение. Это работает достаточно хорошо, если р лежит около 0,5. binom.test
с другой стороны, сообщает «точные» интервалы Клоппера-Пирсона, основанные на F-распределении ( точные формулы обоих подходов см. здесь ). Если бы мы реализовали интервал Клоппера-Пирсона в R, это было бы что-то вроде (см. Примечание ):
Clopper.Pearson <- function(x, n, conf.level){
alpha <- (1 - conf.level) / 2
QF.l <- qf(1 - alpha, 2*n - 2*x + 2, 2*x)
QF.u <- qf(1 - alpha, 2*x + 2, 2*n - 2*x)
ll <- if (x == 0){
0
} else { x / ( x + (n-x+1)*QF.l ) }
uu <- if (x == 0){
0
} else { (x+1)*QF.u / ( n - x + (x+1)*QF.u ) }
return(c(ll, uu))
}
Как в ссылке, так и в реализации вы видите, что формула для верхнего и нижнего пределов совершенно различна. Единственный случай симметричного доверительного интервала - это когда р = 0,5. Используя формулы из ссылки и учитывая, что в этом случае , легко определить, как это происходит.n = 2 × x
Я лично понял это лучше, глядя на доверительные интервалы, основанные на логистическом подходе. Биномиальные данные обычно моделируются с использованием функции связи logit, определяемой как:
l o g i t ( x ) = log( х1 - х)
Эта функция связи «отображает» термин ошибки в логистической регрессии на нормальное распределение. Как следствие, доверительные интервалы в логистической структуре симметричны вокруг значений логита, во многом как в классической системе линейной регрессии. Логитное преобразование используется именно для того, чтобы можно было использовать всю основанную на нормальности теорию вокруг линейной регрессии.
После выполнения обратного преобразования:
л о г я т- 1( х ) = еИкс1 + еИкс
Вы снова получаете асимметричный интервал. Теперь эти доверительные интервалы фактически смещены. Их охват не тот, который вы ожидаете, особенно на границах биномиального распределения. Тем не менее, в качестве иллюстрации они показывают, почему логично, что биномиальное распределение имеет асимметричные доверительные интервалы.
Пример в R:
logit <- function(x){ log(x/(1-x)) }
inv.logit <- function(x){ exp(x)/(1+exp(x)) }
x <- c(0.2, 0.5, 0.8)
lx <- logit(x)
upper <- lx + 2
lower <- lx - 2
logxtab <- cbind(lx, upper, lower)
logxtab # the confidence intervals are symmetric by construction
xtab <- inv.logit(logxtab)
xtab # back transformation gives asymmetric confidence intervals
примечание : на самом деле R использует бета-дистрибутив, но это полностью эквивалентно и в вычислительном отношении немного более эффективно. Реализация в R, таким образом, отличается от того, что я здесь показываю, но дает точно такой же результат.