Bootstrap: A Revolução Estatística da Era Computacional
A reamostragem bootstrap é uma técnica estatística poderosa que estima a distribuição amostral de qualquer estatística através da reamostragem repetida dos dados observados. Introduzida por Bradley Efron em 1979, revolucionou a inferência estatística ao possibilitar a análise de estatísticas complexas sem depender de fórmulas matemáticas ou pressupostos sobre a distribuição.
A ideia fundamental por detrás do bootstrap é elegantemente simples: a tua amostra é a tua melhor estimativa da população. Ao reamostrar da tua amostra (com reposição), simulas o que aconteceria se pudesses repetidamente amostrar da população. Esta abordagem é particularmente valiosa para o desvio-padrão, onde as fórmulas tradicionais de intervalos de confiança assumem normalidade — um pressuposto que frequentemente falha na prática.
O bootstrap tornou-se essencial na ciência de dados moderna porque funciona com qualquer estatística (mediana, correlação, coeficientes de regressão, pesos de redes neuronais) e não faz pressupostos sobre a distribuição subjacente dos dados.
Porquê Bootstrap para o Desvio-Padrão?
Os intervalos de confiança tradicionais para o desvio-padrão assumem que os dados provêm de uma distribuição normal. Quando este pressuposto falha (o que é comum), estes intervalos podem ser profundamente imprecisos. O bootstrap oferece uma alternativa livre de distribuição.
Quando os Métodos Tradicionais Falham
Vantagens principais do bootstrap para o desvio-padrão:
- Sem pressupostos de distribuição: Funciona igualmente bem com dados normais, assimétricos ou de caudas pesadas
- Desempenho em amostras pequenas: Frequentemente mais preciso que métodos paramétricos com n < 30
- Lida com estatísticas complexas: A mesma abordagem funciona para DP truncado, MAD ou medidas de variabilidade personalizadas
- Visão visual: A distribuição bootstrap mostra-te o que está a acontecer, não apenas números finais
O Procedimento Bootstrap
O algoritmo bootstrap é notavelmente direto. A partir da tua amostra original de n observações:
Retirar Amostra Bootstrap
Calcular a Estatística
Repetir Muitas Vezes
Analisar a Distribuição
Porquê Com Reposição?
Quantas amostras bootstrap? B = 1.000 é frequentemente suficiente para estimativas aproximadas e testes de hipóteses. Para intervalos de confiança, B = 10.000 fornece percentis estáveis. Para intervalos BCa com qualidade de publicação, recomenda-se B = 15.000+.
Métodos de Intervalo de Confiança Bootstrap
Existem vários métodos para construir intervalos de confiança a partir de amostras bootstrap, cada um com compromissos:
1. Método do Percentil (Mais Simples)
A abordagem mais intuitiva: tomar diretamente os percentis da distribuição bootstrap.
IC do Percentil
Para 10.000 amostras bootstrap, é o 250.º e o 9.750.º valores ordenados. Simples mas pode ser enviesado quando a distribuição bootstrap é assimétrica.
2. Bootstrap Básico (Pivotal)
Utiliza a relação entre a estatística amostral e as estatísticas bootstrap:
IC do Bootstrap Básico
Onde θ̂ é o DP da amostra original. Isto “reflete” o intervalo do percentil em torno da estimativa amostral.
3. BCa (Corrigido para Enviesamento e Acelerado)
O padrão de referência para precisão. O BCa ajusta tanto para o enviesamento na distribuição bootstrap como para a aceleração (como o erro-padrão muda com o valor do parâmetro). Mais complexo de calcular mas fornece intervalos com precisão de segunda ordem.
| Método | Vantagens | Desvantagens |
|---|---|---|
| Percentil | Simples, intuitivo | Pode ser enviesado com dados assimétricos |
| Básico | Intervalos simétricos | Pode produzir valores negativos |
| BCa | Mais preciso, respeita transformações | Computacionalmente intensivo |
Exemplo Resolvido: Dados Não Normais
Considera 15 medições de tempos de resposta (em ms): 245, 312, 287, 456, 234, 298, 267, 523, 289, 301, 278, 645, 256, 289, 312. Estes dados são assimétricos à direita (algumas respostas muito lentas).
Calcular o DP Amostral
Gerar Amostras Bootstrap
Calcular os DPs Bootstrap
Encontrar os Percentis
Formar o IC de 95%
O IC bootstrap é assimétrico (mais largo do lado superior), refletindo a natureza assimétrica à direita dos dados. O IC qui-quadrado não capta esta assimetria.
Implementação em Python
Implementação completa do bootstrap com múltiplos métodos de IC:
import numpy as np
from scipy import stats
def bootstrap_sd_ci(data, n_bootstrap=10000, ci=0.95, method='percentile'):
"""
Bootstrap confidence interval for standard deviation.
Parameters:
-----------
data : array-like - Original sample
n_bootstrap : int - Number of bootstrap samples
ci : float - Confidence level (e.g., 0.95)
method : str - 'percentile', 'basic', or 'bca'
Returns:
--------
tuple : (lower_bound, upper_bound, bootstrap_sds)
"""
data = np.array(data)
n = len(data)
original_sd = np.std(data, ddof=1)
# Generate bootstrap samples and calculate SDs
bootstrap_sds = np.array([
np.std(np.random.choice(data, size=n, replace=True), ddof=1)
for _ in range(n_bootstrap)
])
alpha = 1 - ci
if method == 'percentile':
lower = np.percentile(bootstrap_sds, 100 * alpha/2)
upper = np.percentile(bootstrap_sds, 100 * (1 - alpha/2))
elif method == 'basic':
lower = 2*original_sd - np.percentile(bootstrap_sds, 100*(1-alpha/2))
upper = 2*original_sd - np.percentile(bootstrap_sds, 100*alpha/2)
elif method == 'bca':
# Bias correction
prop_less = np.mean(bootstrap_sds < original_sd)
z0 = stats.norm.ppf(prop_less)
# Acceleration (jackknife estimate)
jackknife_sds = np.array([
np.std(np.delete(data, i), ddof=1) for i in range(n)
])
jack_mean = jackknife_sds.mean()
a = np.sum((jack_mean - jackknife_sds)**3) / \
(6 * np.sum((jack_mean - jackknife_sds)**2)**1.5)
# Adjusted percentiles
z_alpha = stats.norm.ppf([alpha/2, 1-alpha/2])
adj_percentiles = stats.norm.cdf(
z0 + (z0 + z_alpha) / (1 - a*(z0 + z_alpha))
) * 100
lower = np.percentile(bootstrap_sds, adj_percentiles[0])
upper = np.percentile(bootstrap_sds, adj_percentiles[1])
return lower, upper, bootstrap_sds
# Example usage
response_times = [245, 312, 287, 456, 234, 298, 267, 523, 289, 301, 278, 645, 256, 289, 312]
for method in ['percentile', 'basic', 'bca']:
lower, upper, _ = bootstrap_sd_ci(response_times, method=method)
print(f"{method.upper():12s} 95% CI: [{lower:.1f}, {upper:.1f}]")