Bootstrap: Statistická revoluce počítačového věku
Bootstrapový resampling je výkonná statistická technika, která odhaduje výběrové rozdělení libovolné statistiky opakovaným převzorkováním z pozorovaných dat. Metodu představil Bradley Efron v roce 1979 a zrevolucionizovala statistickou inferenci tím, že umožnila analýzu složitých statistik bez spoléhání na matematické vzorce či předpoklady o rozdělení.
Klíčová myšlenka bootstrapu je elegantně jednoduchá: váš výběr je nejlepším odhadem populace. Opakovaným převzorkováním z vašeho výběru (s vracením) simulujete, co by se stalo, kdybyste mohli opakovaně vzorkovat z celé populace. Tento přístup je obzvláště cenný pro směrodatnou odchylku, kde tradiční vzorce pro intervaly spolehlivosti předpokládají normalitu — předpoklad, který v praxi často neplatí.
Bootstrap se stal nepostradatelným v moderní datové vědě, protože funguje s libovolnou statistikou (medián, korelace, regresní koeficienty, váhy neuronových sítí) a neklade žádné požadavky na rozdělení vašich dat.
Proč bootstrap pro směrodatnou odchylku?
Tradiční intervaly spolehlivosti pro směrodatnou odchylku předpokládají, že vaše data pocházejí z normálního rozdělení. Pokud tento předpoklad neplatí (což je běžné), mohou být tyto intervaly výrazně nepřesné. Bootstrap nabízí alternativu nezávislou na rozdělení.
Kdy tradiční metody selhávají
Hlavní výhody bootstrapu pro směrodatnou odchylku:
- Bez předpokladů o rozdělení: Funguje stejně dobře s normálními, zešikmenými i těžkochvostými daty
- Výkon u malých výběrů: Často přesnější než parametrické metody při n < 30
- Zvládá složité statistiky: Stejný přístup funguje pro ořezanou SO, MAD nebo vlastní míry variability
- Vizuální vhled: Bootstrapové rozdělení vám ukazuje, co se děje, nejen výsledná čísla
Bootstrapový postup
Bootstrapový algoritmus je pozoruhodně přímočarý. Z vašeho původního výběru n pozorování:
Vytvoření bootstrapového výběru
Výpočet statistiky
Mnohonásobné opakování
Analýza rozdělení
Proč s vracením?
Kolik bootstrapových výběrů? B = 1 000 často stačí pro hrubé odhady a testy hypotéz. Pro intervaly spolehlivosti poskytuje B = 10 000 stabilní percentily. Pro publikační BCa intervaly se doporučuje B = 15 000+.
Metody bootstrapových intervalů spolehlivosti
Pro konstrukci intervalů spolehlivosti z bootstrapových výběrů existuje několik metod, každá s různými kompromisy:
1. Percentilová metoda (nejjednodušší)
Nejintuitivnější přístup: vezměte percentily bootstrapového rozdělení přímo.
Percentilový IS
Pro 10 000 bootstrapových výběrů jde o 250. a 9 750. seřazenou hodnotu. Jednoduchá metoda, ale může být vychýlená, pokud je bootstrapové rozdělení zešikmené.
2. Základní (pivotový) bootstrap
Využívá vztah mezi výběrovou statistikou a bootstrapovými statistikami:
Základní bootstrapový IS
Kde θ̂ je směrodatná odchylka původního výběru. Tato metoda “zrcadlí” percentilový interval kolem výběrového odhadu.
3. BCa (se korekcí vychýlení a akcelerací)
Zlatý standard co do přesnosti. BCa koriguje jak vychýlení v bootstrapovém rozdělení, tak akceleraci (jak se mění standardní chyba s hodnotou parametru). Výpočetně náročnější, ale poskytuje intervaly s přesností druhého řádu.
| Metoda | Výhody | Nevýhody |
|---|---|---|
| Percentilová | Jednoduchá, intuitivní | Může být vychýlená u zešikmených dat |
| Základní | Symetrické intervaly | Může produkovat záporné hodnoty |
| BCa | Nejpřesnější, respektuje transformace | Výpočetně náročná |
Řešený příklad: Nenormální data
Uvažujme 15 měření reakčních časů (v ms): 245, 312, 287, 456, 234, 298, 267, 523, 289, 301, 278, 645, 256, 289, 312. Tato data jsou pravostranně zešikmená (některé velmi pomalé odezvy).
Výpočet výběrové SO
Generování bootstrapových výběrů
Výpočet bootstrapových SO
Nalezení percentilů
Sestavení 95% IS
Bootstrapový IS je asymetrický (širší na horní straně), což odráží pravostranné zešikmení dat. Chí-kvadrátový IS tuto asymetrii nezachycuje.
Implementace v Pythonu
Kompletní bootstrapová implementace s několika metodami IS:
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}]")