es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for 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 opciones model y refit no existen en la función lm().

    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 clase lm 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 objeto lm() utilizando la salida de predict() como los valores ajustados. Esto puede ser tedioso, pero es una solución alternativa posible.

    Alternativamente, puedes considerar el uso de paquetes como caret o rsample que proporcionan funciones convenientes para la validación cruzada y el ajuste del modelo. Estos paquetes tienen funciones train() y predict() 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.

Comments are closed.