Validando cruzadamente el modelo lm y devolviendo una clase lm en R.
Supongamos que estoy intentando hacer una validación cruzada y tengo un conjunto de entrenamiento y un conjunto de validación. Tal vez algo como esto:
full_data = read.csv("data/my_data.csv")
in_training_data = sample(1:nrow(full_data), size=.67*nrow(full_data))
training_set = full_data[in_training_data,]
validation_set = full_data[!(1:nrow(full_data) %in% in_training_data),]
Lo que quiero hacer es estimar el ajuste con training_set
y luego pasar validation_set
a un nuevo modelo sin ajustar los datos. Algo como esto sería ideal:
initial_model = lm(y~x+z, data=training_set)
validation_model = lm(y~x+z, data=validation_set, model=initial_model, refit=FALSE)
Si este fuera el caso, podría usar todas las mismas funciones en validation_model
que en initial_model
(coef
, summary
, etc.). Lamentablemente, la documentación no tiene opciones “model” o “refit”.
Podría, por supuesto, usar predict
para estimar los nuevos valores ajustados:
new_fits = predict(initial_model, newdata = validation_set)
Y eso está bien, pero solo devuelve los valores ajustados. Con algunos movimientos de ninja en R, podría crear una función que básicamente recrea la clase lm
, pero eso parece bastante engorroso.
También podría usar offset
para fijar los parámetros del modelo, pero eso no devuelve el coeficiente de determinación (r cuadrado), los coeficientes originales ni muchos de los otros objetos contenidos en un lm
tradicional.
Entonces, ¿hay alguna manera de ajustar un modelo antiguo a un nuevo conjunto de datos y devolver una clase lm
? ¿Mi única opción es básicamente recrear la clase lm
utilizando la salida de la función predict
?
Y, para anticipar posibles respuestas, sé sobre la validación cruzada k-fold, pero eso no es lo que quiero. No quiero un algoritmo que haga la división/estimación por mí. Ya tengo la división y solo quiero alimentarla a un nuevo modelo.
davy.ai
Desafortunadamente, no hay una manera incorporada de pasar un modelo existente a
lm()
y ajustar el modelo a nuevos datos sin volver a ajustar los datos. Las opcionesmodel
yrefit
no existen en la funciónlm()
.Tu mejor opción es usar
predict()
para obtener los valores predichos para el conjunto de validación y calcular manualmente cualquier estadística relevante. Si deseas obtener un objeto de claselm
con los coeficientes y otros parámetros del modelo inicial, puedes crear una función que extraiga esos valores del modelo inicial y cree un nuevo objetolm()
utilizando la salida depredict()
como los valores ajustados. Esto puede ser tedioso, pero es una solución alternativa posible.Alternativamente, puedes considerar el uso de paquetes como
caret
orsample
que proporcionan funciones convenientes para la validación cruzada y el ajuste del modelo. Estos paquetes tienen funcionestrain()
ypredict()
que te permiten especificar los datos de entrenamiento y el modelo, y luego usar el modelo para predecir en nuevos datos sin volver a ajustar el modelo. Sin embargo, requieren un poco de configuración y aprendizaje para utilizarlos de manera efectiva.