使用R中的DAAG包进行交叉验证

时间:2013-03-24 13:00:58

标签: r

我正在尝试使用CVlm函数来应用DAAG包 我的数据集:fit(有27个条目(行)和6个变量 我在R:

中使用以下表达式
CrossVal<-CVlm(df=fit,m=3,
form.lm=formula(fit$X1~fit$X2 + fit$X3 + fit$X4 + fit$X5 + fit$X6))

当使用m=1时,它的效果与1不同(例如3,如上所示),我收到错误消息:

Error in `[<-.data.frame`(`*tmp*`, rows.out, "cvpred", value = c(228.541323416399,  : 
  replacement has 27 rows, data has 9
In addition: Advarselsbesked:
'newdata' had 9 rows but variable(s) found have 27 rows 

我很乐意帮助让cv正常工作 提前致谢

1 个答案:

答案 0 :(得分:4)

很难说没有可重复的例子,但我认为你没有写出正确的公式。这应该适合你

 CrossVal<-CVlm(df=fit,m=3,
                form.lm= formula(X1 ~ X2 + X3 + X4 + X5 + X6))

例如,使用housprices中的DAAG数据,我可以重现错误:

 CVlm(df = houseprices, form.lm =
        formula(houseprices$sale.price ~ houseprices$area), m=2)
Error in `[<-.data.frame`(`*tmp*`, rows.out, "cvpred", value = c(201.067581902091,  : 
  replacement has 15 rows, data has 7

但这很好用:

CVlm(df = houseprices, form.lm = formula(sale.price ~ area), m=2)
Analysis of Variance Table

Response: sale.price
          Df Sum Sq Mean Sq F value Pr(>F)  
area       1  18566   18566       8  0.014 *

编辑为什么m = 1有效,而不是m不同的1:

这里是发生错误的CVlm代码的一部分:

subs.lm <- lm(form, data = df[rows.in, ])
df[rows.out, "cvpred"] <- predict(subs.lm, newdata = df[rows.out, 

发生错误是因为我们尝试设置9行df,包含27行。 ])

Error in `[<-.data.frame`(`*tmp*`, rows.out, "cvpred", value = c(228.541323416399,  : 
  replacement has 27 rows, data has 9

确实predict适用于效果方面,它不使用newdata对象但使用原始data.frame,因为您使用$给出公式,这就是它打印在警告中:

In addition: Advarselsbesked:
'newdata' had 9 rows but variable(s) found have 27 rows 

m = 1它起作用,因为newdata具有与原始数据集相同的行数。当然结果不正确,因为它不使用newdata子集,它是原始子集的排列。