Cakupan probabilitas Interval kepercayaan bootstrap dasar

11

Saya memiliki pertanyaan berikut untuk kursus yang sedang saya kerjakan:

Lakukan studi Monte Carlo untuk memperkirakan probabilitas cakupan interval kepercayaan bootstrap normal standar dan interval kepercayaan bootstrap dasar. Sampel dari populasi normal dan periksa tingkat cakupan empiris untuk rata-rata sampel.

Probabilitas cakupan untuk CI bootstrap normal standar mudah:

n = 1000;
alpha = c(0.025, 0.975);
x = rnorm(n, 0, 1);
mu = mean(x);
sqrt.n = sqrt(n);

LNorm = numeric(B);
UNorm = numeric(B);

for(j in 1:B)
{
    smpl = x[sample(1:n, size = n, replace = TRUE)];
    xbar = mean(smpl);
    s = sd(smpl);

    LNorm[j] = xbar + qnorm(alpha[1]) * (s / sqrt.n);
    UNorm[j] = xbar + qnorm(alpha[2]) * (s / sqrt.n);
}

mean(LNorm < 0 & UNorm > 0); # Approximates to 0.95
# NOTE: it is not good enough to look at overall coverage
# Must compute separately for each tail

Dari apa yang telah saya pelajari untuk kursus ini, interval kepercayaan bootstrap dasar dapat dihitung seperti ini:

# Using x from previous...
R = boot(data = x, R=1000, statistic = function(x, i){ mean(x[i]); });
result = 2 * mu - quantile(R$t, alpha, type=1);

Itu masuk akal. Yang tidak saya mengerti adalah bagaimana menghitung probabilitas cakupan untuk CI bootstrap dasar. Saya memahami bahwa probabilitas cakupan akan mewakili berapa kali CI berisi nilai sebenarnya (dalam kasus ini mu). Apakah saya hanya menjalankan bootfungsi berkali-kali?

Bagaimana saya bisa mendekati pertanyaan ini secara berbeda?

TheCloudlessSky
sumber
Apakah Anda size=100salah ketik? Saya tidak percaya Anda mendapatkan batas kanan atas dan bawah karena ukuran sampel implisit tampaknya 1000 ketika Anda menghitung CI Anda dalam loop (karena Anda gunakan sqrt.ndalam perhitungan). Juga, mengapa Anda membandingkan mudan bukan 0 secara langsung (yang terakhir menjadi mean sebenarnya)?
kardinal
Juga, smpl = x[sample(1:n, size = 100, replace = TRUE)]; dapat disederhanakan menjadi smpl = sample(x, size=100, replace=TRUE).
kardinal
@ cardinal - Ya itu salah ketik dan sama dengan mumenjadi 0. CI normal berfungsi dengan baik, itu adalah bootstrap CI dasar yang saya mengalami kesulitan.
TheCloudlessSky

Jawaban:

16

Terminologi ini mungkin tidak digunakan secara konsisten, jadi berikut ini hanya bagaimana saya memahami pertanyaan aslinya. Dari pemahaman saya, CI normal yang Anda hitung bukanlah yang diminta. Setiap set replikasi bootstrap memberi Anda satu interval kepercayaan, tidak banyak. Cara untuk menghitung berbagai tipe CI dari hasil satu set replikasi bootstrap adalah sebagai berikut:

B    <- 999                  # number of replicates
muH0 <- 100                  # for generating data: true mean
sdH0 <- 40                   # for generating data: true sd
N    <- 200                  # sample size
DV   <- rnorm(N, muH0, sdH0) # simulated data: original sample

Karena saya ingin membandingkan perhitungan dengan hasil dari paket boot, saya pertama-tama mendefinisikan fungsi yang akan dipanggil untuk setiap ulangan. Argumennya adalah sampel asli, dan vektor indeks menentukan kasus untuk satu ulangan. Ia mengembalikan , estimasi plug-in untuk , serta , estimasi plug-in untuk varian mean . Yang terakhir hanya diperlukan untuk bootstrap -CI. μ SMμ σ 2 M tSM2σM2t

> getM <- function(orgDV, idx) {
+     bsM   <- mean(orgDV[idx])                       # M*
+     bsS2M <- (((N-1) / N) * var(orgDV[idx])) / N    # S^2*(M)
+     c(bsM, bsS2M)
+ }

> library(boot)                                       # for boot(), boot.ci()
> bOut <- boot(DV, statistic=getM, R=B)
> boot.ci(bOut, conf=0.95, type=c("basic", "perc", "norm", "stud"))
BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
Based on 999 bootstrap replicates
CALL : 
boot.ci(boot.out = bOut, conf = 0.95, type = c("basic", "perc", "norm", "stud"))

