Bootstrap: revoluția statistică a erei informatice
Reeșantionarea bootstrap este o tehnică statistică puternică ce estimează distribuția de eșantionare a oricărei statistici prin reeșantionarea repetată din datele observate. Introdusă de Bradley Efron în 1979, a revoluționat inferența statistică, permițând analiza statisticilor complexe fără a depinde de formule matematice sau ipoteze privind distribuția.
Ideea fundamentală a metodei bootstrap este elegant de simplă: eșantionul tău este cea mai bună estimare a populației. Reeșantionând din datele tale (cu reintroducere), simulezi ce s-ar întâmpla dacă ai putea extrage repetat eșantioane din populație. Această abordare este deosebit de valoroasă pentru deviația standard, unde formulele clasice ale intervalelor de încredere presupun normalitate — o ipoteză care deseori nu se verifică în practică.
Bootstrap a devenit esențial în știința modernă a datelor, deoarece funcționează cu orice statistică (mediană, corelație, coeficienți de regresie, ponderi ale rețelelor neuronale) și nu face nicio presupunere despre distribuția care stă la baza datelor.
De ce Bootstrap pentru deviația standard?
Intervalele de încredere tradiționale pentru deviația standard presupun că datele provin dintr-o distribuție normală. Când această ipoteză nu se verifică (ceea ce este frecvent), aceste intervale pot fi complet eronate. Bootstrap oferă o alternativă care nu depinde de distribuție.
Când metodele tradiționale eșuează
Avantajele principale ale metodei bootstrap pentru deviația standard:
- Fără ipoteze despre distribuție: funcționează la fel de bine cu date normale, asimetrice sau cu cozi grele
- Performanță pe eșantioane mici: adesea mai precisă decât metodele parametrice la n < 30
- Gestionarea statisticilor complexe: aceeași abordare funcționează pentru DS trunchiată, MAD sau măsuri personalizate de variabilitate
- Vizualizare intuitivă: distribuția bootstrap îți arată ce se întâmplă, nu doar cifrele finale
Procedura Bootstrap
Algoritmul bootstrap este remarcabil de simplu. Pornind de la eșantionul original de n observații:
Extragerea eșantionului bootstrap
Calculul statisticii
Repetarea de multe ori
Analiza distribuției
De ce cu reintroducere?
Câte eșantioane bootstrap? B = 1.000 este adesea suficient pentru estimări aproximative și teste de ipoteze. Pentru intervale de încredere, B = 10.000 oferă percentile stabile. Pentru intervale BCa de calitate publicabilă, se recomandă B = 15.000+.
Metode de interval de încredere Bootstrap
Există mai multe metode de construire a intervalelor de încredere din eșantioane bootstrap, fiecare cu compromisuri specifice:
1. Metoda percentilelor (cea mai simplă)
Cea mai intuitivă abordare: se preiau direct percentilele distribuției bootstrap.
Percentile CI
Pentru 10.000 de eșantioane bootstrap, acestea sunt valorile de pe pozițiile 250 și 9.750 ordonate. Simplă, dar poate fi biasată când distribuția bootstrap este asimetrică.
2. Metoda de bază (pivotală)
Folosește relația dintre statistica eșantionului și statisticile bootstrap:
Basic Bootstrap CI
Unde θ̂ este DS din eșantionul original. Aceasta “reflectă” intervalul percentilelor în jurul estimării din eșantion.
3. BCa (corectată pentru bias și accelerată)
Standardul de aur în ceea ce privește acuratețea. BCa ajustează atât pentru biasul din distribuția bootstrap, cât și pentru accelerație (modul în care eroarea standard se modifică odată cu valoarea parametrului). Mai complexă de calculat, dar oferă intervale cu acuratețe de ordinul al doilea.
| Metodă | Avantaje | Dezavantaje |
|---|---|---|
| Percentile | Simplă, intuitivă | Poate fi biasată cu date asimetrice |
| De bază | Intervale simetrice | Poate produce valori negative |
| BCa | Cea mai precisă, respectă transformările | Intensivă din punct de vedere computațional |
Exemplu practic: date non-normale
Să considerăm 15 măsurători ale timpilor de răspuns (în ms): 245, 312, 287, 456, 234, 298, 267, 523, 289, 301, 278, 645, 256, 289, 312. Aceste date sunt asimetrice la dreapta (unele răspunsuri sunt foarte lente).
Calculul DS din eșantion
Generarea eșantioanelor bootstrap
Calculul DS-urilor bootstrap
Determinarea percentilelor
Formarea IC 95%
Intervalul de încredere bootstrap este asimetric (mai larg în partea de sus), reflectând natura asimetrică la dreapta a datelor. Intervalul chi-pătrat nu surprinde această asimetrie.
Implementare Python
Implementare completă bootstrap cu mai multe metode de interval de încredere:
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}]")