tl; dr: Bắt đầu với một tập dữ liệu được tạo dưới dạng null, tôi đã ghép lại các trường hợp với sự thay thế và tiến hành kiểm tra giả thuyết trên mỗi tập dữ liệu được lấy mẫu lại. Các thử nghiệm giả thuyết này từ chối null hơn 5% thời gian.
Trong phần mô phỏng rất đơn giản dưới đây, tôi tạo các bộ dữ liệu với và tôi khớp một mô hình OLS đơn giản cho mỗi mô hình. Sau đó, với mỗi tập dữ liệu, tôi tạo 1000 bộ dữ liệu mới bằng cách lấy lại các hàng của tập dữ liệu gốc với sự thay thế (một thuật toán được mô tả cụ thể trong văn bản cổ điển của Davison & Hinkley là phù hợp với hồi quy tuyến tính). Đối với mỗi loại, tôi phù hợp với cùng một mô hình OLS. Cuối cùng, khoảng 16% các bài kiểm tra giả thuyết trong các mẫu bootstrap từ chối null , trong khi chúng ta sẽ nhận được 5% (như chúng ta làm trong các bộ dữ liệu gốc).
Tôi nghi ngờ nó có liên quan đến các quan sát lặp đi lặp lại gây ra các hiệp hội bị thổi phồng, vì vậy để so sánh, tôi đã thử hai cách tiếp cận khác trong đoạn mã dưới đây (nhận xét). Trong Phương pháp 2, tôi sửa lỗi , sau đó thay thế bằng phần dư được lấy mẫu lại từ mô hình OLS trên tập dữ liệu gốc. Trong Phương pháp 3, tôi vẽ một mẫu phụ ngẫu nhiên mà không cần thay thế. Cả hai phương án này đều hoạt động, tức là các bài kiểm tra giả thuyết của họ bác bỏ null 5% thời gian.Y
Câu hỏi của tôi: Tôi có đúng rằng những quan sát lặp đi lặp lại là thủ phạm? Nếu vậy, cho rằng đây là một cách tiếp cận tiêu chuẩn để bootstrapping, chính xác thì chúng ta đang vi phạm lý thuyết bootstrap tiêu chuẩn ở đâu?
Cập nhật # 1: Thêm mô phỏng
Tôi đã thử một kịch bản thậm chí đơn giản hơn, một mô hình hồi quy đánh chặn chỉ cho . Vấn đề tương tự xảy ra.
# 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)
Cập nhật # 2: Câu trả lời
Một số khả năng đã được đề xuất trong các bình luận và câu trả lời, và tôi đã thực hiện nhiều mô phỏng hơn để kiểm tra thực nghiệm chúng. Hóa ra JWalker đúng là vấn đề là chúng ta cần phải căn giữa số liệu thống kê bootstrap theo ước tính của dữ liệu gốc để có được phân phối lấy mẫu chính xác theo . Tuy nhiên, tôi cũng nghĩ rằng nhận xét của người đăng ký về việc vi phạm các giả định kiểm tra tham số cũng đúng, mặc dù trong trường hợp này chúng tôi thực sự nhận được kết quả dương tính giả khi chúng tôi khắc phục sự cố của JWalker.