Perché il mio intervallo di bootstrap ha una copertura terribile?


29

Volevo fare una dimostrazione di classe in cui ho confrontato un intervallo t con un intervallo bootstrap e ho calcolato la probabilità di copertura di entrambi. Volevo che i dati provenissero da una distribuzione distorta, quindi ho scelto di generare i dati come exp(rnorm(10, 0, 2)) + 1, un campione di dimensioni 10 da un lognormal spostato. Ho scritto una sceneggiatura per disegnare 1000 campioni e, per ogni campione, calcolare sia un intervallo t del 95% che un intervallo percentuale del bootstrap del 95% sulla base di 1000 replicati.

Quando eseguo lo script, entrambi i metodi danno intervalli molto simili ed entrambi hanno una probabilità di copertura del 50-60%. Sono rimasto sorpreso perché pensavo che l'intervallo di bootstrap sarebbe stato migliore.

La mia domanda è, vero

  • fatto un errore nel codice?
  • fatto un errore nel calcolo degli intervalli?
  • fatto un errore prevedendo che l'intervallo di bootstrap abbia migliori proprietà di copertura?

Inoltre, esiste un modo per costruire un elemento della configurazione più affidabile in questa situazione?

 tCI.total <- 0
 bootCI.total <- 0
 m <- 10 # sample size
 true.mean <- exp(2) + 1

for (i in 1:1000){
 samp <- exp(rnorm(m,0,2)) + 1
 tCI <- mean(samp) + c(1,-1)*qt(0.025,df=9)*sd(samp)/sqrt(10)

 boot.means <- rep(0,1000)
 for (j in 1:1000) boot.means[j] <- mean(sample(samp,m,replace=T))
 bootCI <- sort(boot.means)[c(0.025*length(boot.means), 0.975*length(boot.means))]

 if (true.mean > min(tCI) & true.mean < max(tCI)) tCI.total <- tCI.total + 1
 if (true.mean > min(bootCI) & true.mean < max(bootCI)) bootCI.total <- bootCI.total + 1 
}
tCI.total/1000     # estimate of t interval coverage probability
bootCI.total/1000  # estimate of bootstrap interval coverage probability

3
Le persone spesso dimenticano un altro uso del bootstrap: identificare e correggere i pregiudizi . Ho il sospetto che se dovessi includere una correzione del bias nel bootstrap potresti ottenere prestazioni molto migliori dall'IC.
whuber

@whuber: bel punto, +1. Per quanto ricordo, i metodi Bootstrap e le loro applicazioni di Davison & Hinkley offrono un'introduzione piacevole e accessibile alla correzione del bias e altri miglioramenti sul bootstrap.
S. Kolassa - Ripristina Monica

1
Vale la pena provare le altre varianti di bootstrap, in particolare il bootstrap di base.
Frank Harrell,

3
Il bootstrap è una procedura di grande esempio. non è grande, specialmente per i dati normali del registro . n=10
Cliff AB,

Risposte:


16

La diagnostica e i rimedi Bootstrap di Canto, Davison, Hinkley & Ventura (2006) sembrano essere un logico punto di partenza. Discutono di diversi modi in cui il bootstrap può rompersi e - cosa ancora più importante qui - offrono diagnostica e possibili rimedi:

  1. Valori anomali
  2. Modello di ricampionamento errato
  3. Nonpivotality
  4. Incoerenza del metodo bootstrap

Non vedo un problema con 1, 2 e 4 in questa situazione. Diamo un'occhiata a 3. Come osserva @Ben Ogorek (anche se concordo con @Glen_b che la discussione sulla normalità può essere un'aringa rossa), la validità del bootstrap dipende dalla perno della statistica a cui siamo interessati.

Sezione 4 in Canty et al. suggerisce il ricampionamento all'interno dei campioni per ottenere una misura di bias e varianza per la stima dei parametri all'interno di ciascun campione bootstrap . Ecco il codice per replicare le formule da p. 15 dell'articolo:

library(boot)
m <- 10 # sample size
n.boot <- 1000
inner.boot <- 1000

set.seed(1)
samp.mean <- bias <- vars <- rep(NA,n.boot)
for ( ii in 1:n.boot ) {
    samp <- exp(rnorm(m,0,2)) + 1
    samp.mean[ii] <- mean(samp)
    foo <- boot(samp,statistic=function(xx,index)mean(xx[index]),R=inner.boot)
    bias[ii] <- mean(foo$t[,1])-foo$t0
    vars[ii] <- var(foo$t[,1])
}

opar <- par(mfrow=c(1,2))
    plot(samp.mean,bias,xlab="Sample means",ylab="Bias",
        main="Bias against sample means",pch=19,log="x")
    abline(h=0)
    plot(samp.mean,vars,xlab="Sample means",ylab="Variance",
        main="Variance against sample means",pch=19,log="xy")
