在DAAG包中交叉验证的线性回归中要看什么值

时间:2013-12-09 15:14:20

标签: r cross-validation

我在包含151个变量的数据集上执行了以下操作,其中包含161个观察值: -

> library(DAAG)
> fit <- lm(RT..seconds.~., data=cadets)
> cv.lm(df = cadets, fit, m = 10)

得到以下结果: -

fold 1 
Observations in test set: 16 
                  7     11     12      24     33    38      52     67     72
Predicted      49.6   44.1   26.4    39.8   53.3 40.33    47.8   56.7   58.5
cvpred        575.0 -113.2  640.7 -1045.8  876.7 -5.93  2183.0 -129.7  212.6
RT..seconds.   42.0   44.0   44.0    45.0   45.0 46.00    49.0   56.0   58.0
CV residual  -533.0  157.2 -596.7  1090.8 -831.7 51.93 -2134.0  185.7 -154.6

我想要做的是将预测结果与实际实验结果进行比较,因此我可以绘制两者相互对应的图表,以显示它们的相似程度。我是正确的,我假设我会通过使用Predicted行中的值作为我的预测结果而不是cvpred来做到这一点?

我只是问这个问题,因为当我在插入符号包中执行完全相同的操作时,预测值和观察值之间的差别就越大: -

  

库(脱字符号)   ctrl&lt; - trainControl(method =“cv”,savePred = T,classProb = T)   mod&lt; - train(RT..seconds .~。,data = cadets,method =“lm”,trControl = ctrl)   MOD $ PRED

        pred obs rowIndex .parameter Resample
1      141.2  42        6       none   Fold01
2     -504.0  42        7       none   Fold01
3     1196.1  44       16       none   Fold01
4       45.0  45       27       none   Fold01
5      262.2  45       35       none   Fold01
6      570.9  52       58       none   Fold01
7     -166.3  53       61       none   Fold01
8    -1579.1  59       77       none   Fold01
9     2699.0  60       79       none   Fold01

模型不应该是这个不准确,因为我最初从1664变量开始,通过使用随机森林来减少它,因此只使用变量重要性大于1的变量,这大大减少了我的数据集从162 * 1664至162 * 151.

如果有人能向我解释,我将不胜感激,谢谢

1 个答案:

答案 0 :(得分:5)

我认为这里很少有混乱的地方,让我试着为你清理。

cv.lm的“预测”部分与crossvalidaiton的结果不对应。如果您对crossvalidaiton感兴趣,那么您需要查看“cvpred”结果 - “Predicted”对应于使用您所有数据的模型拟合的预测。

您的预测与您的cvpredictions之间存在如此大的差异的原因可能是因为您的最终模型过度拟合应该说明为什么交叉验证非常重要。

我认为您错误地使cv.lm模型适合您。我从来没有使用过该软件包,但我认为您希望传递类似cv.lm(df = cadets, RT..seconds.~., m = 10)而不是fit对象的内容。我不确定为什么你在上面的例子中看到cvpred和Predicted选项之间存在如此大的差异,但是这些结果告诉我,传入模型将导致使用适合每个CV的所有数据的模型折叠:

library(DAAG)
fit <- lm(Sepal.Length ~ ., data=iris)
mod1 <- cv.lm(df=iris,fit,m=10)
mod2 <- cv.lm(df=iris,Sepal.Length ~ .,m=10)
> sqrt(mean((mod1$cvpred - mod1$Sepal.Length)^2))
[1] 0.318
> sqrt(mean((mod2$cvpred - mod2$Sepal.Length)^2))
[1] 5.94
> sqrt(mean((mod1$cvpred - mod1$Predicted)^2))
[1] 0.0311
> sqrt(mean((mod2$cvpred - mod2$Predicted)^2))
[1] 5.94

caret结果之间存在差异的原因是因为您正在查看“预测”部分。 “cvpred”应该与插入符号紧密排列(尽管确保在你的cv结果上做出索引),如果你想用“插入符号”排列“预测”结果,你需要使用类似predict(mod,cadets)的内容来预测