Kebingungan antara prosedur bootstrap dan prosedur Monte Carlo ini terus berulang, jadi mungkin ini adalah tempat yang baik untuk mengatasinya. (Contoh R
kode juga dapat membantu pekerjaan rumah.)
Pertimbangkan penerapan bootstrap ini di R
:
boot <- function(x, t) { # Exact bootstrap of procedure t on data x
n <- length(x) # Must lie between 2 and 7 inclusive.
if (n > 7) {
stop("Sample size exceeds 7; use an approximate method instead.")
}
p <- c(n, 1:(n-1))
a <- rep(x, n^(n-1))
dim(a) <- rep(n, n)
y <- as.vector(a)
while (n > 1) {
n <- n-1
a <- aperm(a, p)
y <- cbind(as.vector(a), y)
}
apply(y, 1, t)
}
Pandangan cepat akan mengkonfirmasi bahwa ini adalah perhitungan deterministik : tidak ada nilai acak yang dihasilkan atau digunakan. (Saya akan meninggalkan rincian pekerjaan dalamnya untuk pembaca yang tertarik untuk mencari tahu sendiri.)
Argumen untuk boot
adalah kumpulan data numerik dalam array x
dan referensi t
ke fungsi (yang dapat diterapkan ke array persis seperti x
) untuk mengembalikan nilai numerik tunggal; dengan kata lain, t
adalah statistik . Ini menghasilkan semua sampel yang mungkin dengan penggantian dari x
dan berlaku t
untuk masing-masing, sehingga menghasilkan satu nomor untuk masing-masing sampel: itulah bootstrap singkatnya. Nilai kembali adalah array yang mewakili distribusi bootstrap tepat dari t
untuk sampel x
.
Sebagai contoh kecil , mari kita bootstrap mean untuk sampel x
= c(1,3)
:
> boot(c(1,3), mean)
> [1] 1 2 2 3
Memang ada empat kemungkinan sampel ukuran dengan penggantian dari ; yaitu, , , , dan . menghasilkan semuanya (dalam urutan yang baru saja tercantum) dan berlaku untuk masing-masing. Dalam hal ini menghitung rata-rata dan yang berubah menjadi , , , dan , masing-masing, seperti yang ditunjukkan dalam output.( 1 , 3 ) ( 1 , 1 ) ( 1 , 3 ) ( 3 , 1 ) ( 3 , 3 ) 1 2 2 32( 1 , 3 )( 1 , 1 )( 1 , 3 )( 3 , 1 )( 3 , 3 )boot
t
t
1223
Ke mana Anda pergi dari sini tergantung pada bagaimana Anda ingin menggunakan bootstrap. The penuh informasi tentang bootstrap yang terkandung dalam array output ini, sehingga biasanya ide yang baik untuk menampilkannya. Berikut adalah contoh di mana deviasi standar di-bootstrap dari sampel :( 1 , 3 , 3 , 4 , 7 )
hist(boot(c(1,3,3,4,7), sd))
Sekarang kita siap untuk berbicara tentang simulasi Monte Carlo. Misalkan, katakanlah, kami akan melakukan bootstrap batas kepercayaan 95% atas pada SD dari sampel dengan menggunakan persentil ke-95 atas dari distribusi bootstrapnya. Properti apa yang akan dimiliki prosedur ini? Salah satu cara untuk mengetahuinya adalah dengan menganggap sampel diperoleh secara acak dari, katakanlah, distribusi yang seragam. (Aplikasi akan sering menunjukkan apa asumsi distribusi yang masuk akal mungkin; di sini, saya sewenang-wenang memilih satu yang sederhana untuk perhitungan tetapi tidak mudah untuk berurusan dengan analitis.) Kita dapat mensimulasikan apa yang terjadi dengan mengambil sampel seperti itu dan menghitung UCL:5
> set.seed(17)
> quantile(boot(runif(5, min=0, max=10), sd), .95)[1]
95%
3.835870
Hasil untuk sampel acak khusus ini adalah 3,83587. Ini adalah yang pasti: yang Anda menelepon boot
lagi dengan yang sama set data, jawabannya akan persis sama. Tetapi bagaimana mungkin jawabannya berubah dengan sampel acak yang berbeda? Cari tahu dengan mengulangi proses ini beberapa kali dan menggambar histogram hasil:
> boot.sd <- replicate(100, quantile(boot(runif(5, min=0, max=10), sd), .95)[1])
> hist(boot.sd)
Jika kita melakukan serangkaian simulasi lain, undian acak akan keluar berbeda, membuat histogram (sedikit) berbeda - tetapi tidak jauh berbeda dari yang ini. Kita dapat menggunakannya dengan percaya diri untuk memahami bagaimana bootstrap UCL dari SD bekerja. Untuk referensi, perhatikan bahwa standar deviasi dari distribusi seragam (rentang rentang dari hingga seperti yang ditentukan di sini) sama dengan . Karena orang akan berharap untuk setiap UCL bernilai garam, mayoritas (tiga perempat, atau 0,75) dari nilai-nilai dalam histogram melebihi ini:10 10 / √01010/12−−√≈2.887
> length(boot.sd[boot.sd >= 10/sqrt(12)]) / length(boot.sd)
[1] 0.75
Tapi itu tidak mendekati nominal 95% yang kami tentukan (dan kami harapkan)! Ini adalah salah satu nilai simulasi: ini membandingkan harapan kami dengan apa yang sebenarnya terjadi. (Mengapa perbedaan? Saya percaya itu karena bootstrap SD tidak berfungsi dengan baik dengan sampel yang sangat kecil.)
Ulasan
Statistik bootstrap secara konseptual sama dengan statistik lainnya seperti mean atau standar deviasi; mereka cenderung membutuhkan waktu lama untuk menghitung. (Lihat pesan peringatan dalam boot
kode!)
Simulasi Monte-Carlo dapat berguna untuk mempelajari bagaimana statistik bootstrap bervariasi karena keacakan dalam memperoleh sampel. Variasi yang diamati dalam simulasi tersebut adalah karena variasi dalam sampel, bukan variasi dalam bootstrap.
(Tidak diilustrasikan di sini) Karena statistik bootstrap dapat mengambil banyak perhitungan (tampaknya, hingga perhitungan untuk sampel ukuran ), mudah untuk memperkirakan distribusi bootstrap. Ini biasanya dilakukan dengan membuat program "kotak hitam" untuk mendapatkan satu nilai secara acak dari distribusi bootstrap yang sebenarnya dan memanggil program itu berulang kali. Output kolektif mendekati distribusi yang tepat. Perkiraan dapat bervariasi karena keacakan dalam kotak hitam - tetapi variasi itu merupakan artefak dari prosedur pendekatan. Ini tidak (secara konseptual) melekat dalam prosedur bootstrap itu sendiri. nnnn