tl; dr: comenzando con un conjunto de datos generado bajo nulo, volví a muestrear casos con reemplazo y realicé una prueba de hipótesis en cada conjunto de datos remuestreado. Estas pruebas de hipótesis rechazan el nulo más del 5% del tiempo.
En la siguiente simulación, muy simple, genero conjuntos de datos con , y un modelo OLS simple para cada uno. Luego, para cada conjunto de datos, genero 1000 nuevos conjuntos de datos al volver a muestrear filas del conjunto de datos original con reemplazo (un algoritmo específicamente descrito en el texto clásico de Davison & Hinkley como apropiado para la regresión lineal). Para cada uno de ellos, me ajusto al mismo modelo OLS. En última instancia, aproximadamente el 16% de las pruebas de hipótesis dentro de las muestras de bootstrap rechazan el valor nulo , mientras que deberíamos obtener el 5% (como lo hacemos en los conjuntos de datos originales).
Sospeché que tiene algo que ver con las observaciones repetidas que causan asociaciones infladas, por lo que, para comparar, probé otros dos enfoques en el siguiente código (comentado). En el Método 2, reparo , luego reemplazo con residuos muestreados del modelo OLS en el conjunto de datos original. En el Método 3, dibujo una submuestra aleatoria sin reemplazo. Ambas alternativas funcionan, es decir, sus pruebas de hipótesis rechazan el nulo el 5% del tiempo.Y
Mi pregunta: ¿tengo razón en que las repetidas observaciones son las culpables? Si es así, dado que este es un enfoque estándar para el arranque, ¿ dónde estamos violando exactamente la teoría del arranque estándar?
Actualización n. ° 1: más simulaciones
Probé un escenario aún más simple, un modelo de regresión de sólo intersección de . El mismo problema ocurre.
# 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)
Actualización n. ° 2: la respuesta
Se propusieron varias posibilidades en los comentarios y respuestas, e hice más simulaciones para probarlas empíricamente. Resulta que JWalker tiene razón en que el problema es que necesitábamos centrar las estadísticas de bootstrap por la estimación de los datos originales para obtener la distribución de muestreo correcta en . Sin embargo, también creo que el comentario de Whuber sobre la violación de los supuestos de la prueba paramétrica también es correcto, aunque en este caso en realidad obtenemos falsos positivos nominales cuando solucionamos el problema de JWalker.
fuente
ids
ids <- unique(ids)
Respuestas:
Cuando vuelve a muestrear el valor nulo, el valor esperado del coeficiente de regresión es cero. Cuando vuelve a muestrear un conjunto de datos observado, el valor esperado es el coeficiente observado para esos datos. No es un error tipo I si P <= 0.05 cuando vuelve a muestrear los datos observados. De hecho, es un error de tipo II si tiene P> 0.05.
Puede ganar algo de intuición calculando la correlación entre los abdominales (b) y la media (P). Aquí hay un código más simple para replicar lo que hizo más calcular la correlación entre b y el error "tipo I" sobre el conjunto de simulaciones
actualizar la respuesta por grand_chat no es la razón por la cual la frecuencia de P <= 0.05 es> 0.05. La respuesta es muy simple y lo que he dicho anteriormente: el valor esperado de la media de cada muestra es la media original observada. Esta es toda la base del bootstrap, que se desarrolló para generar errores estándar / límites de confianza en una media observada y no como una prueba de hipótesis. Como la expectativa no es cero, por supuesto, el "error tipo I" será mayor que alfa. Y es por eso que habrá una correlación entre la magnitud del coeficiente (qué tan lejos de cero) y la magnitud de la desviación del "error tipo I" de alfa.
fuente
Si toma una muestra con reemplazo de su muestra normal original, la muestra de bootstrap resultante no es normal . La distribución conjunta de la muestra bootstrap sigue una distribución de mezcla retorcida que es muy probable que contenga registros duplicados, mientras que los valores duplicados tienen probabilidad cero cuando se toman muestras de una distribución normal.
Como ejemplo simple, si su muestra original es dos observaciones de una distribución normal univariada, entonces una muestra de arranque con reemplazo consistirá la mitad del tiempo en la muestra original, y la mitad del tiempo consistirá en uno de los valores originales, duplicado. Está claro que la varianza muestral de la muestra bootstrap será, en promedio, menor que la del original; de hecho, será la mitad del original.
La consecuencia principal es que la inferencia que está haciendo en base a la teoría normal devuelve los valores incorrectos cuando se aplica a la muestra de bootstrap. En particular, la teoría normal produce reglas de decisión anticonservadoras, porque su muestra de arranque producirá estadísticas cuyos denominadores son más pequeños de lo que se esperaría bajo la teoría normal, debido a la presencia de duplicados. Como resultado, la prueba de hipótesis de la teoría normal termina rechazando la hipótesis nula más de lo esperado.p t
fuente
Estoy totalmente de acuerdo con la respuesta de @ JWalker.
Hay otro aspecto de este problema. Eso está en su proceso de remuestreo. Espera que el coeficiente de regresión se centre alrededor de cero porque asume
X
yY
es independiente. Sin embargo, en tu remuestreo lo haceslo que crea correlación porque están muestreando
X
yY
juntos. Por ejemplo, supongamos que la primera fila del conjunto de datosd
es(x1, y1)
, en el conjunto de datos muestreadoP(Y = y1|X = x1) = 1
, mientras que siX
yY
son independientes,P(Y|X = x1)
sigue una distribución normal.Otra forma de arreglar esto es usar
el mismo código que usas para generar
d
, para que X e Y sean independientes entre sí.La misma razón explica por qué funciona con remuestreo residual (porque
X
es independiente del nuevoY
).fuente
x's
. A lo que me referí es a la correlación entreX
syY
s.El mayor problema aquí es que los resultados del modelo son espurios y, por lo tanto, altamente inestables, porque el modelo es solo un ruido adecuado. En un sentido muy literal. Y1 no es una variable dependiente debido a cómo se generaron los datos de la muestra.
Edite, en respuesta a los comentarios. Permítame intentar otra vez explicar mi pensamiento.
Con un OLS, la intención general es descubrir y cuantificar las relaciones subyacentes en los datos. Con los datos del mundo real, generalmente no los conocemos exactamente.
Pero esta es una situación de prueba artificial. Sí conocemos el mecanismo de generación de datos EXACTOS, está justo ahí en el código publicado por el OP. Es
Si expresamos eso en la forma familiar de una regresión OLS, es decir
Entonces, en mi opinión, este es un modelo expresado en FORMA lineal, pero NO es en realidad una relación / modelo lineal, porque no hay pendiente. Beta1 = 0.000000.
Cuando generamos los 1000 puntos de datos aleatorios, el diagrama de dispersión se verá como el clásico spray circular de escopeta. Podría haber alguna correlación entre X1 e Y1 en la muestra específica de 1000 puntos aleatorios que se generó, pero si es así es una casualidad aleatoria. Si el OLS encuentra una correlación, es decir, rechaza la hipótesis nula de que no hay pendiente, ya que sabemos definitivamente que realmente no hay ninguna relación entre estas dos variables, entonces el OLS ha encontrado literalmente un patrón en el Componente de error. Lo caractericé como "apropiado para el ruido" y "espurio".
Además, uno de los supuestos / requisitos estándar de un OLS es que (+/-) "el modelo de regresión lineal es" lineal en los parámetros ". Teniendo en cuenta los datos, mi opinión es que no satisfacemos esa suposición. Por lo tanto, las estadísticas subyacentes de la prueba de significancia son inexactas. Creo que la violación de la suposición de linealidad es la causa directa de los resultados no intuitivos del bootstrap.
Cuando leí este problema por primera vez, no se hundió en que el OP tenía la intención de probar bajo la [hipótesis] nula.
¿Pero ocurrirían los mismos resultados no intuitivos si el conjunto de datos se hubiera generado como
fuente