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.

¿Cómo puedo obtener la misma salida que la función lm() después de usar la función train() de caret?

En realidad, estoy tratando de hacer algunas pruebas en mi modelo de regresión lineal con diferentes funciones como ols_vif_tol(), ols_test_normality() o durbinWatsonTest() que solo funcionan con lm(). Sin embargo, obtuve mi modelo usando la función train() del paquete caret.

fitcontrol = trainControl(method = "repeatedcv", number = floor(0.4*nrow(TrainData)), repeats = RepeatsTC, returnResamp = "all", savePredictions = "all")
BestModel = train(Formula2, data = TrainData, trControl = fitcontrol, method = "lm", metric = "RMSE")

Al final obtengo este resultado:

> BestModel
Regresión Lineal

10 muestras
 1 predictor

Sin preprocesamiento
Muestreo: Validación Cruzada (4 veces, repetido 100 veces) 
Resumen de tamaños de muestra: 7, 8, 8, 7, 7, 8, ... 
Resultados del muestreo:

RMSE      Rcuadrado   MAE<br>
  10.75823  0.8911761  9.660638

El parámetro de ajuste 'intercept' se mantuvo constante en un valor de TRUE
<code>
Lo que quiero es obtener esta salida:
</code>
> GoodModel = lm(Formula2, data = FinalData)
> GoodModel

Llamada:
lm(formula = Formula2, data = FinalData)

Coeficientes:
    (Intercept)  Evol.INDUS.PROD<br>
          4.089            3.908
<code>
Entonces, aunque utilicé `method = &quot;lm&quot;` no tengo la misma salida que me da un error cuando hago mis pruebas.
</code>
> ols<em>test</em>normality(BestModel)
Error en ols<em>test</em>normality.default(BestModel) : y debe ser numérico

<h2>> ols<em>test</em>normality(GoodModel)</h2>

<h2>       Test             Estadístico       p-value</h2>

Shapiro-Wilk              0.9042         0.1528 
Kolmogorov-Smirnov        0.1904         0.6661 
Cramer-von Mises          1.1026         0.0010 

<h2>Anderson-Darling          0.4615         0.2156</h2>

Sé que hay una función as.lm pero lo intenté y no tengo una versión que pueda usarla.

¿Alguien sabe cómo obtener la misma forma que la función lm() después de usar train o alguna manera de usar la salida de BestModel para hacer esas pruebas?

EDICIÓN

Aquí hay un caso más simple que da lugar al mismo error y donde se pueden probar diferentes pruebas.

install.packages("olsrr")
install.package("caret")
library(olsrr)
library(caret)

first = sample(1:10, 10, rep = TRUE)
second = sample(10:20, 10, rep = TRUE)
third = sample(20:30, 10, rep = TRUE)
Df = data.frame(first, second, third)
Df

<h1>Crear un modelo con lm</h1>

Model1 = lm(first ~ second + third, data = Df)
Model1
summary(Model1)
ols<em>test</em>normality(Model1)

<h1>Crear un modelo con caret::train</h1>

Fold = sample(1:nrow(Df) ,size = 0.8*nrow(Df), replace = FALSE)
TrainData = Df[Fold,]
TestData = Df[-Fold,]
fitcontrol = trainControl(method = "repeatedcv", number = 2, repeats = 10)
Model2 = train(first ~ second + third, data = TrainData, trControl = fitcontrol, method = "lm")
Model2
summary(Model2)
ols<em>test</em>normality(Model2)

Gracias

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La razón por la que no obtienes la misma salida que con lm() es porque la salida de train() es un modelo entrenado utilizando un conjunto específico de datos, mientras que la salida de lm() es el objeto de modelo real. Sin embargo, puedes extraer los coeficientes del modelo entrenado utilizando la función coef() y utilizarlos para crear un nuevo objeto de modelo utilizando lm(). Aquí hay un ejemplo utilizando tu código original:

    # Crear un modelo entrenado utilizando caret::train
    fitcontrol = trainControl( method = "repeatedcv", number = floor(0.4*nrow(TrainData)), repeats = RepeatsTC, returnResamp = "all", savePredictions = "all")
    BestModel = train(Formula2, data = TrainData, trControl = fitcontrol, method = "lm", metric = "RMSE")
    BestModel
    
    # Extraer los coeficientes del modelo entrenado
    coefvals <- coef(BestModel$finalModel)
    intercept <- coefvals[1]
    coef_indus_prod <- coefvals[2]
    
    # Crear un nuevo objeto de modelo utilizando lm()
    GoodModel <- lm(Formula2, data = FinalData)
    GoodModel$coefficients[1] <- intercept
    GoodModel$coefficients[2] <- coef_indus_prod
    GoodModel
    
    # Ahora puedes realizar pruebas utilizando el nuevo objeto de modelo
    ols_test_normality(GoodModel)
    

    Esto debería darte la misma salida que lm(), y puedes usar el nuevo objeto de modelo para realizar pruebas. Ten en cuenta que este enfoque supone que el modelo entrenado no es muy diferente del modelo lm() original.

Comments are closed.