J'essaie d'écrire un script R pour simuler l'interprétation des expériences répétées d'un intervalle de confiance à 95%. J'ai trouvé qu'il surestime la proportion de fois où la valeur réelle de la population d'une proportion est contenue dans l'IC à 95% de l'échantillon. Pas une grande différence - environ 96% vs 95% mais cela m'intéresse néanmoins.
Ma fonction prend un échantillon samp_n
d'une distribution de Bernoulli avec probabilité pop_p
, puis calcule un intervalle de confiance à 95% en prop.test()
utilisant la correction de continuité, ou plus exactement avec binom.test()
. Il renvoie 1 si la véritable proportion de la population pop_p
est contenue dans l'IC à 95%. J'ai écrit deux fonctions, une qui utilise prop.test()
et une qui utilise binom.test()
et a eu des résultats similaires avec les deux:
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)
}
}
J'ai constaté que lorsque vous répétez l'expérience plusieurs milliers de fois, la proportion de fois où le pop_p
est dans l'IC à 95% de l'échantillon est plus proche de 0,96 plutôt que de 0,95.
set.seed(1234)
times = 10000
results <- replicate(times, in_conf_int_binom())
sum(results) / times
[1] 0.9562
Jusqu'à présent, mes réflexions sur les raisons pour lesquelles cela peut être le cas
- mon code est faux (mais je l'ai beaucoup vérifié)
- J'ai d'abord pensé que cela était dû au problème d'approximation normal, mais j'ai trouvé
binom.test()
Aucune suggestion?
la source
times=100000
plusieurs reprises et j'ai vu le même résultat. Je suis curieux de voir si quelqu'un a une explication à cela. Le code est suffisamment simple pour que je sois certain qu'il n'y a pas d'erreur de codage. Aussi, un run avectimes=1000000
donné.954931
comme résultat.Réponses:
Vous ne vous trompez pas. Il n'est tout simplement pas possible de construire un intervalle de confiance pour une proportion binomiale qui a toujours une couverture d' exactement 95% en raison de la nature discrète du résultat. L'intervalle Clopper-Pearson («exact») est garanti d'avoir une couverture d' au moins 95%. D'autres intervalles ont une couverture plus proche de 95% en moyenne , lorsqu'ils sont moyennés sur la vraie proportion.
J'ai tendance à favoriser moi-même l'intervalle de Jeffreys, car il a une couverture proche de 95% en moyenne et (contrairement à l'intervalle de score de Wilson) une couverture à peu près égale dans les deux queues.
Avec seulement un petit changement dans le code de la question, nous pouvons calculer la couverture exacte sans simulation.
Cela donne la sortie suivante.
la source