Σ
SDCalc
HaladóHaladó·15 min

Bootstrap módszerek a szórás becslésére

Sajátítsd el a bootstrap újramintavételezést a szórás becslésére. Ismerd meg a percentilis, BCa és parametrikus bootstrap módszereket Python implementációval és kidolgozott példákkal.

Bootstrap: a számítógépes korszak statisztikai forradalma

A bootstrap újramintavételezés egy rendkívül hatékony statisztikai technika, amely bármely statisztika mintavételi eloszlását az észlelt adatokból történő ismételt újramintavételezéssel becsüli. Bradley Efron vezette be 1979-ben, és forradalmasította a statisztikai következtetést azáltal, hogy lehetővé tette összetett statisztikák elemzését matematikai képletek vagy eloszlásbeli feltételezések nélkül.

A bootstrap mögött álló alapgondolat elegánsan egyszerű: a mintád a legjobb becslésed a populációról. Ha visszatevéses mintavétellel újramintavételezed a saját mintádat, szimulálod azt, ami akkor történne, ha ismételten mintát vennél a populációból. Ez a megközelítés különösen értékes a szórásnál, ahol a hagyományos konfidenciaintervallum-képletek normalitást feltételeznek – ami a gyakorlatban gyakran nem teljesül.

A bootstrap a modern adattudományban nélkülözhetetlenné vált, mivel bármely statisztikával működik (medián, korreláció, regressziós együtthatók, neurális hálózat súlyok), és nem támaszt feltételezéseket az adatok mögöttes eloszlásáról.

Miért érdemes bootstrapot használni a szórásnál?

A hagyományos konfidenciaintervallumok a szóráshoz feltételezik, hogy az adatok normális eloszlásból származnak. Amikor ez a feltételezés nem teljesül (ami gyakori eset), ezek az intervallumok rendkívül pontatlanok lehetnek. A bootstrap eloszlásfüggetlen alternatívát kínál.

Amikor a hagyományos módszerek csődöt mondanak

A szórás khi-négyzet alapú konfidenciaintervalluma normalitást feltételez. Ferde eloszlású adatoknál (jövedelem, reakcióidők, túlélési adatok) az intervallumok az esetek 20-30%-ában nem fedik le a valódi paramétert az elvárt 5% helyett.

A bootstrap fő előnyei a szórás becslésében:

  • Nincs eloszlásbeli feltételezés: Egyformán jól működik normális, ferde vagy vastag szélű eloszlásokkal
  • Kis mintás teljesítmény: Gyakran pontosabb, mint a parametrikus módszerek n < 30 esetén
  • Összetett statisztikák kezelése: Ugyanaz a megközelítés alkalmazható trimmelt szórásra, MAD-ra vagy egyéni szóródási mutatókra
  • Vizuális betekintés: A bootstrap eloszlás megmutatja, mi történik – nem csak a végeredményt kapod

A bootstrap eljárás

A bootstrap algoritmus rendkívül egyszerű. Az eredeti, n megfigyelésből álló mintádból kiindulva:

1

Bootstrap minta húzása

Véletlenszerűen válassz ki n megfigyelést visszatevéssel az eredeti adataidból. Egyes értékek többször is megjelenhetnek, mások egyáltalán nem.
2

Statisztika kiszámítása

Számítsd ki ennek a bootstrap mintának a szórását. Ez egyetlen bootstrap replikátum.
3

Ismétlés sokszor

Ismételd meg az 1-2. lépéseket több ezerszer (jellemzően B = 10 000). Minden ismétlés egy bootstrap szórást ad.
4

Az eloszlás elemzése

A B darab bootstrap szórás együttesen közelíti a mintavételi eloszlást. Használd konfidenciaintervallumok és hipotézisvizsgálat számítására.

Miért visszatevéssel?

A visszatevéses mintavétel kulcsfontosságú. Olyan mintákat hoz létre, amelyek összetétele változó, utánozva azt a variabilitást, amelyet különböző populációs minták esetén tapasztalnánk. Visszatevés nélkül minden minta azonos lenne az eredetivel.

Hány bootstrap minta szükséges? B = 1 000 gyakran elegendő a durva becslésekhez és hipotézisvizsgálatokhoz. Konfidenciaintervallumokhoz B = 10 000 stabil percentiliseket ad. Publikáció-minőségű BCa intervallumokhoz B = 15 000+ ajánlott.

Bootstrap konfidenciaintervallum módszerek

Több módszer is létezik konfidenciaintervallumok létrehozására bootstrap mintákból, mindegyiknek megvannak az előnyei és hátrányai:

1. Percentilis módszer (legegyszerűbb)

A legintuitívabb megközelítés: közvetlenül a bootstrap eloszlás percentiliseit használjuk.

Percentilis KI

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

10 000 bootstrap mintánál ez a 250. és a 9 750. rendezett érték. Egyszerű, de torzított lehet, ha a bootstrap eloszlás ferde.

2. Alapvető (pivot) bootstrap

A mintastatisztika és a bootstrap statisztikák közötti kapcsolatot használja:

Alapvető bootstrap KI

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

Ahol θ̂ az eredeti mintaszórás. Ez „tükrözi” a percentilis intervallumot a mintabecslés körül.

3. BCa (torzítás-korrigált és gyorsított)

Az arany standard a pontosság szempontjából. A BCa korrigálja mind a bootstrap eloszlás torzítását, mind a gyorsulást (hogyan változik a sztenderd hiba a paraméterértékkel). Számítása összetettebb, de másodrendű pontosságú intervallumokat ad.

MódszerElőnyökHátrányok
PercentilisEgyszerű, intuitívTorzított lehet ferde adatoknál
AlapvetőSzimmetrikus intervallumokNegatív értékeket produkálhat
BCaLegpontosabb, transzformáció-invariánsSzámításigényes

Kidolgozott példa: nem normális eloszlású adatok

Tekintsük 15 válaszidő-mérés eredményét (ms-ban): 245, 312, 287, 456, 234, 298, 267, 523, 289, 301, 278, 645, 256, 289, 312. Az adatok jobbra ferdék (néhány nagyon lassú válasz).

1

Mintaszórás kiszámítása

Eredeti minta: n=15, SD = 109,8 ms
2

Bootstrap minták generálása

Húzz 10 000 darab 15 elemű mintát visszatevéssel. Minden minta más összetételű.
3

Bootstrap szórások kiszámítása

Számítsd ki minden bootstrap minta szórását, így 10 000 értéket kapsz, amelyek ~60-tól ~180-ig terjednek.
4

Percentilisek meghatározása

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

95%-os KI felírása

95%-os KI: [72,3; 156,8] ms. Összehasonlításul a khi-négyzet KI: [79,4; 175,2], amely normalitást feltételez.

A bootstrap KI aszimmetrikus (a felső oldalon szélesebb), tükrözve az adatok jobbra ferde jellegét. A khi-négyzet KI nem ragadja meg ezt az aszimmetriát.

Python implementáció

Teljes bootstrap implementáció többféle KI módszerrel:

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