Processing math: 100%

2 votos

¿Cómo puedo predecir mejor con (g)lmer con valores faltantes?

Supongamos que estoy construyendo un modelo mixto en R, y quiero usar ese modelo para predecir nuevos datos para los cuales podría no conocer el valor de todas las características. O en algunos casos, puede que no sea tanto que no conozca el valor de todas las características, sino más bien que quiero una predicción para un valor "neutral" de esas características en algún sentido significativo. ¿Existe una forma "correcta" de hacer esto?

Aquí hay un ejemplo tonto.

install.packages("lme4")
require(lme4)
mtcars2 = mtcars
mtcars2$cyl = paste0(mtcars2$cyl, " cilindros")
# Quiero asegurarme de no tratar 'cyl' numéricamente. Esta
# probablemente no sea la mejor aproximación, pero debería funcionar.

modelo = lmer(mpg ~ (1|cyl) + hp, mtcars2)

Con mi modelo tonto ya construido, puedo usarlo para hacer una predicción sobre una nueva fila de datos.

ejemploTest = data.frame(c("4 cilindros"), c(100))
names(ejemploTest) = c("cyl", "hp")

prediccionTest = predict(modelo, ejemploTest)
print(prediccionTest)

Esto produce un resultado numérico, como se esperaba por supuesto. Pero supongamos que quisiera saber qué predice el modelo si solo conociera el valor de hp y no conociera el valor de cyl.

ejemploTest$cyl = c("Nuevo valor no visto antes")
prediccionTest = predict(modelo, ejemploTest, allow.new.levels=TRUE)
print(prediccionTest)

Puedo agregar allow.new.levels=TRUE, y esto al menos me permite obtener un número (21.66101). No estoy convencido de que sea el número correcto, pero volveremos a eso en un momento.

Me parece natural que debería poder aplicar el mismo tipo de lógica si en su lugar tuviera un valor legítimo para cyl pero hp estuviera ausente. La forma natural para mí sería poner NA en lugar del valor numérico para hp de la siguiente manera.

ejemploTest$cyl = c("4 cilindros") # restaurando el valor original
ejemploTest$hp = c(NA)
prediccionTest = predict(modelo, ejemploTest, allow.new.levels=TRUE)
print(prediccionTest)

Este enfoque no produce un número. No estoy seguro si la diferencia entre los dos ejemplos radica más en la diferencia entre efectos fijos y aleatorios o en uno siendo numérico y el otro no.

Entonces, ¿hay alguna forma directa de manejar esto en R? Creo (pero no estoy seguro) que lo que podría querer es que se impute la media en mi caso numérico de hp. Eso no parece tan simple en mi caso de cyl, ya que no puedo tomar la media de algunas cadenas. Parece que lo que allow.new.levels hace efectivamente en mi caso es ignorar la parte del modelo para esa característica por completo como si produjera un valor de 0, y simplemente calcula el intercepto del efecto fijo más 100 veces la pendiente del efecto fijo. ¿Hay formas estándar de manejar este tipo de situaciones?

0 votos

Debes ser muy claro y preciso aquí. En tu ejemplo, utilizas cyl como el factor de agrupamiento de un efecto aleatorio (también conocido como ID de sujeto). Si no conoces al sujeto o deseas predecir para nuevos sujetos, puedes utilizar la media/efecto poblacional estimado, que es lo que sucede con allow.new.levels=VERDADERO. Si deseas hacer algo similar para efectos fijos (por ejemplo, sin un valor para hp), simplemente ajustaría un modelo sin ese efecto.

0 votos

@Roland cyl es de hecho análogo a un ID de sujeto... Quería un conjunto de datos rápido y sucio que estuviera integrado en R para hacer un ejemplo reproducible para esta pregunta, así que hice un ejemplo ficticio con lo que tenía. Si te entiendo correctamente, si uso un nuevo valor para cyl y también uso la media de hp, el valor predicho debería ser igual a la media de mpg en mi conjunto de datos. ¿Entiendo correctamente? Sin embargo, eso no es lo que observo. La media actual de mtcars$mpg es 20.09062, mientras que mi predicción con lo anterior llegó a 20.23864. La discrepancia podría ser una imperfección en el ajuste del modelo.

3voto

user219012 Puntos 1

Un par de puntos:

  • Comencemos con una definición general del modelo mixto lineal, es decir, sea yi el resultado para el i-ésimo sujeto (i=1,,n), Xi la matriz de diseño para los efectos fijos β, y Zi la matriz de diseño para los efectos aleatorios bi, entonces tenemos: {yi=Xiβ+Zibi+εi,biN(0,D),εiN(0,σ2I), donde εi son los términos de error. Cuando ajustas este modelo obtienes estimaciones para los efectos fijos ˆβ. También puedes obtener estimaciones de los efectos aleatorios ˆbi que se definen como los modos de la distribución condicional: p(biyi;ˆθ)=p(yibi;ˆθ)p(bi;ˆθ)p(yi;ˆθ), donde θ=(β,vech(D),σ2) denota todos los parámetros del modelo.
  • De este modelo puedes obtener dos tipos de predicciones, es decir, predicciones poblacionales definidas como ˆypopi=Xiˆβ, y predicciones específicas por sujeto, definidas como ˆysubji=Xiˆβ+Ziˆbi.
  • Supongamos ahora que deseas calcular la predicción para un nuevo sujeto j. Si no tienes datos de resultado para este sujeto, entonces la única predicción que puedes hacer es la predicción poblacional, es decir, ˆypopj=Xjˆβ, que será el promedio para su grupo. Sin embargo, si también tienes algunos datos ynewj para este sujeto, entonces podrías estimar su efecto aleatorio ˆbj como el modo de [bjynewj;ˆθ], y luego usar esto en la ecuación anterior de la predicción específica por sujeto, es decir, ˆysubjj=Xjˆβ+Zjˆbj.

Puedes encontrar información adicional al respecto en el Capítulo 3, Sección 3.4 de mis apuntes del curso de Mediciones Repetidas.

0 votos

Si te entiendo correctamente, parece que es más importante de lo que me di cuenta que los efectos aleatorios tengan una media de 0. En mi ejemplo ilustrativo de la pregunta, hp definitivamente no tiene una media de 0, y francamente no parece estar muy normalmente distribuido en eso.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X