2

我试图让CVlm函数工作应用DAAG程序包我的数据集:适合(有 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 不同的 m 时,它可以很好地工作(例如,如上所示的 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 

我很乐意为使简历正常工作提供一些帮助 在此先感谢

4

1 回答 1

4

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

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

例如,使用housprices来自DAAGI 的数据可以重现错误:

 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 具有与原始数据集相同的行数。当然结果是不正确的,因为它不使用原始数据的排列的新数据子集。

于 2013-03-24T13:45:08.240 回答