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
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:
Ambil Sampel Bootstrap
Kira Statistik
Ulang Banyak Kali
Analisis Taburan
Mengapa Dengan Penggantian?
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
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
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.
| Kaedah | Kelebihan | Kelemahan |
|---|---|---|
| Persentil | Mudah, intuitif | Boleh bias dengan data pencong |
| Asas | Selang simetri | Mungkin menghasilkan nilai negatif |
| BCa | Paling tepat, menghormati transformasi | Intensif 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).
Kira SD Sampel
Jana Sampel Bootstrap
Kira SD Bootstrap
Cari Persentil
Bentuk SK 95%
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:
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}]")