par(opar)

diagnostica bootstrap

Nota le scale di registro: senza registri, questo è ancora più evidente. Vediamo bene come la varianza della stima media bootstrap aumenta con la media del campione bootstrap. Questo per me sembra abbastanza una pistola fumante da attribuire la colpa alla non propensione come colpevole della copertura dell'intervallo di scarsa fiducia.

Tuttavia, ammetterò felicemente che si potrebbe dare seguito in molti modi. Ad esempio, potremmo vedere come se l'intervallo di confidenza da un replicato bootstrap specifico includa la media reale dipende dalla media del particolare replicato.

Per quanto riguarda i rimedi, Canty et al. discutere delle trasformazioni e dei logaritmi vengono in mente qui (ad es. bootstrap e costruire intervalli di confidenza non per la media, ma per la media dei dati registrati), ma non sono riuscito a farlo funzionare.

Canty et al. continuare a discutere su come ridurre il numero di bootstrap interni e il rumore rimanente mediante campionamento e smoothing di importanza, nonché aggiungere bande di confidenza ai grafici pivot.

Questo potrebbe essere un divertente progetto di tesi per uno studente intelligente. Gradirei qualsiasi suggerimento su dove ho sbagliato, così come su qualsiasi altra letteratura. E mi prenderò la libertà di aggiungere il diagnostictag a questa domanda.


13

Mentre sono d'accordo con l'analisi e la conclusione di Stephan Kolassa, con la media del campione non è sicuramente un perno approssimativo, lasciatemi fare un'ulteriore osservazione. Ho studiato l'uso di -statistic insieme al bootstrap. Il risultato è stato una copertura di circa 0,8. Non una soluzione completa, ma un miglioramento.

μ^μ
μ^t
mμ^μσ^

Poi ho pensato un po 'di più all'intera configurazione. Con solo 10 osservazioni e una distribuzione estremamente distorta, non è quindi sostanzialmente impossibile stimare in modo non parametrico la media e tanto meno costruire intervalli di confidenza con la giusta copertura?

La distribuzione log-normale considerata ha media . Poiché quando la media è lo -quantile della distribuzione! Significa che la probabilità che tutte e 10 le osservazioni siano più piccole della media è . Quindi, in poco meno del 18% dei casi, l'osservazione più ampia è inferiore alla media. Per ottenere una copertura maggiore di 0,82 abbiamo bisogno di costruire un intervallo di confidenza per la media che si estende oltre l'osservazione più ampia. Ho difficoltà a immaginare come una tale costruzione possa essere fatta (e giustificata) senza presupposti preliminari che la distribuzione sia estremamente distorta. Ma accolgo con favore eventuali suggerimenti. e2+1=8.39P(X2)=0.84XN(0,4)0.840.8410=0.178


Sono d'accordo con te. Volevo davvero pensarci dal punto di vista di qualcuno che ha ottenuto un campione da questa distribuzione. Come potrei sapere che in questo caso non è sicuro usare il bootstrap in modo beato? L'unica cosa a cui riesco a pensare è che avrei potuto prendere i registri prima di fare l'analisi, ma uno degli altri risponditori dice che questo non aiuta davvero.
Flounderer,

1
Non saprai se è sicuro o non sicuro dai soli 10 punti dati. Se si sospetta asimmetria o code pesanti, la soluzione potrebbe essere quella di concentrarsi su un parametro diverso rispetto alla media. Ad esempio il log-mean o la mediana. Questo non ti darà una stima (o intervallo di confidenza) della media a meno che tu non faccia ipotesi aggiuntive, ma potrebbe essere una migliore idea concentrarsi completamente su un parametro che è meno sensibile alle code della distribuzione.
NRH,

6

I calcoli erano corretti, ho fatto un controllo incrociato con il noto boot pack . Inoltre ho aggiunto l'intervallo BCa (di Efron), una versione corretta in bias dell'intervallo di bootstrap percentile:

for (i in 1:1000) {
  samp <- exp(rnorm(m, 0, 2)) + 1

  boot.out <- boot(samp, function(d, i) sum(d[i]) / m, R=999)
  ci <- boot.ci(boot.out, 0.95, type="all")

  ##tCI <- mean(samp) + c(1,-1)*qt(0.025,df=9)*sd(samp)/sqrt(10)
  tCI <- ci$normal[2:3]
      percCI <- ci$perc[4:5]
  bcaCI <- ci$bca[4:5]
      boottCI <- ci$student[4:5]

  if (true.mean > min(tCI) && true.mean < max(tCI)) tCI.total <- tCI.total + 1
  if (true.mean > min(percCI) && true.mean < max(percCI)) percCI.total <- percCI.total + 1 
  if (true.mean > min(bcaCI) && true.mean < max(bcaCI)) bcaCI.total <- bcaCI.total + 1
}