Intervals : 
Level      Normal            Basic         Studentized        Percentile    
95%   ( 95.6, 106.0 )   ( 95.7, 106.2 )  ( 95.4, 106.2 )   ( 95.4, 106.0 )  
Calculations and Intervals on Original Scale

Tanpa menggunakan paket, bootAnda cukup menggunakan replicate()satu set replikasi bootstrap.

boots <- t(replicate(B, getM(DV, sample(seq(along=DV), replace=TRUE))))

Tapi mari kita tetap dengan hasil dari boot.ci()memiliki referensi.

boots   <- bOut$t                     # estimates from all replicates
M       <- mean(DV)                   # M from original sample
S2M     <- (((N-1)/N) * var(DV)) / N  # S^2(M) from original sample
Mstar   <- boots[ , 1]                # M* for each replicate
S2Mstar <- boots[ , 2]                # S^2*(M) for each replicate
biasM   <- mean(Mstar) - M            # bias of estimator M

Dasar, persentil, dan -CI bergantung pada distribusi empiris dari estimasi bootstrap. Untuk mendapatkan kuantil dan , kami menemukan indeks yang sesuai dengan vektor yang diurutkan dari perkiraan bootstrap (perhatikan bahwa akan melakukan interpolasi yang lebih rumit untuk menemukan kuantil empiris ketika indeks bukan bilangan alami) .α / 2 1 - α / 2tα/21α/2boot.ci()

(idx <- trunc((B + 1) * c(0.05/2, 1 - 0.05/2)) # indices for sorted vector of estimates
[1] 25 975

> (ciBasic <- 2*M - sort(Mstar)[idx])          # basic CI
[1] 106.21826  95.65911

> (ciPerc <- sort(Mstar)[idx])                 # percentile CI
[1] 95.42188 105.98103

Untuk -CI, kita membutuhkan estimasi bootstrap untuk menghitung nilai- kritis . Untuk CI normal standar, nilai kritis hanya akan menjadi nilai dari distribusi normal standar.t t ztttz

# standard normal CI with bias correction
> zCrit   <- qnorm(c(0.025, 0.975))   # z-quantiles from std-normal distribution
> (ciNorm <- M - biasM + zCrit * sqrt(var(Mstar)))
[1] 95.5566 106.0043

> tStar <- (Mstar-M) / sqrt(S2Mstar)  # t*
> tCrit <- sort(tStar)[idx]           # t-quantiles from empirical t* distribution
> (ciT  <- M - tCrit * sqrt(S2M))     # studentized t-CI
[1] 106.20690  95.44878

Untuk memperkirakan probabilitas cakupan tipe-CI ini, Anda harus menjalankan simulasi ini berkali-kali. Hanya membungkus kode menjadi suatu fungsi, mengembalikan daftar dengan hasil-CI dan menjalankannya dengan replicate()seperti yang ditunjukkan dalam inti ini .

caracal
sumber
Wow! - Penjelasan luar biasa tentang apa yang saya lakukan salah. Juga - terima kasih untuk tips kode! Ini bekerja dengan sempurna!
TheCloudlessSky
Oke satu pertanyaan terakhir: ketika saya mencoba mereplikasi informasi ini, saya membuat sebuah fungsi computeCIsdan memanggil results = replicate(500, computeCIs());. Pada akhirnya computeCIskembali c(ciBasic, ciPerc). Untuk menguji probabilitas cakupan, bukankah sebaiknya saya menguji untuk mean(results[1, ] < 0 & results[2, ] > 0)menguji untuk semua Basic CI yang mengandung mean yang sebenarnya (probabilitas cakupan)? Ketika saya menjalankan ini, saya mengerti 1ketika saya pikir saya harus mendapatkannya 0.95.
TheCloudlessSky
@TheCloudlessSky Untuk fungsi lengkap dan simulasi penuh dengan hasil yang diharapkan dalam hal frekuensi cakupan, lihat pastebin.com/qKpNKK0D
caracal
Yup, saya idiot :) Saya membuat kesalahan ketik ketika menyalin kode di R ... terima kasih atas semua bantuan Anda! :)
TheCloudlessSky
Terima kasih @caracal untuk jawaban yang bagus. Tautan pastebin.com/qKpNKK0Drusak. Sangat menghargai jika Anda memperbaruinya dan menyediakan fungsi lengkap dan simulasi penuh. Terima kasih
MYaseen208