很难说没有可重复的例子,但我认为你没有写出正确的公式。这应该适合你
CrossVal<-CVlm(df=fit,m=3,
form.lm= formula(X1 ~ X2 + X3 + X4 + X5 + X6))
例如,使用housprices
来自DAAG
I 的数据可以重现错误:
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,
发生错误是因为我们尝试将 df 的 9 行设置为 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 具有与原始数据集相同的行数。当然结果是不正确的,因为它不使用原始数据的排列的新数据子集。