Estou tentando escrever um script R para simular a interpretação de experimentos repetidos de um intervalo de confiança de 95%. Descobri que superestima a proporção de vezes em que o verdadeiro valor populacional de uma proporção está contido no IC de 95% da amostra. Não é uma grande diferença - cerca de 96% vs 95%, mas isso me interessou.
Minha função obtém uma amostra samp_n
de uma distribuição de Bernoulli com probabilidade pop_p
e calcula um intervalo de confiança de 95% prop.test()
usando a correção de continuidade ou, mais exatamente, com binom.test()
. Retorna 1 se a verdadeira proporção da população pop_p
estiver contida no IC de 95%. Eu escrevi duas funções, uma que usa prop.test()
e outra que usa binom.test()
e teve resultados semelhantes com ambas:
in_conf_int_normal <- function(pop_p = 0.3, samp_n = 1000, correct = T){
## uses normal approximation to calculate confidence interval
## returns 1 if the CI contain the pop proportion
## returns 0 otherwise
samp <- rbinom(samp_n, 1, pop_p)
pt_result <- prop.test(length(which(samp == 1)), samp_n)
lb <- pt_result$conf.int[1]
ub <- pt_result$conf.int[2]
if(pop_p < ub & pop_p > lb){
return(1)
} else {
return(0)
}
}
in_conf_int_binom <- function(pop_p = 0.3, samp_n = 1000, correct = T){
## uses Clopper and Pearson method
## returns 1 if the CI contain the pop proportion
## returns 0 otherwise
samp <- rbinom(samp_n, 1, pop_p)
pt_result <- binom.test(length(which(samp == 1)), samp_n)
lb <- pt_result$conf.int[1]
ub <- pt_result$conf.int[2]
if(pop_p < ub & pop_p > lb){
return(1)
} else {
return(0)
}
}
Descobri que quando você repete o experimento alguns milhares de vezes, a proporção de vezes em que pop_p
está dentro do IC de 95% da amostra fica mais próxima de 0,96, em vez de 0,95.
set.seed(1234)
times = 10000
results <- replicate(times, in_conf_int_binom())
sum(results) / times
[1] 0.9562
Meus pensamentos até agora sobre por que isso pode ser o caso são
- meu código está errado (mas eu verifiquei muito)
- Inicialmente, pensei que isso se devia ao problema normal de aproximação, mas depois descobri
binom.test()
Alguma sugestão?
fonte
times=100000
algumas vezes e vi o mesmo resultado. Estou curioso para ver se alguém tem uma explicação para isso. O código é suficientemente simples que eu tenho certeza que não há erro de codificação. Além disso, uma execução comtimes=1000000
deu.954931
como resultado.Respostas:
Você não está errado. Simplesmente não é possível construir um intervalo de confiança para uma proporção binomial que sempre tenha cobertura de exatamente 95% devido à natureza discreta do resultado. O intervalo Clopper-Pearson ('exato') é garantido para ter uma cobertura de pelo menos 95%. Outros intervalos têm cobertura próxima a 95%, em média , quando a média é calculada sobre a proporção real.
Eu tendem a favorecer o intervalo de Jeffreys, pois ele tem uma cobertura próxima a 95% em média e (ao contrário do intervalo de pontuação de Wilson) uma cobertura aproximadamente igual nas duas caudas.
Com apenas uma pequena alteração no código da pergunta, podemos calcular a cobertura exata sem simulação.
Isso produz a seguinte saída.
fonte