J'ai la question suivante pour un cours sur lequel je travaille:
Mener une étude Monte Carlo pour estimer les probabilités de couverture de l'intervalle de confiance bootstrap normal standard et de l'intervalle de confiance bootstrap de base. Échantillon d'une population normale et vérifier les taux de couverture empiriques pour la moyenne de l'échantillon.
Les probabilités de couverture pour l'IC bootstrap normal standard sont faciles:
n = 1000;
alpha = c(0.025, 0.975);
x = rnorm(n, 0, 1);
mu = mean(x);
sqrt.n = sqrt(n);
LNorm = numeric(B);
UNorm = numeric(B);
for(j in 1:B)
{
smpl = x[sample(1:n, size = n, replace = TRUE)];
xbar = mean(smpl);
s = sd(smpl);
LNorm[j] = xbar + qnorm(alpha[1]) * (s / sqrt.n);
UNorm[j] = xbar + qnorm(alpha[2]) * (s / sqrt.n);
}
mean(LNorm < 0 & UNorm > 0); # Approximates to 0.95
# NOTE: it is not good enough to look at overall coverage
# Must compute separately for each tail
D'après ce que j'ai appris pour ce cours, l' intervalle de confiance bootstrap de base peut être calculé comme suit:
# Using x from previous...
R = boot(data = x, R=1000, statistic = function(x, i){ mean(x[i]); });
result = 2 * mu - quantile(R$t, alpha, type=1);
Ça a du sens. Ce que je ne comprends pas, c'est comment calculer les probabilités de couverture pour le CI d'amorçage de base. Je comprends que la probabilité de couverture représenterait le nombre de fois que l'IC contient la vraie valeur (dans ce cas mu
). Dois-je simplement exécuter la boot
fonction plusieurs fois?
Comment puis-je aborder cette question différemment?
la source
size=100
une faute de frappe? Je ne crois pas que vous obteniez les bonnes limites supérieure et inférieure, car la taille d'échantillon implicite semble être de 1000 lorsque vous calculez vos IC dans la boucle (puisque vous utilisezsqrt.n
dans le calcul). Aussi, pourquoi comparez-vous àmu
et non directement à 0 (ce dernier étant la vraie moyenne)?smpl = x[sample(1:n, size = 100, replace = TRUE)];
peut être simplifiéesmpl = sample(x, size=100, replace=TRUE)
.mu
0. Le CI normal fonctionne bien, c'est le CI de bootstrap de base avec lequel j'ai du mal.Réponses:
La terminologie n'est probablement pas utilisée de manière cohérente, donc ce qui suit n'est que la façon dont je comprends la question d'origine. D'après ma compréhension, les IC normaux que vous avez calculés ne sont pas ce qui a été demandé. Chaque jeu de répliques bootstrap vous donne un intervalle de confiance, pas plusieurs. La façon de calculer différents types de CI à partir des résultats d'un ensemble de répliques bootstrap est la suivante:
Comme je veux comparer les calculs avec les résultats du packageM⋆ μ S2⋆M σ2M t
boot
, je définis d'abord une fonction qui sera appelée pour chaque réplique. Ses arguments sont l'échantillon d'origine et un vecteur d'index spécifiant les cas pour une seule réplique. Il renvoie , l'estimation du plug-in pour , ainsi que , l'estimation du plug-in pour la variance de la moyenne . Cette dernière ne sera requise que pour le bootstrap -CI. μ S 2 ⋆ M σ 2 M tSans utiliser de package,
boot
vous pouvez simplement utiliserreplicate()
pour obtenir un ensemble de répliques bootstrap.Mais restons sur les résultats de
boot.ci()
pour avoir une référence.Les valeurs basique, percentile et -CI reposent sur la distribution empirique des estimations bootstrap. Pour obtenir les quantiles et , nous trouvons les indices correspondants au vecteur trié des estimations de bootstrap (notez que cela fera une interpolation plus compliquée pour trouver les quantiles empiriques lorsque les indices ne sont pas des nombres naturels) .α / 2 1 - α / 2t α/2 1−α/2
boot.ci()
Pour le -CI, nous avons besoin des estimations bootstrap pour calculer les valeurs critiques . Pour l'IC normal standard, la valeur critique sera juste la valeur de la distribution normale standard.t ⋆ t zt t⋆ t z
Afin d'estimer les probabilités de couverture de ces types de CI, vous devrez exécuter cette simulation plusieurs fois. Enveloppez simplement le code dans une fonction, renvoyez une liste avec les résultats CI et exécutez-la avec
replicate()
comme illustré dans cet essentiel .la source
computeCIs
et appeléresults = replicate(500, computeCIs());
. À la fin,computeCIs
il revientc(ciBasic, ciPerc)
. Pour tester les probabilités de couverture, ne devrais-je pas alors tester pourmean(results[1, ] < 0 & results[2, ] > 0)
tester tous les CI de base contenant la vraie moyenne (la probabilité de couverture)? Quand je lance cela, je reçois1
quand je pense que je devrais obtenir0.95
.pastebin.com/qKpNKK0D
est rompu. J'apprécierais si vous le mettez à jour et fournissez la fonction complète et la simulation complète. Merci