Σ
SDCalc
AvansatAvansat·15 min

Metode Bootstrap pentru deviația standard

Stăpânește reeșantionarea bootstrap pentru estimarea deviației standard. Învață metodele percentilă, BCa și bootstrap parametric cu implementare Python și exemple practice.

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ă

Intervalul de încredere bazat pe chi-pătrat pentru deviația standard presupune normalitate. Cu date asimetrice (venituri, timpi de reacție, date de supraviețuire), acesta poate produce intervale care ratează parametrul adevărat în 20-30% din cazuri, nu 5% cât ar fi de așteptat.

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:

1

Extragerea eșantionului bootstrap

Selectează aleatoriu n observații cu reintroducere din datele originale. Unele valori vor apărea de mai multe ori, altele deloc.
2

Calculul statisticii

Calculează deviația standard a acestui eșantion bootstrap. Aceasta este o replică bootstrap.
3

Repetarea de multe ori

Repetă pașii 1-2 de mii de ori (de obicei B = 10.000). Fiecare repetare produce o DS bootstrap.
4

Analiza distribuției

Colecția celor B deviații standard bootstrap aproximează distribuția de eșantionare. Folosește-o pentru intervale de încredere și teste de ipoteze.

De ce cu reintroducere?

Eșantionarea cu reintroducere este esențială. Creează eșantioane cu compoziții diferite, imitând variabilitatea pe care ai observa-o în eșantioane diferite din populație. Fără reintroducere, fiecare eșantion ar fi identic cu originalul.

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

95% 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

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

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ăAvantajeDezavantaje
PercentileSimplă, intuitivăPoate fi biasată cu date asimetrice
De bazăIntervale simetricePoate produce valori negative
BCaCea mai precisă, respectă transformărileIntensivă 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).

1

Calculul DS din eșantion

Eșantionul original: n=15, DS = 109,8 ms
2

Generarea eșantioanelor bootstrap

Se extrag 10.000 de eșantioane de dimensiune 15 cu reintroducere. Fiecare eșantion are o compoziție diferită.
3

Calculul DS-urilor bootstrap

Se calculează DS pentru fiecare eșantion bootstrap, obținând 10.000 de valori cuprinse între ~60 și ~180
4

Determinarea percentilelor

Percentila 2,5: 72,3 ms, percentila 97,5: 156,8 ms
5

Formarea IC 95%

IC 95%: [72,3; 156,8] ms. Comparativ cu IC chi-pătrat: [79,4; 175,2] care presupune normalitate.

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:

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