¿Por qué las pruebas de hipótesis en conjuntos de datos muestreados rechazan el nulo con demasiada frecuencia?

10

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).XN(0,1)⨿YN(0,1)

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.YXY

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.Y

# 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.H0

medio paso
fuente
1
En bootstrap estándar, solo consideraría la distribución de bootstrap del coeficiente de X1, no sus valores de p asociados. Por lo tanto, no es un problema de arranque. Sin embargo, su observación es interesante y poco intuitiva.
Michael M
1
@MichaelM, eso es cierto. Pero dado que el CDF conjunto de los datos en los resamples debería converger en ny el número de bootstrap itera al CDF verdadero que generó los datos originales, tampoco esperaría que los valores p difieran.
medio pase el
Correcto. Estoy bastante seguro de que el efecto proviene de que las observaciones no son independientes (como dijiste), produciendo errores estándar demasiado optimistas. En su simulación, parece ser la única suposición violada del modelo lineal normal. Quizás incluso podamos derivar el factor de deflación de varianza correspondiente.
Michael M
2
Una cosa que está clara en el Método 1 es la violación de la suposición de error iid: cuando se vuelve a muestrear con reemplazo, ¡los residuos para cualquier valor de están perfectamente correlacionados en lugar de ser independientes! Por lo tanto, no está arrancando correctamente, eso es todo. Como demostración, después de la computación, reemplácelos pero proceda exactamente como antes. Eso maneja correctamente los duplicados (aunque produce una muestra más pequeña). Obtendrá una distribución uniforme de los valores p. xidsids <- unique(ids)
whuber
2
@whuber. Veo. Y eso explicaría por qué el remuestreo de residuos con reemplazo funciona a pesar de las observaciones repetidas: los residuos de ese modelo son una vez más independientes de X. Si desea responder a esto, me complacería aceptarlo.
medio pase el

Respuestas:

5

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

boot.reps = 1000
n.sims.run = 10
n <- 1000
b <- matrix(NA, nrow=boot.reps, ncol=n.sims.run)
p <- matrix(NA, nrow=boot.reps, ncol=n.sims.run)
for(sim_j in 1:n.sims.run){
  x <- rnorm(n)
  y <- rnorm(n)
  inc <- 1:n
  for(boot_i in 1:boot.reps){
    fit <- lm(y[inc] ~ x[inc])
    b[boot_i, sim_j] <- abs(coefficients(summary(fit))['x[inc]', 'Estimate'])
    p[boot_i, sim_j] <- coefficients(summary(fit))['x[inc]', 'Pr(>|t|)']
    inc <- sample(1:n, replace=TRUE)
  }
}
# note this is not really a type I error but whatever
type1 <- apply(p, 2, function(x) sum(x <= 0.05))/boot.reps
# correlation between b and "type I"
cor(b[1, ], type1)

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.

JWalker
fuente
Mmmmm Entonces deberíamos estar haciendo las pruebas de hipótesis con , no con el original . Eso tiene sentido y está en línea con la literatura existente. Tendré que intentar eso. H 0 : β = 0H0:β=β^H0:β=0
medio pase el
H0:β=βˆ prueba la equivalencia y requiere un enfoque de diseño de estudio diferente. se usa cuando lo importante es asegurarse de que sus diferencias observadas no sean casualidades, equivalencia cuando desea asegurarse de que su predicción sea correcta. Desafortunadamente, a menudo se ve como una talla única para todos, pero depende de los riesgos en su situación. Es típico usar en la investigación de la etapa inicial para filtrar las platijas cuando no se conoce lo suficiente como para definir una hipótesis alternativa y, cuando se sabe más, puede tener sentido cambiar para probar la exactitud de su conocimiento. H0:β=0H0:β=0
ReneBt
2

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.pt

grand_chat
fuente
Pero si este es el caso, ¿no tendríamos exactamente el mismo problema al volver a muestrear los residuos con reemplazo? Sin embargo, de hecho, ese enfoque rechaza con probabilidad nominal.
medio pase el
Además, una prueba t con n = 1000 no debería tener problemas con datos no normales.
medio pase el
0

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 Xy Yes independiente. Sin embargo, en tu remuestreo lo haces

ids = sample( 1:nrow(d), replace=TRUE )
  b = d[ ids, ]

lo que crea correlación porque están muestreando Xy Yjuntos. Por ejemplo, supongamos que la primera fila del conjunto de datos des (x1, y1), en el conjunto de datos muestreado P(Y = y1|X = x1) = 1, mientras que si Xy Yson independientes, P(Y|X = x1)sigue una distribución normal.

Otra forma de arreglar esto es usar

b = data.frame( X1 = rnorm( n = 1000 ), Y1 = rnorm( n = 1000 ) )

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 Xes independiente del nuevo Y).

Tianxia Zhou
fuente
Durante un tiempo, también pensé que las observaciones muestreadas podrían no ser independientes, pero al pensarlo mucho más, en realidad no creo que sea así: stats.stackexchange.com/questions/339237/…
half -pasar el
El problema que describo anteriormente es diferente de tu publicación. A lo que te refieres es a la independencia de x's. A lo que me referí es a la correlación entre Xsy Ys.
Tianxia Zhou
-1

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

X1 = tormenta (n = 1000), Y1 = tormenta (n = 1000)

Si expresamos eso en la forma familiar de una regresión OLS, es decir

Y1 = intercepción + Beta1 * X1 + Error
que se convierte en
Y1 = media (X1) + 0 (X1) + Error

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

X1 = rnorm (n = 1000), Y1 = X1 * .4 + rnorm (n = 1000)?

Doug Dame
fuente
44
Creo que esta respuesta es incorrecta en todos los aspectos. Los resultados no son "espurios", a menos que piense que OLS es un mal procedimiento, ni son más "inestables" de lo que se predeciría a partir de la varianza del error. es definitivamente una variable dependiente: no hay ningún requisito, en ninguna parte de la teoría, de que tenga alguna relación causal con las otras variables. De hecho, la hipótesis nula probada convencionalmente por todo el software de regresión es que no hay dependencia, precisamente como se simula aquí. Y1Y1
whuber
(-1) por las mismas razones que dio @whuber.
medio pase el
1
Respuesta a la pregunta final en su edición: sí, definitivamente. Pruébelo usted mismo con una simulación. (Pero tenga cuidado con la interpretación, ya que hay que tener en cuenta lo que la hipótesis nula es y cuál es el estado real de las cosas.)
whuber