Probabilità di copertura dell'intervallo di confidenza del bootstrap di base


11

Ho la seguente domanda per un corso a cui sto lavorando:

Effettuare uno studio Monte Carlo per stimare le probabilità di copertura dell'intervallo di confidenza bootstrap normale standard e dell'intervallo di confidenza bootstrap di base. Campionare da una popolazione normale e verificare i tassi di copertura empirica per la media del campione.

Le probabilità di copertura per il normale CI di bootstrap standard sono facili:

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

Da quanto mi è stato insegnato per questo corso, l' intervallo di confidenza di base del bootstrap può essere calcolato in questo modo:

# 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);

Ha senso. Quello che non capisco è come calcolare le probabilità di copertura per la CI di bootstrap di base. Comprendo che la probabilità di copertura rappresenterebbe il numero di volte in cui l'IC contiene il valore reale (in questo caso mu). Eseguo semplicemente la bootfunzione più volte?

Come posso affrontare questa domanda in modo diverso?


È il vostro size=100un errore di battitura? Non credo che tu stia ottenendo i limiti superiore e inferiore giusti poiché la dimensione del campione implicita sembra essere 1000 quando calcoli i tuoi EC nel ciclo (dal momento che usi sqrt.nnel calcolo). Inoltre, perché stai confrontando mue non 0 direttamente (quest'ultimo è la vera media)?
cardinale

Inoltre, smpl = x[sample(1:n, size = 100, replace = TRUE)]; può essere semplificato smpl = sample(x, size=100, replace=TRUE).
cardinale

@cardinal - Sì, è stato un errore di battitura e lo stesso muè 0. Il normale CI funziona bene, è il CI di bootstrap di base con cui ho difficoltà.
TheCloudlessSky

Risposte:


16

La terminologia probabilmente non viene utilizzata in modo coerente, quindi il seguente è solo il modo in cui capisco la domanda originale. Da quanto ho capito, i normali EC che hai calcolato non sono quelli che ti sono stati richiesti. Ogni set di replicati bootstrap ti dà un intervallo di confidenza, non molti. Il modo per calcolare diversi tipi di elementi della configurazione dai risultati di un set di replicati bootstrap è il seguente:

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

bootMμ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

Senza usare il pacchetto bootpuoi semplicemente usare replicate()per ottenere un set di replicati bootstrap.

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

Ma rimaniamo con i risultati boot.ci()per avere un riferimento.

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

tα/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

tttz

# 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

Per stimare le probabilità di copertura di questi tipi di elementi della configurazione, dovrai eseguire questa simulazione molte volte. Basta racchiudere il codice in una funzione, restituire un elenco con i risultati CI ed eseguirlo replicate()come mostrato in questa sintesi .


Wow! - Fantastica spiegazione su cosa stavo facendo di sbagliato. Inoltre, grazie per i suggerimenti sul codice! Funziona perfettamente!
TheCloudlessSky

Ok un'ultima domanda: quando provo a replicare queste informazioni, ho creato una funzione computeCIse ho chiamato results = replicate(500, computeCIs());. Alla fine computeCIsritorna c(ciBasic, ciPerc). Per testare le probabilità di copertura, non dovrei quindi provare per mean(results[1, ] < 0 & results[2, ] > 0)verificare tutti gli IC di base che contengono la media reale (la probabilità di copertura)? Quando corro questo, ottengo 1quando penso che dovrei ottenere 0.95.
TheCloudlessSky

@TheCloudlessSky Per la funzione completa e la simulazione completa con i risultati previsti in termini di frequenze di copertura, consultare pastebin.com/qKpNKK0D
caracal

Sì, sono un idiota:) ... Ho fatto un refuso quando ho copiato il codice in R ... grazie per tutto il tuo aiuto! :)
TheCloudlessSky

Grazie @caracal per la bella risposta. Il collegamento pastebin.com/qKpNKK0Dè interrotto. Ti sarei grato se lo aggiornassi e fornissi la funzione completa e la simulazione completa. Grazie
MYaseen208
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.