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_n
da 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_p
IC è 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?
times=100000
alcune 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 hatimes=1000000
dato.954931
come risultato.