Próbuję napisać skrypt R, aby zasymulować interpretację powtarzanych eksperymentów z 95% przedziałem ufności. Przekonałem się, że przecenia on odsetek przypadków, w których prawdziwa wartość populacyjna części jest zawarta w 95% CI próby. Niewielka różnica - około 96% vs 95%, ale to mnie jednak zainteresowało.
Moja funkcja pobiera próbkę samp_n
z rozkładu Bernoulliego z prawdopodobieństwem pop_p
, a następnie oblicza 95% przedział ufności za prop.test()
pomocą korekcji ciągłości, a dokładniej za pomocą binom.test()
. Zwraca 1, jeśli prawdziwy odsetek populacji pop_p
zawiera się w 95% CI. Napisałem dwie funkcje, jedną, która używa prop.test()
i jedną, która używa binom.test()
i przyniosła podobne wyniki dla obu:
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)
}
}
Przekonałem się, że kiedy powtórzysz eksperyment kilka tysięcy razy, odsetek przypadków, gdy pop_p
mieści się w 95% CI próbki, jest bliższy 0,96 niż 0,95.
set.seed(1234)
times = 10000
results <- replicate(times, in_conf_int_binom())
sum(results) / times
[1] 0.9562
Moje dotychczasowe przemyślenia na temat tego, dlaczego tak się dzieje
- mój kod jest nieprawidłowy (ale często go sprawdzałem)
- Początkowo myślałem, że to z powodu normalnego problemu z przybliżeniem, ale potem znalazłem
binom.test()
Jakieś sugestie?
times=100000
kilka razy i zobaczyłem ten sam wynik. Jestem ciekawy, czy ktoś ma na to wytłumaczenie. Kod jest wystarczająco prosty, że jestem prawie pewien, że nie ma błędu kodowania. Ponadto jeden przebieg ztimes=1000000
podał.954931
jako wynik.