lm使用插入火车的结果

Ach*_*oud 3 r lm r-caret

我使用插入符R包作为一个非常方便的建模包装.虽然这是一个奇怪的用途,但在使用模型类型="lm"和交叉验证"无"时,我在从模型中提取结果时遇到一些麻烦.见下面的例子:

library(caret)
## Make data
> Xs       <- matrix(rnorm(300*20), nrow = 300, ncol = 20)
> Yvec     <- rnorm(300)
## Make traincontrol, cv of "none"
> tcontrol <- trainControl(method = "none")
## Fit lm model using train
> fit      <- train(x= Xs, y = Yvec, method = "lm", metric = "RMSE", trControl = tcontrol)
> fit$results
[1] RMSE      Rsquared  parameter
<0 rows> (or 0-length row.names)
Run Code Online (Sandbox Code Playgroud)

任何想法为什么适合$结果是空的?对于所有其他型号和CV类型,这似乎有效.例如使用2倍CV:

> tcontrol2 <- trainControl(method = "cv", number = 2)
> fit2      <- train(x= Xs, y = Yvec, method = "lm", metric = "RMSE", trControl = tcontrol2)
> fit2$results
  parameter     RMSE     Rsquared      RMSESD   RsquaredSD
1      none 1.023666 0.0008921194 0.006499062 0.0003463973
Run Code Online (Sandbox Code Playgroud)

我很欣赏这是一个人为的例子,但是这个模型和cv方法只是我测试的一个更大数字的组合(所以插入符号是理想的).

最好的亚当

Ach*_*oud 5

实际上,我想我可能有一个解决方案.如果没有重新采样,我相信您仍然可以从列车输出中获得拟合值.如果为true,这意味着单个模型的RMSE/Rsq(即没有交叉验证/重新采样)只是:

> caret::RMSE(pred = fit$finalModel$fitted.values, obs = Yvec)
[1] 0.9348365
> caret::R2(pred = fit$finalModel$fitted.values, obs = Yvec)
[1] 0.04692012
Run Code Online (Sandbox Code Playgroud)

而这个R ^ 2对应于你lm手动完成时会得到的结果:

> dat <- cbind(Yvec, Xs) %>% as.data.frame()
> lm(Yvec ~., data=dat) %>% summary

Call:
lm(formula = Yvec ~ ., data = dat)

...

...Multiple R-squared:  0.04692...
Run Code Online (Sandbox Code Playgroud)

认为这是封闭的情况,但如果其他人认为有帮助,我会留下这个,我仍然希望听到是否有人可以确认/反驳这一点.