Σ
SDCalc
AdvancedAdvanced·15 min

Mga Bootstrap Method para sa Standard Deviation

I-master ang bootstrap resampling para sa pagtatantya ng standard deviation. Matutunan ang percentile, BCa, at parametric bootstrap methods na may Python implementation at mga worked examples.

Bootstrap: Ang Rebolusyon ng Estadistika sa Panahon ng Kompyuter

Ang bootstrap resampling ay isang makapangyarihang statistical technique na tinatantya ang sampling distribution ng anumang statistic sa pamamagitan ng paulit-ulit na resampling mula sa iyong obserbasyon. Ipinakilala ni Bradley Efron noong 1979, binago nito ang statistical inference sa pamamagitan ng pagpapahintulot sa pagsusuri ng mga kumplikadong statistics nang hindi umaasa sa mathematical formulas o distributional assumptions.

Ang pangunahing ideya ng bootstrap ay napakasimple: ang iyong sample ang pinakamahusay na tantya ng population. Sa pamamagitan ng resampling mula sa iyong sample (na may replacement), sinisimulate mo kung ano ang mangyayari kung paulit-ulit mong sine-sample ang population. Ang pamamaraang ito ay partikular na mahalaga para sa standard deviation, kung saan ang tradisyonal na confidence interval formulas ay nag-assume ng normality—isang assumption na madalas mabigo sa praktika.

Naging mahalagang bahagi ang bootstrap sa modernong data science dahil gumagana ito sa anumang statistic (median, correlation, regression coefficients, neural network weights) at walang assumptions tungkol sa underlying distribution ng iyong data.

Bakit Bootstrap para sa Standard Deviation?

Ang tradisyonal na confidence intervals para sa standard deviation ay nag-assume na ang iyong data ay galing sa normal distribution. Kapag nabigo ang assumption na ito (na karaniwan), ang mga intervals na ito ay maaaring maging napaka-inaccurate. Nagbibigay ang bootstrap ng distribution-free na alternatibo.

Kapag Nabigo ang Tradisyonal na Paraan

Ang chi-square-based CI para sa standard deviation ay nag-assume ng normality. Sa skewed data (kita, reaction times, survival data), maaari itong gumawa ng intervals na nami-miss ang tunay na parameter 20-30% ng oras, hindi ang inaasahang 5%.

Mga pangunahing bentahe ng bootstrap para sa standard deviation:

  • Walang distribution assumptions: Gumagana nang pantay-pantay sa normal, skewed, o heavy-tailed data
  • Magandang performance sa maliit na sample: Kadalasang mas tumpak kaysa parametric methods kapag n < 30
  • Kaya ang mga kumplikadong statistics: Parehong approach ang gumagana para sa trimmed SD, MAD, o custom variability measures
  • Visual na insight: Ipinapakita ng bootstrap distribution kung ano ang nangyayari, hindi lamang mga panghuling numero

Ang Proseso ng Bootstrap

Ang bootstrap algorithm ay napakasimple. Mula sa iyong orihinal na sample na may n na obserbasyon:

1

Kumuha ng Bootstrap Sample

Random na pumili ng n na obserbasyon na may replacement mula sa iyong orihinal na data. May mga halaga na lalabas nang maraming beses, may iba namang hindi lalabas.
2

Kalkulahin ang Statistic

Kunin ang standard deviation ng bootstrap sample na ito. Isa itong bootstrap replicate.
3

Ulitin nang Maraming Beses

Ulitin ang steps 1-2 nang libu-libong beses (karaniwang B = 10,000). Bawat pag-ulit ay nagbibigay ng isang bootstrap SD.
4

Suriin ang Distribution

Ang koleksyon ng B na bootstrap SDs ang nag-a-approximate sa sampling distribution. Gamitin ito para sa CIs at hypothesis testing.

Bakit May Replacement?

Ang sampling na may replacement ay napakahalaga. Ito ang lumilikha ng mga sample na nag-iiba-iba sa komposisyon, na ginagaya ang variability na makikita mo sa iba't ibang samples mula sa population. Kung walang replacement, bawat sample ay magiging kapareho ng orihinal.

Ilang bootstrap samples? B = 1,000 ay madalas sapat para sa rough estimates at hypothesis tests. Para sa confidence intervals, B = 10,000 ang nagbibigay ng stable percentiles. Para sa publication-quality BCa intervals, inirerekomenda ang B = 15,000+.

Mga Paraan ng Bootstrap Confidence Interval

Mayroong ilang mga paraan para bumuo ng confidence intervals mula sa bootstrap samples, bawat isa ay may kanya-kanyang tradeoffs:

1. Percentile Method (Pinakasimple)

Ang pinaka-intuitive na approach: direktang kunin ang percentiles ng bootstrap distribution.

Percentile CI

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

Para sa 10,000 bootstrap samples, ito ang ika-250 at ika-9,750 na ordered values. Simple ngunit maaaring biased kapag skewed ang bootstrap distribution.

2. Basic (Pivotal) Bootstrap

Ginagamit ang relasyon sa pagitan ng sample statistic at bootstrap statistics:

Basic Bootstrap CI

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

Kung saan θ̂ ang orihinal na sample SD. Ito ay “nagre-reflect” ng percentile interval sa paligid ng sample estimate.

3. BCa (Bias-Corrected and Accelerated)

Ang gold standard para sa katumpakan. Ang BCa ay nag-a-adjust para sa parehong bias sa bootstrap distribution at acceleration (kung paano nagbabago ang standard error kasama ang parameter value). Mas kumplikado ang pagkalkula ngunit nagbibigay ng second-order accurate intervals.

ParaanMga BentaheMga Limitasyon
PercentileSimple, intuitiveMaaaring biased sa skewed data
BasicSymmetric intervalsMaaaring magbigay ng negatibong halaga
BCaPinakatumpak, transformation-respectingComputationally intensive

Worked Example: Non-Normal Data

Isaalang-alang ang 15 sukat ng response times (sa ms): 245, 312, 287, 456, 234, 298, 267, 523, 289, 301, 278, 645, 256, 289, 312. Ang data na ito ay right-skewed (may ilang napakabagal na tugon).

1

Kalkulahin ang Sample SD

Orihinal na sample: n=15, SD = 109.8 ms
2

Gumawa ng Bootstrap Samples

Kumuha ng 10,000 samples na may laki na 15 na may replacement. Bawat sample ay may iba't ibang komposisyon.
3

Kalkulahin ang Bootstrap SDs

Kalkulahin ang SD para sa bawat bootstrap sample, na nagbibigay ng 10,000 halaga na mula ~60 hanggang ~180
4

Hanapin ang mga Percentiles

Ika-2.5 percentile: 72.3 ms, Ika-97.5 percentile: 156.8 ms
5

Bumuo ng 95% CI

95% CI: [72.3, 156.8] ms. Ihambing sa chi-square CI: [79.4, 175.2] na nag-assume ng normality.

Ang bootstrap CI ay asymmetric (mas malawak sa mataas na bahagi), na nagpapakita ng right-skewed na katangian ng data. Hindi nakukuha ng chi-square CI ang asymmetry na ito.

Python Implementation

Kumpletong bootstrap implementation na may iba't ibang CI methods:

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