Probabilités de couverture de l'intervalle de confiance bootstrap de base

11

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 bootfonction plusieurs fois?

Comment puis-je aborder cette question différemment?

TheCloudlessSky
la source
Est-ce size=100une 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 utilisez sqrt.ndans le calcul). Aussi, pourquoi comparez-vous à muet non directement à 0 (ce dernier étant la vraie moyenne)?
Cardinal
En outre, smpl = x[sample(1:n, size = 100, replace = TRUE)]; peut être simplifiée smpl = sample(x, size=100, replace=TRUE).
cardinal du
@cardinal - Oui, c'était une faute de frappe et la même chose avec mu0. Le CI normal fonctionne bien, c'est le CI de bootstrap de base avec lequel j'ai du mal.
TheCloudlessSky

Réponses:

16

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:

B    <- 999                  # number of replicates
muH0 <- 100                  # for generating data: true mean
sdH0 <- 40                   # for generating data: true sd
N    <- 200                  # sample size
DV   <- rnorm(N, muH0, sdH0) # simulated data: original sample

Comme je veux comparer les calculs avec les résultats du package 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 tMμSM2σM2t

> getM <- function(orgDV, idx) {
+     bsM   <- mean(orgDV[idx])                       # M*
+     bsS2M <- (((N-1) / N) * var(orgDV[idx])) / N    # S^2*(M)
+     c(bsM, bsS2M)
+ }

> library(boot)                                       # for boot(), boot.ci()
> bOut <- boot(DV, statistic=getM, R=B)
> boot.ci(bOut, conf=0.95, type=c("basic", "perc", "norm", "stud"))
BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
Based on 999 bootstrap replicates
CALL : 
boot.ci(boot.out = bOut, conf = 0.95, type = c("basic", "perc", "norm", "stud"))

Intervals : 
Level      Normal            Basic         Studentized        Percentile    
95%   ( 95.6, 106.0 )   ( 95.7, 106.2 )  ( 95.4, 106.2 )   ( 95.4, 106.0 )  
Calculations and Intervals on Original Scale

Sans utiliser de package, bootvous pouvez simplement utiliser replicate()pour obtenir un ensemble de répliques bootstrap.

boots <- t(replicate(B, getM(DV, sample(seq(along=DV), replace=TRUE))))

Mais restons sur les résultats de boot.ci()pour avoir une référence.

boots   <- bOut$t                     # estimates from all replicates
M       <- mean(DV)                   # M from original sample
S2M     <- (((N-1)/N) * var(DV)) / N  # S^2(M) from original sample
Mstar   <- boots[ , 1]                # M* for each replicate
S2Mstar <- boots[ , 2]                # S^2*(M) for each replicate
biasM   <- mean(Mstar) - M            # bias of estimator M

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α/21α/2boot.ci()

(idx <- trunc((B + 1) * c(0.05/2, 1 - 0.05/2)) # indices for sorted vector of estimates
[1] 25 975

> (ciBasic <- 2*M - sort(Mstar)[idx])          # basic CI
[1] 106.21826  95.65911

> (ciPerc <- sort(Mstar)[idx])                 # percentile CI
[1] 95.42188 105.98103

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 ztttz

# standard normal CI with bias correction
> zCrit   <- qnorm(c(0.025, 0.975))   # z-quantiles from std-normal distribution
> (ciNorm <- M - biasM + zCrit * sqrt(var(Mstar)))
[1] 95.5566 106.0043

> tStar <- (Mstar-M) / sqrt(S2Mstar)  # t*
> tCrit <- sort(tStar)[idx]           # t-quantiles from empirical t* distribution
> (ciT  <- M - tCrit * sqrt(S2M))     # studentized t-CI
[1] 106.20690  95.44878

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 .

caracal
la source
Hou la la! - Super explication sur ce que je faisais mal. Aussi - merci pour les conseils de code! Cela fonctionne parfaitement!
TheCloudlessSky
Ok une dernière question: lorsque j'essaie de répliquer ces informations, j'ai créé une fonction computeCIset appelé results = replicate(500, computeCIs());. À la fin, computeCIsil revient c(ciBasic, ciPerc). Pour tester les probabilités de couverture, ne devrais-je pas alors tester pour mean(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çois 1quand je pense que je devrais obtenir 0.95.
TheCloudlessSky
@TheCloudlessSky Pour la fonction complète et la simulation complète avec les résultats attendus en termes de fréquences de couverture, voir pastebin.com/qKpNKK0D
caracal
Ouais, je suis un idiot:) ... J'ai fait une faute de frappe lors de la copie du code dans R ... merci pour toute votre aide! :)
TheCloudlessSky
Merci @caracal pour la bonne réponse. Le lien pastebin.com/qKpNKK0Dest rompu. J'apprécierais si vous le mettez à jour et fournissez la fonction complète et la simulation complète. Merci
MYaseen208