Acredita-se que sejam simétricos porque muitas vezes é usada uma aproximação normal. Este funciona bem o suficiente no caso de p ficar em torno de 0,5. binom.test
por outro lado, relata intervalos "exatos" de Clopper-Pearson, que são baseados na distribuição F (veja aqui as fórmulas exatas de ambas as abordagens). Se implementarmos o intervalo Clopper-Pearson em R, seria algo como (veja a nota ):
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))
}
Você vê no link e na implementação que a fórmula para o limite superior e o inferior são completamente diferentes. O único caso de um intervalo de confiança simétrico é quando p = 0,5. Usando as fórmulas do link e levando em consideração que, neste caso, , é fácil entender como isso acontece.n=2×x
Pessoalmente, entendi melhor olhando os intervalos de confiança com base em uma abordagem logística. Os dados binomiais geralmente são modelados usando uma função de link de logit, definida como:
logit(x)=log(x1−x)
Essa função de link "mapeia" o termo do erro em uma regressão logística para uma distribuição normal. Como conseqüência, os intervalos de confiança na estrutura logística são simétricos em torno dos valores de logit, assim como na estrutura clássica de regressão linear. A transformação do logit é usada exatamente para permitir o uso de toda a teoria baseada na normalidade em torno da regressão linear.
Depois de fazer a transformação inversa:
logit−1(x)=ex1+ex
Você obtém um intervalo assimétrico novamente. Agora, esses intervalos de confiança são realmente tendenciosos. A cobertura deles não é o que você esperaria, especialmente nos limites da distribuição binomial. No entanto, como ilustração, eles mostram por que é lógico que uma distribuição binomial tenha intervalos de confiança assimétricos.
Um exemplo em 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
Nota : De fato, R usa a distribuição beta, mas isso é completamente equivalente e computacionalmente um pouco mais eficiente. A implementação em R é, portanto, diferente do que mostro aqui, mas fornece exatamente o mesmo resultado.