tCI.total/1000     # estimate of t interval coverage probability
0.53
percCI.total/1000  # estimate of percentile interval coverage probability
0.55
bcaCI.total/1000  # estimate of BCa interval coverage probability
0.61

Suppongo che gli intervalli sarebbero molto migliori se la dimensione del campione originale fosse maggiore di 10, diciamo 20 o 50.

Inoltre, il metodo bootstrap-t di solito porta a risultati migliori per le statistiche distorte. Tuttavia ha bisogno di un ciclo nidificato e quindi di 20 volte più tempo di calcolo.

Per il test delle ipotesi è anche molto importante che le coperture su un lato siano buone. Quindi guardare solo le coperture a 2 facciate può spesso essere fuorviante.


1
A seguito del tuo commento sulla dimensione del campione: Buono, nei suoi metodi di ricampionamento (3a edizione, 2006, p. 19) osserva che il bootstrap potrebbe essere instabile per dimensioni del campione . Sfortunatamente, non ho il libro a portata di mano, quindi non posso cercare le sue argomentazioni o riferimenti. n<100
S. Kolassa - Ripristina Monica il

5

Anch'io ero confuso su questo, e ho trascorso molto tempo sui fogli DiCiccio ed Efron del 1996 Bootstrap Confidence Intervals, senza molto da dimostrare.

In realtà mi ha portato a pensare meno al bootstrap come a un metodo generico. Lo pensavo come qualcosa che ti tirerebbe fuori da una marmellata quando eri davvero bloccato. Ma ho imparato il suo sporco piccolo segreto: gli intervalli di confidenza bootstrap sono tutti basati sulla normalità in un modo o nell'altro. Mi permetta di spiegare.

Il bootstrap ti dà una stima della distribuzione campionaria dello stimatore, che è tutto ciò che potresti sperare, giusto? Ma ricorda che il legame classico tra la distribuzione campionaria e l'intervallo di confidenza si basa sulla ricerca di una quantità cardine . Per chiunque sia arrugginito, considera il caso in cui e sono noti. Quindi la quantità è fondamentale, ovvero la sua distribuzione non dipende da . Pertanto, e il resto è storia.

xN(μ,σ2)
σμPr(-1,96x-μ
z=xμσN(0,1)
μPr(1.96xμσ1.96)=0.95

Quando si pensa a ciò che giustifica il fatto che i percentili della distribuzione normale siano correlati agli intervalli di confidenza, si basa interamente su questa conveniente quantità cardine. Per una distribuzione arbitraria, non esiste alcun collegamento teorico tra i percentili della distribuzione di campionamento e gli intervalli di confidenza , e prendere proporzioni grezze della distribuzione di campionamento bootstrap non lo taglia.

Quindi gli intervalli BCa (corretti dal bias) di Efron usano le trasformazioni per arrivare alla normalità approssimativa e i metodi bootstrap-t si basano sul fatto che le statistiche t risultanti sono approssimativamente fondamentali. Ora il bootstrap può stimare l'inferno dei momenti e puoi sempre assumere la normalità e usare lo standard +/- 2 * SE. Ma considerando tutto il lavoro che è andato in modo non parametrico con il bootstrap, non sembra abbastanza giusto, vero?


2
È possibile che mi sia sfuggito qualcosa, ma il fatto che il bootstrap sia associato a quantità pivotal o quasi pivotal non implica di per sé alcuna associazione con la normalità. Le quantità chiave possono avere ogni tipo di distribuzione in circostanze particolari. Inoltre non vedo come segue la frase in corsivo nel tuo secondo ultimo paragrafo.
Glen_b

1
Come segue quindi l'affermazione relativa alla normalità?
Glen_b

1
Poiché ogni distribuzione continua ha una trasformazione esatta in normalità ( è sempre normale normale), sembra che tu abbia appena escluso tutte le distribuzioni continue come radicate in un'approssimazione normale. Φ - 1 [ F ( X ) ]FΦ1[F(X)]
Glen_b

2
Non è banale identificare se non lo sappiamo già; il punto era semplicemente che tali trasformazioni esistono chiaramente. Efron sta cercando di ottenere intervalli migliori; solo perché passa per trasformarsi in quasi normale / crea-un-intervallo / trasforma-ritorno non implica di per sé che stia assumendo una connessione speciale con la normalità. F
Glen_b -Restate Monica

2
Per aggiungere a @Glen_b: la trasformazione in una distribuzione normale deve solo esistere per dimostrare il metodo corretto. Non è necessario trovarlo per utilizzare il metodo. Inoltre, se non ti piacciono le normali distribuzioni, puoi riscrivere l'intera dimostrazione con un'altra distribuzione simmetrica e continua. L'uso di distribuzioni normali è tecnicamente utile, ma non strettamente necessario, non dice nulla sulla fonte dei dati o sulla media del campione.
Peter,

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.