tl; dr: En commençant par un ensemble de données généré sous la valeur nulle, j'ai rééchantillonné les cas avec remplacement et effectué un test d'hypothèse sur chaque ensemble de données rééchantillonné. Ces tests d'hypothèse rejettent le nul plus de 5% du temps.
Dans la simulation ci-dessous, très simple, je génère des ensembles de données avec , et un modèle OLS simple à chacun. Ensuite, pour chaque ensemble de données, je génère 1000 nouveaux ensembles de données en rééchantillonnant les lignes de l'ensemble de données d'origine avec remplacement (un algorithme spécifiquement décrit dans le texte classique de Davison & Hinkley comme étant approprié pour la régression linéaire). Pour chacun d'eux, je correspond au même modèle OLS. En fin de compte, environ 16% des tests d'hypothèse dans les échantillons de bootstrap rejettent le zéro , alors que nous devrions obtenir 5% (comme nous le faisons dans les ensembles de données d'origine).
Je soupçonnais que cela avait quelque chose à voir avec des observations répétées provoquant des associations gonflées, donc à titre de comparaison, j'ai essayé deux autres approches dans le code ci-dessous (commenté). Dans la méthode 2, je corrige , puis je remplace par des résidus rééchantillonnés du modèle OLS sur le jeu de données d'origine. Dans la méthode 3, je dessine un sous-échantillon aléatoire sans remplacement. Ces deux alternatives fonctionnent, c'est-à-dire que leurs tests d'hypothèse rejettent les 5% nuls du temps.Y
Ma question: ai-je raison de dire que les observations répétées sont le coupable? Si oui, étant donné qu'il s'agit d'une approche standard du bootstrap, où violons-nous exactement la théorie du bootstrap standard?
Mise à jour # 1: plus de simulations
J'ai essayé un scénario encore plus simple, un modèle de régression ordonnée à l' origine uniquement pour . Le même problème se produit.
# 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)
Mise à jour # 2: la réponse
Plusieurs possibilités ont été proposées dans les commentaires et réponses, et j'ai fait plus de simulations pour les tester empiriquement. Il s'avère que JWalker a raison que le problème est que nous avions besoin de centrer les statistiques de bootstrap par l'estimation des données d'origine afin d'obtenir la distribution d'échantillonnage correcte sous . Cependant, je pense également que le commentaire de Whuber sur la violation des hypothèses de test paramétrique est également correct, bien que dans ce cas, nous obtenions en fait des faux positifs nominaux lorsque nous résolvons le problème de JWalker.