//styles, look here: https://cdnjs.com/libraries/highlight.js/9.12.0

February 22, 2020

630 palavras 3 mins

Bootstrap: uma introdução

Bootstrap é um método de resampling pra obter alguma estatística de um estimador (usualmente). A ideia é que pode ser muito difícil obter a estatística usando uma expressão analítica fechada - ou a expressão analítica só vale assintoticamente. A ideia é bem simples: seja \(x\) representar a coleção dos dados com amostra de tamanho N. O algoritmo é:

  1. Faça uma reamostragem com reposição de x com a amostra de algum tamanho (usualmente N)
  2. Calcule a estatística de interesse nessa nova amostra
  3. Repita 1 e 2 várias vezes

Eu vou começar com um exemplo 100% bobo: vamos calcular o intervalo de confiança de 95% de uma variável Normal(0,1). A gente sabe esse intervalo de cabeça, mas eu vou fazer o exemplo usando bootstrap como ilustração. Eu vou literalmente computar o intervalo de confiança: não vou usar \(\bar{x} \pm 1.96\sigma/\sqrt{N}\) e sim pedir pro R me retornar quem nas replicações é o quantil 2.5% e 0 97.5%. Eu poderia muito bem ter calculado \(\sigma\) via bootstrap e usando a fórmula usando a Normal, mas vamos ignorar totalmente esse fato.

set.seed(2222020)

N <- 100

amostra <- rnorm(N)
med_amostra <- mean(amostra)
sd_amostra <- sd(amostra)/sqrt(N)

media_boot <- rep(NA,5000)

for(i in 1:5000){
  reamostra <- sample(amostra,size=N,replace = T)
  media_boot[i] <- (mean(reamostra) - med_amostra)/sd_amostra
}

quantile(media_boot,probs = c(0.025,0.975))
##      2.5%     97.5% 
## -2.002599  1.928780

Veja que eu roubei e usei a fórmula do intervalo de confiança para corrigir o desvio padrão e a média da estatística de teste para a estatística ter distribuição Normal(0,1). Veja que eu fiz isso de uma maneira super suja - eu usei a média e o desvio padrão amostral e mesmo com N = 100 a estatística ficou perto de 1.96 (pro meu gosto).

A graça de bootstrap obviamente não é calcular intervalo de confiança de uma amostra da Normal, mas sim calcular intervalos de confiança mais difíceis. Um exemplo é da log-normal: uma variável x tem distribuição lognormal se \(x = exp(z)\) e \(z \sim Normal\). Eu vou fazer uma amostra de tamanho 10, mas pelo amor de Deus, nunca conduzam inferência com amostra de tamanho 10, isso é um exemplo:

N <- 10

amostra <- exp(rnorm(N))

media_boot <- rep(NA,5000)

for(i in 1:5000){
  reamostra <- sample(amostra,size=N,replace = T)
  media_boot[i] <- mean(reamostra)
}

quantile(media_boot,probs = c(0.025,0.975))
##      2.5%     97.5% 
## 0.6172898 2.9671246

Veja que a variância da amostra é 2.066108 e isso nos dá um intervalo de confiança usando a regra de bolso da normal de 0.4192072 até 2.9803813. Veja que o intervalo superior até fica bem perto, mas o inferior dá uma diferença de 0.2. Para mostrar que o intervalo bootstrap é melhor, vamos fazer uma simulação monte carlo:

media_mc <- rep(NA,50000)

for(i in 1:50000){
  media_mc[i] <- mean(exp(rnorm(10)))
}

quantile(media_mc,probs = c(0.025,0.975))
##      2.5%     97.5% 
## 0.7518483 3.3449742

Os dois métodos parecem errar o maior valor do intervalo de confiança, mas o bootstrap chega mais perto do valor no intervalo inferior. Veja que se eu aumentar a amostra para 100 o intervalo de confiança dos dois se aproximam:

N <- 100

amostra <- exp(rnorm(N))

media_boot <- rep(NA,5000)

for(i in 1:5000){
  reamostra <- sample(amostra,size=N,replace = T)
  media_boot[i] <- mean(reamostra)
}

quantile(media_boot,probs = c(0.025,0.975))
##     2.5%    97.5% 
## 1.254199 1.863691

Veja que a variância da amostra é 1.5364845 e isso nos dá um intervalo de confiança usando a regra de bolso da normal de 1.2407038 até 1.8430058.

Bootstrap é bem útil, mas não é uma panacéia. Um exemplo de quando é usado é em intervalo de confiação da função resposta a impulso do VAR - as fórmulas analíticas são absolutamente pavorosas. Entretanto, existem várias situações em que o bootstrap não funciona: uma delas é matching. Outros casos precisam de um bootstrap diferente - por exemplo, aqui a reamostragem funciona bem porque é i.i.d., mas se tivessemos dados dependentes a gente precisaria de outra estratégia.