¿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 = "lm"` 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
davy.ai
La razón por la que no obtienes la misma salida que con
lm()
es porque la salida detrain()
es un modelo entrenado utilizando un conjunto específico de datos, mientras que la salida delm()
es el objeto de modelo real. Sin embargo, puedes extraer los coeficientes del modelo entrenado utilizando la funcióncoef()
y utilizarlos para crear un nuevo objeto de modelo utilizandolm()
. Aquí hay un ejemplo utilizando tu código original: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 modelolm()
original.