Problemas com um estudo de simulação da explicação de experimentos repetidos de um intervalo de confiança de 95% - onde estou errado?


9

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_nde uma distribuição de Bernoulli com probabilidade pop_pe 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_pestiver 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_pestá 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?


(+1) A propósito, refiz o código novamente times=100000algumas 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 com times=1000000deu .954931como resultado.
Macro

3
np

2
Para apoiar os cardeais, comentem que as probabilidades binomiais exatas são exatas porque são baseadas em um cálculo exato de probabilidade, mas não fornecem necessariamente o nível exato de confiança. Isso ocorre porque o binômio é uma distribuição discreta. Portanto, Clopper-Pearson escolhe o ponto final do intervalo para que você tenha a probabilidade mais próxima do nível de confiança igual ou superior a ele. Isso também cria um comportamento serrilhado para a função de potência de um teste binomial exato. Esse resultado estranho, porém básico, é discutido em meu artigo com Christine Liu no American Statistician (2002).
Michael R. Chernick 06/07/12

11
Detalhes sobre o meu papel neste link: citeulike.org/user/austin987/article/7571878
Michael R. Chernick

3
1 1-α1 1-α 1 1-α1 1-α

Respostas:


9

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.

p <- 0.3
n <- 1000

# Normal test
CI <- sapply(0:n, function(m) prop.test(m,n)$conf.int[1:2])
caught.you <- which(CI[1,] <= p & p <= CI[2,])
coverage.pr <- sum(dbinom(caught.you - 1, n, p))

# Clopper-Pearson
CI <- sapply(0:n, function(m) binom.test(m,n)$conf.int[1:2])
caught.you.again <- which(CI[1,] <= p & p <= CI[2,])
coverage.cp <- sum(dbinom(caught.you.again - 1, n, p))

Isso produz a seguinte saída.

> coverage.pr
[1] 0.9508569

> coverage.cp
[1] 0.9546087

11
" 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 " - aparte, talvez, a possibilidade (um tanto estranha) de intervalos aleatórios . (Pelo menos dessa forma, ele pode ser feito, embora possa muito bem ser que, geralmente, não deveria .)
Glen_b -Reinstate Monica

2
@Glen_b Há muito tempo estou curioso sobre as objeções a decisões aleatórias. Acredito que Jack Kiefer observou que, se você estiver bem usando a randomização para coletar suas amostras, não terá problemas em usá-lo no processo de decisão. Se você precisar de um procedimento de decisão que seja reproduzível, documentado e difícil de enganar, basta gerar quaisquer valores aleatórios necessários para o intervalo aleatório antes coleta dos dados - faça parte do design.
whuber
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.