我想对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)
但我不知道是什么。 提前谢谢!
答案 0 :(得分:0)
getCurrent()
需要数据框作为输入数据。还试图通过验证结果是否与预期值匹配来验证模型将不起作用。您正在使用正常错误模拟不可减少的错误。
以下是更新后的代码:
lm
答案 1 :(得分:0)
在lm()
函数中,您的y
变量为cl
,data =
参数中未包含该向量:
cl <- D[-te,2]
lm1 <- lm(cl ~train[,1] , data=train)
根本不需要包含cl
。相反,只需在数据集x
中按名称指定y
和train
,在这种情况下名称为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作为连续数据的性能测量。