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 conallow.new.levels=VERDADERO
. Si deseas hacer algo similar para efectos fijos (por ejemplo, sin un valor parahp
), 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 paracyl
y también uso la media dehp
, el valor predicho debería ser igual a la media dempg
en mi conjunto de datos. ¿Entiendo correctamente? Sin embargo, eso no es lo que observo. La media actual demtcars$mpg
es20.09062
, mientras que mi predicción con lo anterior llegó a20.23864
. La discrepancia podría ser una imperfección en el ajuste del modelo.