tl; dr: Dimulai dengan dataset yang dihasilkan di bawah nol, saya melakukan resampled case dengan penggantian dan melakukan tes hipotesis pada setiap dataset yang di-resampled. Tes hipotesis ini menolak nol lebih dari 5% dari waktu.
Di bawah ini, simulasi yang sangat sederhana, saya menghasilkan dataset dengan , dan saya memasangkan model OLS sederhana untuk masing-masingnya. Kemudian, untuk setiap dataset, saya menghasilkan 1000 dataset baru dengan resampling baris dataset asli dengan penggantian (suatu algoritma yang secara khusus dijelaskan dalam teks klasik Davison & Hinkley sebagai yang sesuai untuk regresi linier). Untuk masing-masing, saya cocok dengan model OLS yang sama. Pada akhirnya, sekitar 16% dari tes hipotesis dalam sampel bootstrap menolak nol , sedangkan kita harus mendapatkan 5% (seperti yang kita lakukan dalam dataset asli).
Saya menduga itu ada hubungannya dengan pengamatan berulang yang menyebabkan asosiasi meningkat, jadi untuk perbandingan, saya mencoba dua pendekatan lain dalam kode di bawah ini (berkomentar). Dalam Metode 2, saya memperbaiki , kemudian mengganti dengan residu resampled dari model OLS pada dataset asli. Dalam Metode 3, saya menggambar subsampel acak tanpa penggantian. Kedua alternatif ini bekerja, yaitu, tes hipotesis mereka menolak nol 5% dari waktu.Y
Pertanyaan saya: Apakah saya benar bahwa pengamatan berulang adalah pelakunya? Jika demikian, mengingat bahwa ini adalah pendekatan standar untuk bootstrap, di mana tepatnya kita melanggar teori bootstrap standar?
Pembaruan # 1: Lebih banyak simulasi
Aku mencoba skenario yang lebih sederhana, model regresi intercept-hanya untuk . Masalah yang sama terjadi.
# note: simulation takes 5-10 min on my laptop; can reduce boot.reps
# and n.sims.run if wanted
# set the number of cores: can change this to match your machine
library(doParallel)
registerDoParallel(cores=8)
boot.reps = 1000
n.sims.run = 1000
for ( j in 1:n.sims.run ) {
# make initial dataset from which to bootstrap
# generate under null
d = data.frame( X1 = rnorm( n = 1000 ), Y1 = rnorm( n = 1000 ) )
# fit OLS to original data
mod.orig = lm( Y1 ~ X1, data = d )
bhat = coef( mod.orig )[["X1"]]
se = coef(summary(mod.orig))["X1",2]
rej = coef(summary(mod.orig))["X1",4] < 0.05
# run all bootstrap iterates
parallel.time = system.time( {
r = foreach( icount( boot.reps ), .combine=rbind ) %dopar% {
# Algorithm 6.2: Resample entire cases - FAILS
# residuals of this model are repeated, so not normal?
ids = sample( 1:nrow(d), replace=TRUE )
b = d[ ids, ]
# # Method 2: Resample just the residuals themselves - WORKS
# b = data.frame( X1 = d$X1, Y1 = sample(mod.orig$residuals, replace = TRUE) )
# # Method 3: Subsampling without replacement - WORKS
# ids = sample( 1:nrow(d), size = 500, replace=FALSE )
# b = d[ ids, ]
# save stats from bootstrap sample
mod = lm( Y1 ~ X1, data = b )
data.frame( bhat = coef( mod )[["X1"]],
se = coef(summary(mod))["X1",2],
rej = coef(summary(mod))["X1",4] < 0.05 )
}
} )[3]
###### Results for This Simulation Rep #####
r = data.frame(r)
names(r) = c( "bhat.bt", "se.bt", "rej.bt" )
# return results of each bootstrap iterate
new.rows = data.frame( bt.iterate = 1:boot.reps,
bhat.bt = r$bhat.bt,
se.bt = r$se.bt,
rej.bt = r$rej.bt )
# along with results from original sample
new.rows$bhat = bhat
new.rows$se = se
new.rows$rej = rej
# add row to output file
if ( j == 1 ) res = new.rows
else res = rbind( res, new.rows )
# res should have boot.reps rows per "j" in the for-loop
# simulation rep counter
d$sim.rep = j
} # end loop over j simulation reps
##### Analyze results #####
# dataset with only one row per simulation
s = res[ res$bt.iterate == 1, ]
# prob of rejecting within each resample
# should be 0.05
mean(res$rej.bt); mean(s$rej)
Pembaruan # 2: Jawabannya
Beberapa kemungkinan diajukan dalam komentar dan jawaban, dan saya melakukan lebih banyak simulasi untuk mengujinya secara empiris. Ternyata JWalker benar bahwa masalahnya adalah kami harus memusatkan statistik bootstrap dengan perkiraan data asli untuk mendapatkan distribusi sampel yang benar di bawah . Namun, saya juga berpikir bahwa komentar Whuber tentang melanggar asumsi tes parametrik juga benar, meskipun dalam kasus ini kita benar-benar mendapatkan positif palsu nominal ketika kita memperbaiki masalah JWalker.
ids
ids <- unique(ids)