使用线性回归进行五重交叉验证

时间:2017-03-24 22:45:20

标签: r

我想对1度回归模型进行五重交叉验证

lm(y ~ poly(x, degree=1), data).

我使用以下代码

生成了100个观察结果
set.seed(1)
GenData <- function(n){
  x <- seq(-2,2,length.out=n)
  y <- -4 - 3*x + 1.5*x^2 + 2*x^3 + rnorm(n,0,0.5)
  return(cbind(x,y))
}
GenData(100)
D<-GenData(100)

我的目标代码是

ind<-sample(1:100)
re<-NULL
k<-20
teams<- 5
t<-NULL
for (i in 1:teams) {
  te<- ind[ ((i-1)*k+1):(i*k)]
  train <- D[-te,1:2]
  test <-   D[te,1:2]
  cl <- D[-te,2]
  lm1 <- lm(cl ~train[,1] , data=train)
  pred <- predict(lm1,test)
  t<- c(t,   sum(D[te,2] == pred)    /dim(test)[1])
}
re<-c(re,mean(t))

我将数据分成训练和测试。随着训练数据我运行回归,目的是进行预测并与我的测试数据进行比较。但是我有以下错误

"Error in predict(mult, test)$class : 
 $ operator is invalid for atomic vectors
In addition: Warning message:
'newdata' had 20 rows but variables found have 80 rows "

所以我明白我必须在线上改变一些东西

    pred<-predict(lm1,test)

但我不知道是什么。 提前谢谢!

2 个答案:

答案 0 :(得分:0)

getCurrent()需要数据框作为输入数据。还试图通过验证结果是否与预期值匹配来验证模型将不起作用。您正在使用正常错误模拟不可减少的错误。

以下是更新后的代码:

lm

答案 1 :(得分:0)

lm()函数中,您的y变量为cldata =参数中未包含该向量:

cl <- D[-te,2]
lm1 <- lm(cl ~train[,1] , data=train)

根本不需要包含cl。相反,只需在数据集x中按名称指定ytrain,在这种情况下名称为x和y:

names(train)
[1] "x" "y" 

所以你的for循环看起来像:

for (i in 1:teams) {
  te<- ind[ ((i-1)*k+1):(i*k)]
  train <- D[-te,1:2]
  test <-   D[te,1:2]
  lm1 <- lm(y ~x , data=train)
  pred <- predict(lm1,test)
  t[i]<- sum(D[te,2] == pred)/dim(test)[1]
}

另请注意,我添加了for循环索引i,以便可以将值添加到对象中。最后,我必须使D对象成为数据帧才能使代码正常工作:

D<-as.data.frame(GenData(100))

您的re对象最终为0,因为您的模型无法正确预测任何数字。我建议使用RMSE作为连续数据的性能测量。