tl; dr : null에서 생성 된 데이터 세트로 시작하여 대체 사례를 리샘플링하고 각 리 샘플링 된 데이터 세트에 대해 가설 테스트를 수행했습니다. 이 가설 검정은 시간의 5 %를 초과하여 널을 거부합니다.
아래의 매우 간단한 시뮬레이션에서는 데이터 세트를 생성 하고 간단한 OLS 모델을 각각 적합시킵니다. 그런 다음 각 데이터 세트에 대해 원래 데이터 세트의 행을 대체로 리샘플링하여 1000 개의 새 데이터 세트를 생성합니다 (Davison & Hinkley의 고전 텍스트에 선형 회귀에 적합하다고 설명 된 알고리즘). 각각에 대해 동일한 OLS 모델에 적합합니다. 궁극적으로 부트 스트랩 샘플 내 가설 검정의 약 16 %가 null을 거부하는 반면, 원래 데이터 세트에서와 같이 5 %를 얻습니다.
나는 그것이 비정상적 인 연관을 일으키는 반복적 인 관측과 관련이 있다고 생각했기 때문에 비교를 위해 아래 코드에서 두 가지 다른 접근법을 시도했습니다 (주석 처리). 방법 2에서는 수정 한 다음 원래 데이터 세트의 OLS 모델에서 재 샘플링 된 잔차로 를 대체 합니다. 방법 3에서는 대체없이 임의의 하위 샘플을 그립니다. 이러한 대안은 모두 작동합니다. 즉, 가설 검정은 시간의 null 5 %를 거부합니다.
내 질문 : 반복적 인 관찰이 범인이라는 것이 옳습니까? 그렇다면, 이것이 부트 스트랩에 대한 표준 접근법이라는 것을 감안할 때, 표준 부트 스트랩 이론을 정확히 위반하는 위치는 무엇입니까?
업데이트 # 1 : 더 많은 시뮬레이션
# 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)
업데이트 # 2 : 답변