我正在尝试使用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正常工作 提前致谢
答案 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子集,它是原始子集的排列。