Questa confusione tra le procedure di bootstrap e le procedure di Monte Carlo continua a ripetersi, quindi forse questo è un posto adatto come qualsiasi altro per affrontarlo. (Anche gli esempi di R
codice possono aiutare a fare i compiti.)
Considera questa implementazione del bootstrap in R
:
boot <- function(x, t) { # Exact bootstrap of procedure t on data x
n <- length(x) # Must lie between 2 and 7 inclusive.
if (n > 7) {
stop("Sample size exceeds 7; use an approximate method instead.")
}
p <- c(n, 1:(n-1))
a <- rep(x, n^(n-1))
dim(a) <- rep(n, n)
y <- as.vector(a)
while (n > 1) {
n <- n-1
a <- aperm(a, p)
y <- cbind(as.vector(a), y)
}
apply(y, 1, t)
}
Una rapida occhiata confermerà che si tratta di un calcolo deterministico : non vengono generati o utilizzati valori casuali. (Lascerò i dettagli del suo funzionamento interiore affinché i lettori interessati possano capire da soli.)
Gli argomenti boot
sono un batch di dati numerici nella matrice x
e un riferimento t
a una funzione (che può essere applicata ad array esattamente come x
) per restituire un singolo valore numerico; in altre parole, t
è una statistica . Genera tutti i possibili campioni con sostituzione da x
e si applica t
a ciascuno di essi, producendo così un numero per ciascuno di tali campioni: questo è il bootstrap in breve. Il valore restituito è un array che rappresenta l' esatta distribuzione bootstrap di t
per il campione x
.
Come piccolo esempio , bootstrap la media per un esempio x
= c(1,3)
:
> boot(c(1,3), mean)
> [1] 1 2 2 3
Esistono davvero quattro possibili campioni di dimensione con sostituzione da ; vale a dire, , , e . li genera tutti (nell'ordine appena elencato) e si applica a ciascuno di essi. In questo caso calcola la media e quelli risultano rispettivamente , , e , come mostrato nell'output.( 1 , 3 ) ( 1 , 1 ) ( 1 , 3 ) ( 3 , 1 ) ( 3 , 3 ) 1 2 2 32( 1 , 3 )( 1 , 1 )( 1 , 3 )( 3 , 1 )(3,3)boot
t
t
1223
La posizione da qui dipende da come si desidera utilizzare il bootstrap. Le informazioni complete sul bootstrap sono contenute in questo array di output, quindi di solito è una buona idea visualizzarlo. Ecco un esempio in cui la deviazione standard viene dal campione :(1,3,3,4,7)
hist(boot(c(1,3,3,4,7), sd))
Ora siamo pronti a parlare della simulazione Monte Carlo. Supponiamo, diciamo, che avremmo avviato un limite di confidenza superiore del 95% sulla SD da un campione di usando il 95 ° percentile superiore della sua distribuzione bootstrap. Quali proprietà avrebbe questa procedura? Un modo per scoprirlo è supporre che i campioni siano stati ottenuti in modo casuale, per esempio, da una distribuzione uniforme. (L'applicazione indicherà spesso quale possa essere una ragionevole ipotesi distributiva; qui, ho scelto arbitrariamente una che è semplice per il calcolo ma non facile da trattare analiticamente.) Possiamo simulare ciò che accade prendendo un campione del genere e calcolando l'UCL:5
> set.seed(17)
> quantile(boot(runif(5, min=0, max=10), sd), .95)[1]
95%
3.835870
Il risultato per questo particolare campione casuale è 3.83587. Questo è definito: se dovessi chiamare di boot
nuovo con lo stesso set di dati, la risposta sarebbe esattamente la stessa. Ma come potrebbe cambiare la risposta con diversi campioni casuali? Scoprilo ripetendo questo processo alcune volte e disegnando un istogramma dei risultati:
> boot.sd <- replicate(100, quantile(boot(runif(5, min=0, max=10), sd), .95)[1])
> hist(boot.sd)
Se dovessimo fare un altro set di simulazioni, i disegni casuali verrebbero fuori diversi, creando un istogramma (leggermente) diverso - ma non molto diverso da questo. Possiamo usarlo con una certa sicurezza per capire come funziona il bootstrap UCL della SD. Per riferimento, si noti che la deviazione standard di una distribuzione uniforme (che va da a come specificato qui) è uguale a . Come si aspetterebbe che qualsiasi UCL valga il suo sale, la maggioranza (tre quarti, o 0,75) dei valori nell'istogramma supera questo:10 10 / √01010/12−−√≈2.887
> length(boot.sd[boot.sd >= 10/sqrt(12)]) / length(boot.sd)
[1] 0.75
Ma questo non è affatto vicino al 95% nominale che abbiamo specificato (e speravamo)! Questo è un valore della simulazione: confronta le nostre speranze con ciò che sta realmente accadendo. (Perché la discrepanza? Credo che sia perché il bootstrap di una SD non funziona bene con campioni veramente piccoli.)
Revisione
Le statistiche Bootstrap sono concettualmente le stesse di qualsiasi altra statistica come una deviazione media o standard; tendono a impiegare molto tempo per il calcolo. (Vedi il messaggio di avviso nel boot
codice!)
La simulazione Monte-Carlo può essere utile per studiare come varia una statistica bootstrap a causa della casualità nell'ottenere campioni. La variazione osservata in tale simulazione è dovuta alla variazione nei campioni, non alla variazione nel bootstrap.
(Non illustrato qui) Poiché le statistiche bootstrap possono richiedere molti calcoli (apparentemente, fino a calcoli per campioni di dimensione ), è conveniente approssimare la distribuzione bootstrap. Questo di solito viene fatto creando un programma "black box" per ottenere un valore a caso dalla vera distribuzione bootstrap e chiamare ripetutamente quel programma. L'output collettivo approssima l'esatta distribuzione. L'approssimazione può variare a causa della casualità nella casella nera, ma tale variazione è un artefatto della procedura di approssimazione. Non è (concettualmente) inerente alla stessa procedura bootstrap. nnnn