Essa confusão entre os procedimentos de autoinicialização e os procedimentos de Monte Carlo permanece recorrente, portanto, talvez este seja o melhor lugar para resolver isso. (Os exemplos de R
código também podem ajudar na lição de casa.)
Considere esta implementação do bootstrap em 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)
}
Uma rápida olhada confirmará que este é um cálculo determinístico : nenhum valor aleatório é gerado ou usado. (Deixarei os detalhes de seu funcionamento interno para os leitores interessados descobrirem por si mesmos.)
Os argumentos para boot
são um lote de dados numéricos na matriz x
e uma referência t
a uma função (que pode ser aplicada a matrizes exatamente como x
) para retornar um único valor numérico; em outras palavras, t
é uma estatística . Ele gera todas as amostras possíveis com substituição x
e aplica t
- se a cada uma delas, produzindo um número para cada amostra: essa é a inicialização em poucas palavras. O valor de retorno é uma matriz que representa a distribuição exata de autoinicialização da t
amostra x
.
Como um pequeno exemplo , vamos inicializar a média para uma amostra x
= c(1,3)
:
> boot(c(1,3), mean)
> [1] 1 2 2 3
2(1,3)(1,1)(1,3)(3,1)(3,3)boot
t
t
1223, respectivamente, conforme mostrado na saída.
(1,3,3,4,7)
hist(boot(c(1,3,3,4,7), sd))
5
> set.seed(17)
> quantile(boot(runif(5, min=0, max=10), sd), .95)[1]
95%
3.835870
O resultado para esta amostra aleatória específica é 3.83587. Isso é definitivo: se você ligasse boot
novamente com o mesmo conjunto de dados, a resposta seria exatamente a mesma. Mas como a resposta pode mudar com diferentes amostras aleatórias? Descubra repetindo esse processo algumas vezes e desenhando um histograma dos resultados:
> boot.sd <- replicate(100, quantile(boot(runif(5, min=0, max=10), sd), .95)[1])
> hist(boot.sd)
01010/12−−√≈2.887
> length(boot.sd[boot.sd >= 10/sqrt(12)]) / length(boot.sd)
[1] 0.75
Mas isso não chega nem perto dos 95% nominais especificados (e esperávamos)! Esse é um valor da simulação: ele compara nossas esperanças com o que realmente está acontecendo. (Por que a discrepância? Eu acredito que é porque a inicialização de um SD não funciona bem com amostras muito pequenas.)
Reveja
As estatísticas de bootstrap são conceitualmente iguais a qualquer outra estatística, como uma média ou desvio padrão; eles tendem a demorar muito tempo para calcular. (Veja a mensagem de aviso no boot
código!)
A simulação de Monte-Carlo pode ser útil para estudar como uma estatística de bootstrap varia devido à aleatoriedade na obtenção de amostras. A variação observada nessa simulação é devida à variação nas amostras, não à variação no bootstrap.
nnn