Σ
SDCalc
ExpertPokročilé·15 min

Bootstrapové metody pro směrodatnou odchylku

Zvládněte bootstrapový resampling pro odhad směrodatné odchylky. Naučte se percentilovou, BCa a parametrickou bootstrapovou metodu s implementací v Pythonu a praktickými příklady.

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í

Interval spolehlivosti pro směrodatnou odchylku založený na chí-kvadrát rozdělení předpokládá normalitu. U zešikmených dat (příjmy, reakční časy, data o přežití) může produkovat intervaly, které míjejí skutečný parametr ve 20–30 % případů, nikoli v očekávaných 5 %.

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í:

1

Vytvoření bootstrapového výběru

Náhodně vyberte n pozorování s vracením z vašich původních dat. Některé hodnoty se objeví vícekrát, jiné vůbec.
2

Výpočet statistiky

Vypočítejte směrodatnou odchylku tohoto bootstrapového výběru. Toto je jedna bootstrapová replikace.
3

Mnohonásobné opakování

Opakujte kroky 1–2 tisíckrát (typicky B = 10 000). Každé opakování dá jednu bootstrapovou SO.
4

Analýza rozdělení

Soubor B bootstrapových SO aproximuje výběrové rozdělení. Použijte jej pro intervaly spolehlivosti a testování hypotéz.

Proč s vracením?

Vzorkování s vracením je klíčové. Vytváří výběry, které se liší svým složením, a tím napodobuje variabilitu, kterou byste viděli při různých výběrech z populace. Bez vracení by byl každý výběr totožný s originálem.

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

95% CI = [θ*₂.₅, θ*₉₇.₅]

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

95% CI = [2θ̂ - θ*₉₇.₅, 2θ̂ - θ*₂.₅]

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.

MetodaVýhodyNevýhody
PercentilováJednoduchá, intuitivníMůže být vychýlená u zešikmených dat
ZákladníSymetrické intervalyMůže produkovat záporné hodnoty
BCaNejpřesnější, respektuje transformaceVý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).

1

Výpočet výběrové SO

Původní výběr: n=15, SO = 109,8 ms
2

Generování bootstrapových výběrů

Vytvoříme 10 000 výběrů o velikosti 15 s vracením. Každý výběr má jiné složení.
3

Výpočet bootstrapových SO

Vypočítáme SO pro každý bootstrapový výběr a získáme 10 000 hodnot v rozsahu přibližně 60 až 180
4

Nalezení percentilů

2,5. percentil: 72,3 ms, 97,5. percentil: 156,8 ms
5

Sestavení 95% IS

95% IS: [72,3; 156,8] ms. Porovnejte s chí-kvadrát IS: [79,4; 175,2], který předpokládá normalitu.

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:

python
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}]")