tl; dr: null altında oluşturulan bir veri kümesi ile başlayarak, vakaları değiştirerek yeniden örnekledim ve her yeniden örneklenen veri kümesi üzerinde bir hipotez testi gerçekleştirdim. Bu hipotez testleri boş değeri% 5'ten fazla reddeder.
Aşağıda, çok basit bir simülasyonda, ile veri kümeleri oluşturuyorum ve her birine basit bir OLS modeli takıyorum . Daha sonra, her veri kümesi için, orijinal veri kümesinin satırlarını değiştirmeyle yeniden örnekleyerek 1000 yeni veri kümesi oluşturuyorum (Davison & Hinkley'in klasik metninde doğrusal regresyon için uygun olarak özellikle açıklanan bir algoritma). Bunların her biri için aynı OLS modeline uyuyorum. Nihayetinde, bootstrap örnekleri içindeki hipotez testlerinin yaklaşık% 16'sı null değerini reddederken, % 5'i almalıyız (orijinal veri setlerinde olduğu gibi).
Şişirilmiş derneklere neden olan tekrarlanan gözlemlerle ilgili bir şey olduğundan şüpheliyim, bu yüzden karşılaştırma için aşağıdaki kodda diğer iki yaklaşımı denedim (yorumladı). Yöntem 2'de düzeltiyorum , sonra Y'yi orijinal veri kümesindeki OLS modelinden yeniden örneklenen artıklarla değiştiriyorum . Yöntem 3'te, değiştirmeden rastgele bir alt örnek çiziyorum. Bu alternatiflerin her ikisi de işe yarar, yani hipotez testleri zamanın% 5'ini boş bırakır.
Sorum: Tekrarlanan gözlemlerin suçlu olduğu doğru mu? Öyleyse, bunun önyükleme için standart bir yaklaşım olduğu düşünüldüğünde, standart önyükleme teorisini tam olarak nerede ihlal ediyoruz?
Güncelleme # 1: Daha fazla simülasyon
# 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)
Güncelleme # 2: Cevap