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

R 使用线性回归进行五次交叉验证,r,R,我想对一阶回归模型进行五重交叉验证 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

我想对一阶回归模型进行五重交叉验证

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)
所以我明白我必须在网上做些改变

    pred<-predict(lm1,test)

pred
lm
需要一个数据帧作为输入数据。另外,仅通过验证结果是否与预期值匹配来验证模型也不会起作用。您正在使用正常误差模拟不可约误差

以下是更新的代码:

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 <- data.frame(D[-te,1:2])
   test <-   data.frame(D[te,1:2])
   lm1 <- lm(y~x , data=train)
   pred <- predict(lm1,test)
   t<- c(t,   sum(abs(D[te,2] - pred))    /dim(test)[1])
}

re<-c(re,mean(t))

ind
lm
需要一个数据帧作为输入数据。另外,仅通过验证结果是否与预期值匹配来验证模型也不会起作用。您正在使用正常误差模拟不可约误差

以下是更新的代码:

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 <- data.frame(D[-te,1:2])
   test <-   data.frame(D[te,1:2])
   lm1 <- lm(y~x , data=train)
   pred <- predict(lm1,test)
   t<- c(t,   sum(abs(D[te,2] - pred))    /dim(test)[1])
}

re<-c(re,mean(t))
ind在
lm()
函数中,您的
y
变量是
cl
,一个未包含在
数据=
参数中的向量:

cl <- D[-te,2]
lm1 <- lm(cl ~train[,1] , data=train)
因此,您的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]
}
您的
re
对象最终成为
0
,因为您的模型无法正确预测任何数字。我建议使用RMSE作为连续数据的性能度量。

lm()
函数中,您的
y
变量是
cl
,一个未包含在
数据=
参数中的向量:

cl <- D[-te,2]
lm1 <- lm(cl ~train[,1] , data=train)
因此,您的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]
}
您的
re
对象最终成为
0
,因为您的模型无法正确预测任何数字。我建议使用RMSE作为连续数据的性能度量

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