Problemi con uno studio di simulazione della spiegazione degli esperimenti ripetuti di un intervallo di confidenza del 95% - dove sbaglio?


9

Sto cercando di scrivere uno script R per simulare l'interpretazione ripetuta degli esperimenti di un intervallo di confidenza al 95%. Ho scoperto che sopravvaluta la percentuale di volte in cui il valore reale della popolazione di una proporzione è contenuto nell'IC del 95% del campione. Non una grande differenza - circa il 96% contro il 95%, ma questo mi ha comunque interessato.

La mia funzione preleva un campione samp_nda una distribuzione di Bernoulli con probabilità pop_p, quindi calcola un intervallo di confidenza del 95% prop.test()usando la correzione della continuità, o più esattamente con binom.test(). Restituisce 1 se la percentuale di popolazione effettiva pop_pè contenuta nell'IC 95%. Ho scritto due funzioni, una che utilizza prop.test()e una che utilizza binom.test()e ha avuto risultati simili con entrambi:

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)
    }
 }

Ho scoperto che quando ripeti l'esperimento alcune migliaia di volte, la proporzione di volte in cui l' pop_pIC è all'interno del 95% del campione è più vicina a 0,96 anziché a 0,95.

set.seed(1234)
times = 10000
results <- replicate(times, in_conf_int_binom())
sum(results) / times
[1] 0.9562

I miei pensieri finora sul perché questo potrebbe essere il caso sono

  • il mio codice è sbagliato (ma l'ho verificato molto)
  • Inizialmente ho pensato che ciò fosse dovuto al normale problema di approssimazione, ma poi ho scoperto binom.test()

Eventuali suggerimenti?


(+1) A proposito, ho eseguito nuovamente il codice con times=100000alcune volte diverse e ho visto lo stesso risultato. Sono curioso di vedere se qualcuno ha una spiegazione per questo. Il codice è sufficientemente semplice da essere abbastanza sicuro che non ci siano errori di codifica. Inoltre, una corsa con ha times=1000000dato .954931come risultato.
Macro,

3
(+1) Ma perché prevedi di ottenere esattamente il 95%? Clopper Pearson, ad esempio, è garantito per essere conservatore. Per il tuo e , capisco che l'IC dovrebbe coprire il vero valore del 95,3648% delle volte. pnp
cardinale il

2
Per supportare i cardinali commentare le esatte probabilità binomiali sono esatte perché si basano su un calcolo esatto delle probabilità ma non forniscono necessariamente l'esatto livello di confidenza. Questo perché il binomio è una distribuzione discreta. Quindi Clopper-Pearson sceglie l'endpoint per l'intervallo in modo da avere la probabilità più vicina al livello di confidenza al di sopra o al di sopra di esso. Ciò crea anche un comportamento a dente di sega per la funzione di potenza di un test binomiale esatto. Questo risultato strano ma fondamentale è discusso nel mio articolo con Christine Liu nell'American Statistician (2002).
Michael R. Chernick,

1
Dettagli sul mio documento a questo link: citeulike.org/user/austin987/article/7571878
Michael R. Chernick,

3
I CI binomiali esatti sono "esatti" perché la loro prestazione effettiva è uguale alla loro prestazione nominale, non perché il calcolo della probabilità è "esatto"! Deve essere chiaro che un CI deve avere almeno una probabilità di coprire il vero parametro, indipendentemente dalla distribuzione sottostante (all'interno della famiglia presunta). "Esatto" significa che l'influenza di tutte queste coperture, rilevata sull'intera famiglia di distribuzioni, è uguale a . Per raggiungere questo obiettivo, la copertura effettiva per molte delle possibili distribuzioni deve essere spesso maggiore di . 1 - α 1 - α 1 - α1α1α 1α1α
whuber

Risposte:


9

Non sbagli. Semplicemente non è possibile costruire un intervallo di confidenza per una proporzione binomiale che ha sempre una copertura esattamente del 95% a causa della natura discreta del risultato. L'intervallo Clopper-Pearson ('esatto') è garantito per avere una copertura di almeno il 95%. Altri intervalli hanno una copertura più vicina al 95% in media , se mediata rispetto alla proporzione reale.

Tendo a favorire personalmente l'intervallo Jeffreys, poiché ha una copertura vicino al 95% in media e (a differenza dell'intervallo del punteggio Wilson) una copertura approssimativamente uguale in entrambe le code.

Con solo una piccola modifica del codice nella domanda, possiamo calcolare l'esatta copertura senza simulazione.

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))

Questo produce il seguente output.

> coverage.pr
[1] 0.9508569

> coverage.cp
[1] 0.9546087

1
" Semplicemente non è possibile costruire un intervallo di confidenza per una proporzione binomiale che ha sempre una copertura esattamente del 95% a causa della natura discreta del risultato " --- a parte, forse, per la (piuttosto strana) possibilità di intervalli randomizzati . (Almeno in questo modo, può essere fatto, anche se può darsi che di solito non dovrebbe .)
Glen_b -Reinstate Monica

2
@Glen_b Sono stato a lungo curioso delle obiezioni alle decisioni casuali. Credo che Jack Kiefer abbia osservato che se stai usando la randomizzazione per raccogliere i tuoi campioni, non dovresti avere problemi a usarli nel processo decisionale. Se hai bisogno di una procedura di decisione che sia riproducibile, documentata e difficile da imbrogliare, genera semplicemente i valori casuali necessari per l'intervallo randomizzato prima di raccogliere i dati: rendili parte del progetto.
whuber
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.