Na Inferencial Clássica, o objetivo central é aprender sobre um parâmetro populacional desconhecido \(\theta\) a partir de uma amostra observada \(\boldsymbol{X} = (X_1, X_2, \dots, X_n)\) extraída de uma população com distribuição de probabilidade \(F\).
Para avaliar a precisão de um estimador \(\hat{\theta} = T(X_1, X_2, \dots, X_n)\) precisamos conhecer sua distribuição amostral. Tradicionalmente, isso é feito por meio de dois caminhos:
Na prática das ciências aplicadas e da análise de dados moderna, esses caminhos frequentemente falham devido a:
Proposto por Bradley Efron em 1979, o Método Bootstrap é uma técnica computacional intensiva de reamostragem não paramétrica.
A analogia conceitual do Bootstrap baseia-se na seguinte substituição do “Mundo Real” pelo “Mundo Bootstrap”:
A Amostra Observada (\(\boldsymbol{X}\)) atua como se fosse a População Desconhecida.
A Distribuição Empírica (\(\widehat{F}_n\)) atua como a aproximação da Distribuição verdadeira \(F\).
As Reamostras Bootstrap (\(\boldsymbol{X}^*\)) obtidas por amostragem com reposição de \(\boldsymbol{X}\) atuam como Amostras originais.
Dada uma amostra \(X_1, X_2, \dots, X_n\) de variáveis aleatórias independentes e identicamente distribuídas (i.i.d.) com função de distribuição acumulada (f.d.a.) \(F(x) = P(X \le x)\), a Função de Distribuição Acumulada Empírica \(\widehat{F}_n(x)\) é definida por:
\[ \widehat{F}_n(x) = \frac{1}{n} \sum_{i=1}^{n} \mathbb{I}(X_i \le x) \]
onde \(\mathbb{I}(\cdot)\) é a função indicadora, que assume o valor \(1\) se a condição do argumento for verdadeira e \(0\) caso contrário.
Vamos determinar a função de distribuição empírica para a seguinte amostra de tamanho \(n=5\):
\[2, \quad 3, \quad 8, \quad 13, \quad 6\]
Ordenando a amostra: \(2, \quad 3, \quad 6, \quad 8, \quad 13\).
Encontrando a função de distribuição empírica:
\[\widehat{F}_n(x) = \begin{cases} 0 & \text{se } x < 2 \\ 1/5 = 0{,}2 & \text{se } 2 \le x < 3 \\ 2/5 = 0{,}4 & \text{se } 3 \le x < 6 \\ 3/5 = 0{,}6 & \text{se } 6 \le x < 8 \\ 4/5 = 0{,}8 & \text{se } 8 \le x < 13 \\ 1 & \text{se } x \ge 13 \end{cases}\]
Note que a função \(\widehat{F}_n\) dá peso \(1/n\) para cada ponto \(x_i\) observado na amostra.
De fato, pode-se provar as seguintes propriedades para a Função de Distribuição Empírica:
Esperança e Variância: Para qualquer \(x \in \mathbb{R}\) fixo, a variável \(n \widehat{F}_n(x) \sim \text{Binomial}(n, F(x))\). Consequentemente: \[ \mathbb{E}[\widehat{F}_n(x)] = F(x) \] \[ \text{Var}(\widehat{F}_n(x)) = \frac{F(x)(1 - F(x))}{n} \]
Consistência (Teorema de Glivenko-Cantelli): Conhecido como o Teorema Fundamental da Estatística, o resultado estabelece que \(\widehat{F}_n\) converge uniformemente para \(F\) quase certamente quando \(n \to \infty\): \[ \sup_{x \in \mathbb{R}} \vert{}\widehat{F}_n(x) - F(x)\vert{} \xrightarrow{\text{q.s.}} 0 \] Para mais detalhes, consulte Billingsley (1995).
De acordo com Robert & Casella (2004), as técnicas de Bootstrap1 são um conjunto de métodos computacionalmente intensivos baseados na reamostragem a partir dos dados observados. Elas foram introduzidas originalmente por Efron (1979) e são descritas de forma mais completa em Efron (1982), Efron e Tibshirani (1994) ou Hjorth (1994).
A ideia básica do Bootstrap é avaliar as propriedades de um estimador arbitrário \(\hat{\theta} = T(X_1, \dots, X_n)\) por meio da função de distribuição acumulada (f.d.a.) empírica da amostra \(X_1, \dots, X_n\):
\[ \widehat{F}_n(x) = \frac{1}{n} \sum_{i=1}^{n} \mathbb{I}(X_i \le x) \]
em vez da f.d.a. teórica \(F\).
Mais precisamente, se desejamos uma estimativa de \[\theta(F) = \int h(x) \, dF(x),\] um candidato óbvio é \[\theta(\widehat{F}_n) = \int h(x) \, d\widehat{F}_n(x).\].
Quando os \(X_i\) são independentes e identicamente distribuídos (i.i.d.), o Teorema de Glivenko-Cantelli garante a convergência na norma do supremo de \(\widehat{F}_n\) para \(F\) e, portanto, garante que \(\theta(\widehat{F}_n)\) é um estimador consistente de \(\theta(F)\).
A notação \(\theta(F)\) indica que o parâmetro populacional \(\theta\) é expresso como um funcional da distribuição \(F\). Logo, o estimador \(\theta(\widehat{F}_n)\) de \(\theta\) é simplesmente o mesmo funcional aplicado à distribuição empírica \(\widehat{F}_n\); ou seja, é o estimador plug-in de \(\theta\):
\[ \text{Se } \quad \theta(F) = g(F) \quad\text{ então }\quad \hat{\theta} = g(\widehat{F}_n). \]
Exemplos:
Média populacional: \(\mu = \mathbb{E}[X] = \int x \, dF(x) \implies \hat{\mu} = \int x \, d\widehat{F}_n(x) = \frac{1}{n} \sum_{i=1}^{n} X_i = \bar{X}\).
Variância populacional: \(\sigma^2 = \int (x - \mu)^2 \, dF(x) \implies \hat{\sigma}^2 = \frac{1}{n} \sum_{i=1}^{n} (X_i - \bar{X})^2\).
O bootstrap fornece um método razoavelmente automático de calcular \(\theta(\widehat{F}_n)\) por meio da reamostragem dos dados.
Seja \(\boldsymbol{X}^{*(b)} = (X^{*(b)}_1, \cdots, X^{*(b)}_n)\) uma reamostragem de \(\boldsymbol{X} = (X_1, \cdots, X_n)\) obtida através de um sorteio com reposição das componentes \(X_1,\cdots,X_n\). (Observe que os \(X_j^{*(b)}\) são iguais a um dos \(X_j\) e que o mesmo valor \(X_j\) pode aparecer várias vezes em \(\boldsymbol{X}^{*i}\).)
De fato, tornou-se comum denotar uma amostra bootstrap com o sobrescrito “\(*\)”, de modo que:
\[ \boldsymbol{X}^{*(b)} = (X^{*(b)}_1, \cdots, X^{*(b)}_n) \sim \widehat{F}_n, \quad \text{i.i.d.} \]
Com base na extração de \(\boldsymbol{X}^{*(1)}, \cdots, \boldsymbol{X}^{*(B)}\), a quantidade \(\theta(\widehat{F}_n)\) pode ser aproximada pelo estimador bootstrap \(\hat{\theta}(\widehat{F}_n)\):
\[ \tag{$\star$} \theta(\widehat{F}_n) = \int h(x) \, d\widehat{F}_n(x) \qquad \approx \qquad \hat{\theta}(\widehat{F}_n) = \frac{1}{B} \sum_{b=1}^{B} h(\boldsymbol{X}^{*(b)}) \]
com a aproximação tornando-se mais precisa à medida que \(B\) aumenta.
Se \(\hat{\theta}(F)\) for um estimador arbitrário de \(\theta(F)\), o viés, a variância ou até mesmo a distribuição do erro de \(\hat{\theta}\) podem ser estimados de forma análoga utilizando o mesmo princípio do Método de Monte Carlo.
Quando a distribuição amostral teórica de \(\hat{\theta} = T(\boldsymbol{X})\) é intratável analiticamente, utilizamos o método de Monte Carlo para aproximar a distribuição Bootstrap de \(\hat{\theta}^*\).
A partir do conjunto de réplicas \(\{\hat{\theta}^{*(1)}, \cdots, \hat{\theta}^{*(B)}\}\), estimamos as propriedades amostrais do estimador \(\hat{\theta}\) conforme discutido a seguir.
De fato, o viés do estimador \(\hat{\theta}(F)\) é dado por \[\widehat{\text{B}}(\hat{\theta}(F)) = \mathbb{E}[\hat{\theta}(F)] - \theta(F) \approx \mathbb{E}[\hat{\theta}(\widehat{F}_n)] - \theta(\widehat{F}_n).\]
Pelo princípio plug-in, substituímos \(\mathbb{E}[\hat{\theta}]\) pela média das estimativas bootstrap e \(\theta\) pela estimativa pontual original \(\hat{\theta}\). Dessa forma, o vício estimado pelo Bootstrap é definido por: \[\widehat{\text{B}}_{boot}(\hat{\theta}) = \mathbb{E}[\hat{\theta}] - \theta = \bar{\theta}^* - \hat{\theta},\] onde \[\bar{\theta}^* = \frac{1}{B} \sum_{b=1}^B \hat{\theta}^{*(b)}.\] Tratando as estimativas bootstrap como uma amostra aleatória de estimativas independentes para \(\hat{\theta}\), a variância de Bootstrap do estimador \(\hat{\theta}\) será dada por: \[ \begin{aligned} \widehat{\text{Var}}_{boot}(\hat{\theta}) &= \frac{1}{B-1} \sum_{b=1}^{B} \left(\hat{\theta}^{*(b)} - \bar{\theta}^*\right)^2 \end{aligned} \]
O erro padrão Bootstrap é simplesmente a raiz quadrada da variância: \[ \widehat{\text{SE}}_{boot}(\hat{\theta}) = \sqrt{\widehat{\text{Var}}_{boot}(\hat{\theta})}. \]
Além disso, faz sentido pensar no estimador corrigido via Bootstrap como \[ \hat{\theta}_{boot} = \hat{\theta} - \widehat{\text{B}}_{boot}(\hat{\theta}) = \hat{\theta} - (\bar{\theta}^* - \hat{\theta}) =2\hat{\theta} - \bar{\theta}^* \] ]
Existem diferentes abordagens para construir intervalos de confiança (IC) de nível \(100(1-\alpha)\%\) a partir das réplicas Bootstrap.
Vamos discutir aqui as duas formas mais frequentemente utilizadas.
Assume que a distribuição amostral de \(\hat{\theta}\) é aproximadamente Normal:
\[ \text{IC}_{100(1-\alpha)\%}^{\text{Normal}}(\theta) = \left[ \hat{\theta} - z_{1-\alpha/2} \cdot \widehat{\text{SE}}_{boot}\, , \, \hat{\theta} + z_{1-\alpha/2} \cdot \widehat{\text{SE}}_{boot} \right]. \]
Limitação: Exige simetria (assimetria nula) e tamanho amostral grande para garantir assintoticidade normal.
Utiliza diretamente os quantis empíricos da distribuição das réplicas Bootstrap \(\hat{\theta}^*\):
\[ \text{IC}_{100(1-\alpha)\%}^{\text{Percentil}} = \left[ \hat{\theta}^*_{\alpha/2} \, , \, \hat{\theta}^*_{1 - \alpha/2} \right], \]
onde \(\hat{\theta}^*_{q}\) representa o quantil de ordem \(q\) do vetor \(\{\hat{\theta}^{*(1)}, \cdots, \hat{\theta}^{*(B)}\}\).
Vantagem: Invariante a transformações monotônicas de \(\hat{\theta}\).
Vamos demonstrar como o método Bootstrap calcula com precisão o erro padrão da mediana amostral baseada em uma amostra extraída de uma distribuição Exponencial.
Lembre-se que \(X \sim Exp(\lambda) \qquad \Rightarrow \qquad F_X(x) = 1-e^{-\lambda x}, \;x>0 \qquad \text{e} \qquad q_p(x) = -\frac{\ln(1-p)}{\lambda}.\)
# Configurando semente para reprodutibilidade
set.seed(1)
# gerando a amostra (assimétrica)
n = 30
lambda = 0.2
x = rexp(n, rate = 0.2)
media.verd = 1/lambda
#media.verd
mediana.verd = -log(1-0.5)/lambda
#mediana.verd
# estimativa pontual (baseada no estimador original)
theta_hat = median(x)
# algoritmo Bootstrap
B = 2000
replicas_theta_hat = numeric(B)
for(b in 1:B) {
reamostra = sample(x, size = n, replace = TRUE)
replicas_theta_hat[b] = median(reamostra)
}
theta_bar = mean(replicas_theta_hat)
# Vício estimado
vies_boot = theta_bar - theta_hat
# Variância do Estimador
var_boot = var(replicas_theta_hat)
se_boot = sd(replicas_theta_hat)
# Estimador Corrigido
theta_boot = theta_hat - vies_boot
estimativas = data.frame(
medida = c("valor verdadeiro","estimativa viesada","estimativa corrigida por Bootstrap","viés estimado via Bootstrap","erro padrão estimado via Bootstrap"),
valores = c(round(mediana.verd,4),round(theta_hat, 4),round(theta_boot, 4),round(vies_boot, 4),round(se_boot, 4))
)
estimativas
## medida valores
## 1 valor verdadeiro 3.4657
## 2 estimativa viesada 3.7930
## 3 estimativa corrigida por Bootstrap 3.5972
## 4 viés estimado via Bootstrap 0.1958
## 5 erro padrão estimado via Bootstrap 0.8296
# intervalos de confiança
# Normal
liminf_normal = theta_hat - qnorm(0.975)*se_boot
limsup_normal = theta_hat + qnorm(0.975)*se_boot
IC_normal = paste("[",round(liminf_normal,4)," ; ",round(limsup_normal,4),"]")
IC_normal
## [1] "[ 2.167 ; 5.4191 ]"
# Percentil
liminf_perc = quantile(replicas_theta_hat,0.025)
limsup_perc = quantile(replicas_theta_hat,0.975)
IC_perc = paste("[",round(liminf_perc,4)," ; ",round(limsup_perc,4),"]")
IC_perc
## [1] "[ 2.8614 ; 5.5696 ]"
Utilizando o pacote boot:
library(boot)
set.seed(1)
# A função boot() EXIGE que a função estatística receba dois parâmetros: o vetor/data frame de dados (d) e um vetor de índices de reamostragem (i).
fun_mediana <- function(d, i) {
return(median(d[i]))
}
# executando o Bootstrap com B = 2000
resultados_boot = boot(data = x, statistic = fun_mediana, R = 2000)
# Resultados gerais
print(resultados_boot)
##
## ORDINARY NONPARAMETRIC BOOTSTRAP
##
##
## Call:
## boot(data = x, statistic = fun_mediana, R = 2000)
##
##
## Bootstrap Statistics :
## original bias std. error
## t1* 3.793029 0.2101794 0.8438646
# calculando os diferentes Intervalos de Confiança
boot.ci(resultados_boot, type = c("norm", "basic", "perc", "bca"))
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 2000 bootstrap replicates
##
## CALL :
## boot.ci(boot.out = resultados_boot, type = c("norm", "basic",
## "perc", "bca"))
##
## Intervals :
## Level Normal Basic
## 95% ( 1.929, 5.237 ) ( 2.016, 4.757 )
##
## Level Percentile BCa
## 95% ( 2.829, 5.570 ) ( 2.764, 5.521 )
## Calculations and Intervals on Original Scale
# extraindo as métricas principais do objeto boot
# theta_hat (t0): Estimativa pontual original
# replicas_theta_hat (t): Vetor de réplicas bootstrap
theta_hat_pacote = resultados_boot$t0
replicas_theta_hat_pacote = resultados_boot$t
theta_bar_pacote = mean(replicas_theta_hat_pacote)
# Vício estimado
vies_boot_pacote = theta_bar_pacote - theta_hat_pacote
# Variância do Estimador
var_boot_pacote = var(replicas_theta_hat_pacote)
se_boot_pacote = sd(replicas_theta_hat_pacote)
# Estimador Corrigido
theta_boot_pacote = theta_hat_pacote - vies_boot_pacote
comparacao = data.frame(
medida = c("valor verdadeiro","estimativa viesada","estimativa corrigida por Bootstrap","viés estimado via Bootstrap","erro padrão estimado via Bootstrap"),
valores_implementados = c(round(mediana.verd,4),round(theta_hat, 4),round(theta_boot, 4),round(vies_boot, 4),round(se_boot, 4)),
valores_pacote = c(round(mediana.verd,4),round(theta_hat_pacote, 4),round(theta_boot_pacote, 4),round(vies_boot_pacote, 4),round(se_boot_pacote, 4))
)
comparacao
## medida valores_implementados valores_pacote
## 1 valor verdadeiro 3.4657 3.4657
## 2 estimativa viesada 3.7930 3.7930
## 3 estimativa corrigida por Bootstrap 3.5972 3.5828
## 4 viés estimado via Bootstrap 0.1958 0.2102
## 5 erro padrão estimado via Bootstrap 0.8296 0.8439
Visualização gráfica da distribuição Bootstrap da mediana amostral:
hist(replicas_theta_hat, breaks = 25, col = "skyblue", border = "white",
main = "Distribuição Amostral Bootstrap da Mediana",
xlab = "Mediana Reamostrada", ylab = "Frequência")
abline(v = theta_hat, col = "red", lwd = 2, lty = 1)
abline(v = mean(replicas_theta_hat), col = "blue", lwd = 2, lty = 2)
legend("topright", legend = c("Mediana amostral", "Média réplicas Bootstrap"),
col = c("red", "blue"), lty = c(1, 2), lwd = 2)
| Característica | Método Jackknife | Método Bootstrap |
|---|---|---|
| Mecanismo de Reamostragem | Determinístico: Remove \(1\) observação por vez (\(n\) subconjuntos). | Estocástico: Sorteia \(n\) observações com reposição (\(B\) reamostras). |
| Tamanho da Reamostra | \(n - 1\) elementos. | \(n\) elementos. |
| Custo Computacional | Baixo (\(n\) execuções). | Moderado a Alto (\(B \ge 1000\) execuções). |
| Suavidade da Estatística | Requer estatísticas suaves (falha drasticamente na mediana/quantis). | Funciona muito bem para estatísticas não suaves (ex: mediana). |
| Estimativa da Distribuição | Estima apenas viés e erro padrão. | Estima toda a distribuição amostral (permite IC percentil, etc.). |
Vamos comparar os resultados obtidos via Bootstrap e Jackknife através de um estudo de simulação.
jackknife = function(x, estatistica){
n = length(x)
theta_hat = estatistica(x)
# Estimativas Jackknife (leave-one-out)
theta_menosi = sapply(
1:n,
function(i){
estatistica(x[-i])
}
)
theta_bar = mean(theta_menosi)
# Estimador Corrigido
theta_jack = n*theta_hat-(n-1)*theta_bar
# Vício estimado
vies_jack = (n - 1) * (theta_bar - theta_hat)
#theta_jack = theta_hat - vies_jack
# Variância do Estimador
var_jack = ((n - 1) / n) * sum((theta_bar - theta_menosi)^2)
se_jack = sqrt(var_jack)
pseudovalores = n * theta_hat - (n - 1) * theta_menosi
list(
n = n,
estimativa_viesada = theta_hat,
estimativas_loo = theta_menosi, # leave_one_out
media_jack = theta_bar,
vies_jack = vies_jack,
estimativa_jack = theta_jack,
var_jack = var_jack,
se_jack = se_jack,
pseudovalores = pseudovalores
)
}
bootstrap = function(x, estatistica, B){
n = length(x)
# estimativa pontual (baseada no estimador original)
theta_hat = estatistica(x)
# algoritmo Bootstrap
replicas_theta_hat = numeric(B)
for(b in 1:B) {
reamostra = sample(x, size = n, replace = TRUE)
replicas_theta_hat[b] = estatistica(reamostra)
}
theta_bar = mean(replicas_theta_hat)
# Vício estimado
vies_boot = theta_bar - theta_hat
# Variância do Estimador
var_boot = var(replicas_theta_hat)
se_boot = sd(replicas_theta_hat)
# Estimador Corrigido
theta_boot = theta_hat - vies_boot
list(
n = n,
estimativa_viesada = theta_hat,
replicas_boot = replicas_theta_hat,
media_boot = theta_bar,
vies_boot = vies_boot,
estimativa_boot = theta_boot,
var_boot = var_boot,
se_boot = se_boot
)
}
#____________________________
# Estudo com replicações ----
# parâmetros para geração dos dados
mu.verd = 5
sig.verd = 2
# número de replicações
M = 1000
# tamanho da amostra em cada replicação
n = 100
# número de amostras Bootstrap
B = 1000
media.mc = NULL
mediana.mc = NULL
media.jack = NULL
mediana.jack = NULL
se.jack.media = NULL
se.jack.mediana = NULL
media.boot = NULL
mediana.boot = NULL
se.boot.media = NULL
se.boot.mediana = NULL
for(j in 1:M){
# gerando amostras
amostra = rnorm(n,mu.verd,sig.verd)
# estimadores de Monte Carlo
media.mc[j] = mean(amostra)
mediana.mc[j] = median(amostra)
# resultados Jackknife
resultado_media.jack = jackknife(amostra,mean)
media.jack[j] = resultado_media.jack$estimativa_jack
se.jack.media[j] = resultado_media.jack$se_jack
resultado_mediana.jack = jackknife(amostra,median)
mediana.jack[j] = resultado_mediana.jack$estimativa_jack
se.jack.mediana[j] = resultado_mediana.jack$se_jack
# resultados Bootstrap
resultado_media.boot = bootstrap(amostra,mean,B)
media.boot[j] = resultado_media.boot$estimativa_boot
se.boot.media[j] = resultado_media.boot$se_boot
resultado_mediana.boot = bootstrap(amostra,median,B)
mediana.boot[j] = resultado_mediana.boot$estimativa_boot
se.boot.mediana[j] = resultado_mediana.boot$se_boot
}
se.mc.media = sd(media.mc)
se.mc.media
## [1] 0.1994753
sig.verd/sqrt(n)
## [1] 0.2
se.mc.mediana = sd(mediana.mc)
se.mc.mediana
## [1] 0.2448521
par(mfrow = c(2,2))
hist(se.jack.media,main="Erro Padrão - Média Jackknife")
abline(v=se.mc.media,col=2,lwd=2)
hist(se.boot.media,main="Erro Padrão - Média Bootstrap")
abline(v=se.mc.media,col=2,lwd=2)
hist(se.jack.mediana,main="Erro Padrão - Mediana Jackknife")
abline(v=se.mc.mediana,col=2,lwd=2)
hist(se.boot.mediana,main="Erro Padrão - Mediana Bootstrap")
abline(v=se.mc.mediana,col=2,lwd=2)
BILLINGSLEY, P. Probability and Measure. 3. ed. New York: John Wiley, 1995.
EFRON, Bradley. Bootstrap methods: another look at the jackknife. The Annals of Statistics, v. 7, n. 1, p. 1-26, 1979.
EFRON, Bradley; TIBSHIRANI, Robert J. Introduction to the Bootstrap. New York: Chapman & Hall/CRC, 1993. (Monographs on Statistics and Applied Probability, v. 57).
ROBERT, Christian P.; CASELLA, George. Monte Carlo Statistical Methods. 2. ed. New York: Springer, 2004. (Springer Texts in Statistics).
ROSS, Sheldon M. Simulation. 5. ed. San Diego: Academic Press, 2012.
O nome do método deriva da expressão em inglês “to pull oneself up by one’s bootstraps” (levantar a si próprio puxando pelas alças de suas próprias botas), vinda do romance alemão As Aventuras do Barão de Munchausen, de Rudolph Raspe, no qual o herói se salva do afogamento puxando a si mesmo pelas alças de suas próprias botas (bootstraps)!. O nome refletindo a ideia de realizar inferência estatística usando apenas os próprios dados observados, sem depender de distribuições teóricas externas.↩︎