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)
predlm
需要一个数据帧作为输入数据。另外,仅通过验证结果是否与预期值匹配来验证模型也不会起作用。您正在使用正常误差模拟不可约误差
以下是更新的代码:
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))
indlm
需要一个数据帧作为输入数据。另外,仅通过验证结果是否与预期值匹配来验证模型也不会起作用。您正在使用正常误差模拟不可约误差
以下是更新的代码:
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))