Bootstrap adalah metode inferensi tentang suatu populasi menggunakan data sampel. Bradley Efron pertama kali memperkenalkannya dalam makalah ini pada tahun 1979. Bootstrap bergantung pada pengambilan sampel dengan pengembalian dari data sampel. Teknik ini dapat digunakan untuk memperkirakan galat baku dari statistik apa pun dan untuk memperoleh interval kepercayaan (CI) untuk statistik tersebut. Bootstrap sangat berguna ketika CI tidak memiliki bentuk tertutup, atau memiliki bentuk yang sangat rumit.
Misalkan kita memiliki sampel berukuran n elemen: X = {x1, x2, …, xn} dan kita tertarik pada CI untuk suatu statistik T = t(X). Kerangka bootstrap cukup lurus. Kita cukup mengulangi sebanyak R kali skema berikut: Untuk pengulangan ke-i, ambil sampel dengan pengembalian sebanyak n elemen dari sampel yang tersedia (beberapa elemen akan terambil lebih dari sekali). Sebut sampel baru ini sebagai sampel bootstrap ke-i, Xi, dan hitung statistik yang diinginkan Ti = t(Xi).
Hasilnya, kita akan mendapatkan R nilai statistik kita: T1, T2, …, TR. Kita menyebutnya realisasi bootstrap dari T atau distribusi bootstrap dari T. Berdasarkan ini, kita dapat menghitung CI untuk T. Ada beberapa cara untuk melakukannya. Mengambil persentil tampaknya yang paling mudah.
Bootstrap dalam Praktik
Mari gunakan (sekali lagi) dataset iris yang terkenal. Lihat beberapa baris pertamanya:
Misalkan kita ingin mencari CI untuk median Sepal.Length, median Sepal.Width dan koefisien korelasi peringkat Spearman antara keduanya. Kita akan menggunakan paket boot di R dan sebuah fungsi bernama... boot. Untuk memanfaatkannya kita harus membuat fungsi yang menghitung statistik kita dari data hasil resampling. Fungsi tersebut harus memiliki setidaknya dua argumen: sebuah dataset dan sebuah vektor berisi indices elemen dari dataset yang terpilih untuk membentuk sampel bootstrap.
Jika kita ingin menghitung CI untuk lebih dari satu statistik sekaligus, fungsi kita harus mengembalikannya sebagai satu vektor.
foo memilih elemen yang diinginkan (nomornya disimpan di indices) dari data dan menghitung koefisien korelasi dari dua kolom pertama (method='s' digunakan untuk memilih koefisien peringkat Spearman, method='p' akan menghasilkan koefisien Pearson) serta median keduanya.
Kita juga bisa menambahkan argumen ekstra, misalnya biarkan pengguna memilih jenis koefisien korelasi:
Untuk membuat tutorial ini lebih umum, saya akan menggunakan versi foo yang terakhir.
Sekarang, kita dapat menggunakan fungsi boot. Kita harus memberinya nama dataset, fungsi yang baru saja kita buat, jumlah pengulangan (R) dan argumen tambahan apa pun dari fungsi kita (seperti cor.type). Di bawah ini, saya menggunakan set.seed agar contoh ini dapat direplikasi.
set.seed(12345)
myBootstrap <- boot(iris, foo, R=1000, cor.type='s')Didukung oleh
Fungsi boot mengembalikan sebuah objek dengan kelas bernama... (ya, benar!) boot. Objek ini memiliki dua elemen yang menarik. $t berisi R nilai statistik kita yang dihasilkan oleh prosedur bootstrap (realisasi bootstrap dari T):
original sama dengan $t0. bias adalah selisih antara rerata realisasi bootstrap (yang ada di $t), yang disebut estimasi bootstrap dari T dan nilai pada dataset asli (yang ada di $t0).
colMeans(myBootstrap$t)-myBootstrap$t0
## [1] 0.002546391 -0.013350000 0.007900000Didukung oleh
std. error adalah galat baku dari estimasi bootstrap, yang sama dengan simpangan baku dari realisasi bootstrap.
apply(myBootstrap$t,2,sd)## [1] 0.07573983 0.10295571 0.02726414Didukung oleh
Berbagai Jenis CI Bootstrap
Sebelum mulai dengan CI, selalu ada baiknya melihat distribusi realisasi bootstrap. Kita bisa menggunakan fungsi plot, dengan index yang menunjukkan statistik mana yang dihitung dalam foo yang ingin kita lihat. Di sini index=1 adalah koefisien korelasi Spearman antara panjang dan lebar sepal, index=2 adalah median panjang sepal, dan index=3 adalah median lebar sepal.
Distribusi koefisien korelasi bootstrap terlihat cukup mendekati normal. Mari cari CI-nya. Kita bisa menggunakan boot.ci. Secara bawaan ia menggunakan CI 95 persen, tetapi dapat diubah dengan parameter conf.
boot.ci(myBootstrap, index=1)## Warning in boot.ci(myBootstrap, index = 1): bootstrap variances needed for## studentized intervals## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS## Based on 1000 bootstrap replicates#### CALL :## boot.ci(boot.out = myBootstrap, index = 1)#### Intervals :## Level Normal Basic ## 95% (-0.3178, -0.0209 ) (-0.3212, -0.0329 ) #### Level Percentile BCa ## 95% (-0.3007, -0.0124 ) (-0.3005, -0.0075 ) ## Calculations and Intervals on Original ScaleDidukung oleh
boot.ci menyediakan 5 jenis CI bootstrap. Salah satunya, interval studentized, bersifat unik. Ia memerlukan estimasi varians bootstrap. Kita tidak menyediakannya, sehingga R mencetak peringatan: bootstrap variances needed for studentized intervals. Estimasi varians dapat diperoleh dengan bootstrap tingkat kedua atau (lebih mudah) dengan teknik jackknife. Ini agak di luar cakupan tutorial ini, jadi mari fokus pada empat jenis CI bootstrap lainnya.
Jika kita tidak ingin melihat semuanya, kita dapat memilih yang relevan di argumen type. Nilai yang mungkin adalah norm, basic, stud, perc, bca atau vektor dari nilai-nilai ini.
boot.ci(myBootstrap, index=1, type=c('basic','perc'))## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS## Based on 1000 bootstrap replicates#### CALL :## boot.ci(boot.out = myBootstrap, type = c("basic", "perc"), index = 1)#### Intervals :## Level Basic Percentile ## 95% (-0.3212, -0.0329 ) (-0.3007, -0.0124 ) ## Calculations and Intervals on Original ScaleDidukung oleh
Fungsi boot.ci membuat objek dengan kelas... (ya, Anda menebaknya!) bootci. Elemennya dinamai sama seperti jenis CI yang digunakan di argumen type. $norm adalah vektor 3 elemen yang berisi tingkat kepercayaan dan batas CI.
CI persentil umumnya tidak direkomendasikan karena berkinerja buruk pada distribusi dengan ekor yang aneh. CI basic (juga disebut CI pivotal atau empiris) jauh lebih tangguh terhadap hal ini. Rasionalnya adalah menghitung selisih antara setiap replikasi bootstrap dan t0 dan menggunakan persentil dari distribusinya. Rincian lengkapnya dapat ditemukan, misalnya, di buku L. Wasserman All of Statistics
Rumus akhir untuk CI basic adalah:
(2t0 − θ1 − (1 − α)/2, 2t0 − θ(1 − α)/2)
BCα CI
BCα berasal dari bias-corrected, accelerated. Rumusnya tidak terlalu rumit tetapi agak tidak intuitif, jadi akan saya lewati. Lihat artikel oleh Thomas J. DiCiccio dan Bradley Efron jika Anda tertarik pada detailnya.
Percepatan yang disebutkan dalam nama metodenya memerlukan penggunaan persentil tertentu dari realisasi bootstrap. Terkadang bisa terjadi bahwa ini adalah persentil ekstrem, yang berpotensi outlier. BCα dapat menjadi tidak stabil dalam kasus seperti itu.
Mari lihat CI BCα untuk median lebar petal. Pada dataset asli, median ini tepat 3.
boot.ci(myBootstrap, index=3)## Warning in boot.ci(myBootstrap, index = 3): bootstrap variances needed for## studentized intervals## Warning in norm.inter(t, adj.alpha): extreme order statistics used as## endpoints## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS## Based on 1000 bootstrap replicates#### CALL :## boot.ci(boot.out = myBootstrap, index = 3)#### Intervals :## Level Normal Basic ## 95% ( 2.939, 3.046 ) ( 2.900, 3.000 ) #### Level Percentile BCa ## 95% ( 3.0, 3.1 ) ( 2.9, 2.9 ) ## Calculations and Intervals on Original Scale## Warning : BCa Intervals used Extreme Quantiles## Some BCa intervals may be unstableDidukung oleh
Kita mendapatkan CI BCα (2,9, 2,9). Itu aneh, tetapi untungnya R sudah memperingatkan bahwa extreme order statistics used as endpoints. Mari lihat apa yang sebenarnya terjadi di sini:
Dalam situasi seperti ini, "percepatan" dalam metode BCα mudah "melompat" ke nilai ekstrem. Di sini, CI persentil yang menjadi dasar CI BCα adalah (3, 3,1). Sekarang, ketika kita memperluasnya "ke kiri" kita harus menggunakan persentil 0,002. Perluasan "ke kanan" juga menuju ekstrem: persentil 0,997.
Replikasi Hasil
Terkadang, kita perlu membuat ulang replikasi bootstrap. Jika kita bisa menggunakan R untuk itu, ini bukan masalah. Fungsi set.seed menyelesaikan masalah tersebut. Membuat ulang replikasi bootstrap di perangkat lunak lain akan jauh lebih rumit. Selain itu, untuk R yang besar, perhitungan ulang di R juga bisa bukan pilihan (misalnya karena keterbatasan waktu).
Kita bisa mengatasi masalah ini dengan menyimpan indeks elemen dari dataset asli yang membentuk setiap sampel bootstrap. Inilah yang dilakukan fungsi boot.array (dengan argumen indices=T).
tableOfIndices<-boot.array(myBootstrap, indices=T)Didukung oleh
Setiap baris adalah satu sampel bootstrap. Misalnya, sampel pertama kita memuat elemen-elemen berikut:
Dengan menyetel indices=F (bawaan), kita akan mendapatkan jawaban atas pertanyaan "Berapa kali setiap elemen dari dataset asli muncul di setiap sampel bootstrap?". Misalnya, dalam sampel pertama: elemen ke-1 dari dataset muncul sekali, elemen ke-2 tidak muncul sama sekali, elemen ke-3 muncul sekali, elemen ke-4 dua kali, dan seterusnya.
Tabel seperti ini memungkinkan kita membuat ulang realisasi bootstrap di luar R. Atau di R sendiri ketika kita tidak ingin menggunakan set.seed dan melakukan semua perhitungan sekali lagi.
onceAgain<-apply(tableOfIndices,1, foo, data=iris, cor.type='s')Didukung oleh
Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Apa itu Bootstrap?
Bootstrap adalah metode inferensi tentang suatu populasi menggunakan data sampel. Bradley Efron pertama kali memperkenalkannya dalam makalah ini pada tahun 1979. Bootstrap bergantung pada pengambilan sampel dengan pengembalian dari data sampel. Teknik ini dapat digunakan untuk memperkirakan galat baku dari statistik apa pun dan untuk memperoleh interval kepercayaan (CI) untuk statistik tersebut. Bootstrap sangat berguna ketika CI tidak memiliki bentuk tertutup, atau memiliki bentuk yang sangat rumit.
Misalkan kita memiliki sampel berukuran n elemen: X = {x1, x2, …, xn} dan kita tertarik pada CI untuk suatu statistik T = t(X). Kerangka bootstrap cukup lurus. Kita cukup mengulangi sebanyak R kali skema berikut: Untuk pengulangan ke-i, ambil sampel dengan pengembalian sebanyak n elemen dari sampel yang tersedia (beberapa elemen akan terambil lebih dari sekali). Sebut sampel baru ini sebagai sampel bootstrap ke-i, Xi, dan hitung statistik yang diinginkan Ti = t(Xi).
Hasilnya, kita akan mendapatkan R nilai statistik kita: T1, T2, …, TR. Kita menyebutnya realisasi bootstrap dari T atau distribusi bootstrap dari T. Berdasarkan ini, kita dapat menghitung CI untuk T. Ada beberapa cara untuk melakukannya. Mengambil persentil tampaknya yang paling mudah.
Bootstrap dalam Praktik
Mari gunakan (sekali lagi) dataset
irisyang terkenal. Lihat beberapa baris pertamanya:Misalkan kita ingin mencari CI untuk median
Sepal.Length, medianSepal.Widthdan koefisien korelasi peringkat Spearman antara keduanya. Kita akan menggunakan paketbootdiRdan sebuah fungsi bernama...boot. Untuk memanfaatkannya kita harus membuat fungsi yang menghitung statistik kita dari data hasil resampling. Fungsi tersebut harus memiliki setidaknya dua argumen: sebuahdatasetdan sebuah vektor berisiindiceselemen dari dataset yang terpilih untuk membentuk sampel bootstrap.Jika kita ingin menghitung CI untuk lebih dari satu statistik sekaligus, fungsi kita harus mengembalikannya sebagai satu vektor.
Untuk contoh kita, fungsinya bisa seperti ini:
foomemilih elemen yang diinginkan (nomornya disimpan diindices) daridatadan menghitung koefisien korelasi dari dua kolom pertama (method='s'digunakan untuk memilih koefisien peringkat Spearman,method='p'akan menghasilkan koefisien Pearson) serta median keduanya.Kita juga bisa menambahkan argumen ekstra, misalnya biarkan pengguna memilih jenis koefisien korelasi:
Untuk membuat tutorial ini lebih umum, saya akan menggunakan versi
fooyang terakhir.Sekarang, kita dapat menggunakan fungsi
boot. Kita harus memberinya nama dataset, fungsi yang baru saja kita buat, jumlah pengulangan (R) dan argumen tambahan apa pun dari fungsi kita (seperticor.type). Di bawah ini, saya menggunakanset.seedagar contoh ini dapat direplikasi.Fungsi
bootmengembalikan sebuah objek dengan kelas bernama... (ya, benar!)boot. Objek ini memiliki dua elemen yang menarik.$tberisi R nilai statistik kita yang dihasilkan oleh prosedur bootstrap (realisasi bootstrap dari T):$t0berisi nilai statistik kita pada dataset asli, lengkap:Mencetak objek
bootke konsol memberikan informasi lebih lanjut:originalsama dengan$t0.biasadalah selisih antara rerata realisasi bootstrap (yang ada di$t), yang disebut estimasi bootstrap dari T dan nilai pada dataset asli (yang ada di$t0).std. erroradalah galat baku dari estimasi bootstrap, yang sama dengan simpangan baku dari realisasi bootstrap.Berbagai Jenis CI Bootstrap
Sebelum mulai dengan CI, selalu ada baiknya melihat distribusi realisasi bootstrap. Kita bisa menggunakan fungsi
plot, denganindexyang menunjukkan statistik mana yang dihitung dalamfooyang ingin kita lihat. Di siniindex=1adalah koefisien korelasi Spearman antara panjang dan lebar sepal,index=2adalah median panjang sepal, danindex=3adalah median lebar sepal.Distribusi koefisien korelasi bootstrap terlihat cukup mendekati normal. Mari cari CI-nya. Kita bisa menggunakan
boot.ci. Secara bawaan ia menggunakan CI 95 persen, tetapi dapat diubah dengan parameterconf.boot.cimenyediakan 5 jenis CI bootstrap. Salah satunya, interval studentized, bersifat unik. Ia memerlukan estimasi varians bootstrap. Kita tidak menyediakannya, sehinggaRmencetak peringatan:bootstrap variances needed for studentized intervals. Estimasi varians dapat diperoleh dengan bootstrap tingkat kedua atau (lebih mudah) dengan teknik jackknife. Ini agak di luar cakupan tutorial ini, jadi mari fokus pada empat jenis CI bootstrap lainnya.Jika kita tidak ingin melihat semuanya, kita dapat memilih yang relevan di argumen
type. Nilai yang mungkin adalahnorm,basic,stud,perc,bcaatau vektor dari nilai-nilai ini.Fungsi
boot.cimembuat objek dengan kelas... (ya, Anda menebaknya!)bootci. Elemennya dinamai sama seperti jenis CI yang digunakan di argumentype.$normadalah vektor 3 elemen yang berisi tingkat kepercayaan dan batas CI.$basic,$stud,$percdan$bcaadalah vektor 5 elemen yang juga berisi persentil yang digunakan untuk menghitung CI (kita akan kembali ke ini nanti):Sedikit notasi (Maaf!)
Untuk memahami seperti apa berbagai jenis CI, kita perlu memperkenalkan beberapa notasi. Jadi, misalkan:
CI Persentil
Dengan notasi di atas, CI persentil adalah:
jadi ini hanya mengambil persentil yang relevan. Tidak lebih.
CI Normal
CI Wald yang khas adalah:
tetapi dalam kasus bootstrap, kita perlu mengoreksinya terhadap bias. Jadi menjadi:
$$ t_0 - b \pm z_\alpha \cdot se^\star \\ 2t_0 - t^\star \pm z_\alpha \cdot se^\star$$
CI Basic
CI persentil umumnya tidak direkomendasikan karena berkinerja buruk pada distribusi dengan ekor yang aneh. CI basic (juga disebut CI pivotal atau empiris) jauh lebih tangguh terhadap hal ini. Rasionalnya adalah menghitung selisih antara setiap replikasi bootstrap dan t0 dan menggunakan persentil dari distribusinya. Rincian lengkapnya dapat ditemukan, misalnya, di buku L. Wasserman All of Statistics
Rumus akhir untuk CI basic adalah:
BCα CI
BCα berasal dari bias-corrected, accelerated. Rumusnya tidak terlalu rumit tetapi agak tidak intuitif, jadi akan saya lewati. Lihat artikel oleh Thomas J. DiCiccio dan Bradley Efron jika Anda tertarik pada detailnya.
Percepatan yang disebutkan dalam nama metodenya memerlukan penggunaan persentil tertentu dari realisasi bootstrap. Terkadang bisa terjadi bahwa ini adalah persentil ekstrem, yang berpotensi outlier. BCα dapat menjadi tidak stabil dalam kasus seperti itu.
Mari lihat CI BCα untuk median lebar petal. Pada dataset asli, median ini tepat 3.
Kita mendapatkan CI BCα (2,9, 2,9). Itu aneh, tetapi untungnya
Rsudah memperingatkan bahwaextreme order statistics used as endpoints. Mari lihat apa yang sebenarnya terjadi di sini:Distribusi realisasi bootstrap tidak biasa. Sebagian besar di antaranya (lebih dari 90%) bernilai 3.
Dalam situasi seperti ini, "percepatan" dalam metode BCα mudah "melompat" ke nilai ekstrem. Di sini, CI persentil yang menjadi dasar CI BCα adalah (3, 3,1). Sekarang, ketika kita memperluasnya "ke kiri" kita harus menggunakan persentil 0,002. Perluasan "ke kanan" juga menuju ekstrem: persentil 0,997.
Replikasi Hasil
Terkadang, kita perlu membuat ulang replikasi bootstrap. Jika kita bisa menggunakan
Runtuk itu, ini bukan masalah. Fungsiset.seedmenyelesaikan masalah tersebut. Membuat ulang replikasi bootstrap di perangkat lunak lain akan jauh lebih rumit. Selain itu, untuk R yang besar, perhitungan ulang diRjuga bisa bukan pilihan (misalnya karena keterbatasan waktu).Kita bisa mengatasi masalah ini dengan menyimpan indeks elemen dari dataset asli yang membentuk setiap sampel bootstrap. Inilah yang dilakukan fungsi
boot.array(dengan argumenindices=T).Setiap baris adalah satu sampel bootstrap. Misalnya, sampel pertama kita memuat elemen-elemen berikut:
Dengan menyetel
indices=F(bawaan), kita akan mendapatkan jawaban atas pertanyaan "Berapa kali setiap elemen dari dataset asli muncul di setiap sampel bootstrap?". Misalnya, dalam sampel pertama: elemen ke-1 dari dataset muncul sekali, elemen ke-2 tidak muncul sama sekali, elemen ke-3 muncul sekali, elemen ke-4 dua kali, dan seterusnya.Tabel seperti ini memungkinkan kita membuat ulang realisasi bootstrap di luar
R. Atau diRsendiri ketika kita tidak ingin menggunakanset.seeddan melakukan semua perhitungan sekali lagi.Mari periksa apakah hasilnya sama:
Ya, sama!
Jika Anda ingin mempelajari lebih lanjut tentang Machine Learning di R, ikuti kursus Machine Learning Toolbox dari DataCamp dan baca tutorial Machine Learning di R untuk pemula.