Σ
SDCalc
LanjutanLanjutan·15 min

Kaedah Bootstrap untuk Sisihan Piawai

Kuasai pensampelan semula bootstrap untuk anggaran sisihan piawai. Pelajari kaedah persentil, BCa, dan bootstrap parametrik dengan pelaksanaan Python dan contoh terperinci.

Bootstrap: Revolusi Statistik Era Komputer

Pensampelan semula bootstrap ialah teknik statistik yang berkuasa untuk menganggar taburan pensampelan sebarang statistik dengan melakukan pensampelan berulang daripada data cerapan anda. Diperkenalkan oleh Bradley Efron pada tahun 1979, teknik ini merevolusikan inferens statistik dengan membolehkan analisis statistik yang kompleks tanpa bergantung pada formula matematik atau andaian taburan.

Idea utama di sebalik bootstrap sangat mudah: sampel anda ialah anggaran terbaik bagi populasi. Dengan mengambil sampel semula daripada sampel anda (dengan penggantian), anda mensimulasikan apa yang akan berlaku jika anda boleh mengambil sampel berulang kali daripada populasi. Pendekatan ini sangat bernilai untuk sisihan piawai, kerana formula selang keyakinan tradisional mengandaikan kenormalan—andaian yang sering gagal dalam amalan.

Bootstrap telah menjadi penting dalam sains data moden kerana ia berfungsi dengan sebarang statistik (median, korelasi, pekali regresi, pemberat rangkaian neural) dan tidak membuat sebarang andaian tentang taburan asas data anda.

Mengapa Bootstrap untuk Sisihan Piawai?

Selang keyakinan tradisional untuk sisihan piawai mengandaikan data anda datang daripada taburan normal. Apabila andaian ini gagal (yang sering berlaku), selang ini boleh menjadi sangat tidak tepat. Bootstrap menyediakan alternatif yang bebas taburan.

Bila Kaedah Tradisional Gagal

Selang keyakinan berasaskan khi kuasa dua untuk sisihan piawai mengandaikan kenormalan. Dengan data pencong (pendapatan, masa tindak balas, data kemandirian), selang ini boleh menghasilkan julat yang terlepas parameter sebenar 20-30% daripada masa, bukan 5% yang dijangkakan.

Kelebihan utama bootstrap untuk sisihan piawai:

  • Tiada andaian taburan: Berfungsi sama baik dengan data normal, pencong, atau ekor berat
  • Prestasi sampel kecil: Selalunya lebih tepat daripada kaedah parametrik dengan n < 30
  • Mengendalikan statistik kompleks: Pendekatan yang sama berfungsi untuk SD tercantas, MAD, atau ukuran kebolehubahan tersuai
  • Pandangan visual: Taburan bootstrap menunjukkan apa yang berlaku, bukan sekadar nombor akhir

Prosedur Bootstrap

Algoritma bootstrap sangat mudah. Daripada sampel asal anda yang mengandungi n cerapan:

1

Ambil Sampel Bootstrap

Pilih secara rawak n cerapan dengan penggantian daripada data asal anda. Sesetengah nilai akan muncul beberapa kali, yang lain tidak langsung.
2

Kira Statistik

Hitung sisihan piawai sampel bootstrap ini. Ini ialah satu replikat bootstrap.
3

Ulang Banyak Kali

Ulang langkah 1-2 beribu-ribu kali (biasanya B = 10,000). Setiap ulangan menghasilkan satu SD bootstrap.
4

Analisis Taburan

Koleksi B SD bootstrap menganggarkan taburan pensampelan. Gunakannya untuk selang keyakinan dan ujian hipotesis.

Mengapa Dengan Penggantian?

Pensampelan dengan penggantian adalah penting. Ia mencipta sampel yang berbeza komposisi, meniru kebolehubahan yang anda akan lihat merentasi sampel berbeza daripada populasi. Tanpa penggantian, setiap sampel akan sama dengan yang asal.

Berapa banyak sampel bootstrap? B = 1,000 selalunya mencukupi untuk anggaran kasar dan ujian hipotesis. Untuk selang keyakinan, B = 10,000 menyediakan persentil yang stabil. Untuk selang BCa berkualiti penerbitan, B = 15,000+ disyorkan.

Kaedah Selang Keyakinan Bootstrap

Beberapa kaedah wujud untuk membina selang keyakinan daripada sampel bootstrap, setiap satu dengan pertukaran tersendiri:

1. Kaedah Persentil (Paling Mudah)

Pendekatan paling intuitif: ambil persentil taburan bootstrap secara terus.

Percentile CI

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

Untuk 10,000 sampel bootstrap, ini ialah nilai ke-250 dan ke-9,750 yang ditertibkan. Mudah tetapi boleh menjadi bias apabila taburan bootstrap pencong.

2. Bootstrap Asas (Pivotal)

Menggunakan hubungan antara statistik sampel dan statistik bootstrap:

Basic Bootstrap CI

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

Di mana θ̂ ialah SD sampel asal. Kaedah ini “memantulkan” selang persentil di sekitar anggaran sampel.

3. BCa (Diperbetulkan Bias dan Dipercepatkan)

Piawaian emas untuk ketepatan. BCa melaraskan kedua-dua bias dalam taburan bootstrap dan pecutan (bagaimana ralat piawai berubah dengan nilai parameter). Lebih kompleks untuk dikira tetapi menyediakan selang ketepatan tertib kedua.

KaedahKelebihanKelemahan
PersentilMudah, intuitifBoleh bias dengan data pencong
AsasSelang simetriMungkin menghasilkan nilai negatif
BCaPaling tepat, menghormati transformasiIntensif dari segi pengiraan

Contoh Terperinci: Data Tidak Normal

Pertimbangkan 15 ukuran masa tindak balas (dalam ms): 245, 312, 287, 456, 234, 298, 267, 523, 289, 301, 278, 645, 256, 289, 312. Data ini pencong ke kanan (beberapa tindak balas yang sangat perlahan).

1

Kira SD Sampel

Sampel asal: n=15, SD = 109.8 ms
2

Jana Sampel Bootstrap

Ambil 10,000 sampel bersaiz 15 dengan penggantian. Setiap sampel mempunyai komposisi yang berbeza.
3

Kira SD Bootstrap

Hitung SD untuk setiap sampel bootstrap, mendapat 10,000 nilai dalam julat ~60 hingga ~180
4

Cari Persentil

Persentil ke-2.5: 72.3 ms, Persentil ke-97.5: 156.8 ms
5

Bentuk SK 95%

SK 95%: [72.3, 156.8] ms. Bandingkan dengan SK khi kuasa dua: [79.4, 175.2] yang mengandaikan kenormalan.

SK bootstrap adalah tidak simetri (lebih lebar di bahagian tinggi), mencerminkan sifat pencong ke kanan data tersebut. SK khi kuasa dua tidak menangkap ketidaksimetrian ini.

Pelaksanaan Python

Pelaksanaan bootstrap lengkap dengan pelbagai kaedah SK:

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