Ich versuche, ein R-Skript zu schreiben, um die wiederholte Interpretation eines 95% -Konfidenzintervalls zu simulieren. Ich habe festgestellt, dass es den Anteil der Zeiten überschätzt, in denen der wahre Populationswert eines Anteils im 95% -KI der Stichprobe enthalten ist. Kein großer Unterschied - ungefähr 96% gegenüber 95%, aber das hat mich trotzdem interessiert.
Meine Funktion entnimmt samp_n
mit Wahrscheinlichkeit eine Stichprobe aus einer Bernoulli-Verteilung pop_p
und berechnet dann ein 95% -Konfidenzintervall unter prop.test()
Verwendung der Kontinuitätskorrektur oder genauer mit binom.test()
. Es wird 1 zurückgegeben, wenn der wahre Bevölkerungsanteil pop_p
im 95% -KI enthalten ist. Ich habe zwei Funktionen geschrieben, eine, die verwendet, prop.test()
und eine, die binom.test()
ähnliche Ergebnisse verwendet und mit beiden erzielt hat:
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)
}
}
Ich habe festgestellt, dass, wenn Sie das Experiment einige tausend Mal wiederholen, der Anteil der Fälle, in denen der Wert pop_p
innerhalb des 95% -KI der Probe liegt, eher bei 0,96 als bei 0,95 liegt.
set.seed(1234)
times = 10000
results <- replicate(times, in_conf_int_binom())
sum(results) / times
[1] 0.9562
Meine bisherigen Gedanken darüber, warum dies der Fall sein könnte, sind
- Mein Code ist falsch (aber ich habe ihn oft überprüft)
- Ich dachte zunächst, dass dies auf das normale Approximationsproblem zurückzuführen ist, fand es dann aber
binom.test()
Irgendwelche Vorschläge?
times=100000
ein paar Mal wiederholt und das gleiche Ergebnis gesehen. Ich bin gespannt, ob jemand eine Erklärung dafür hat. Der Code ist so einfach, dass ich mir ziemlich sicher bin, dass kein Codierungsfehler vorliegt. Auch ein Lauf mittimes=1000000
gab.954931
als Ergebnis.