LOOCV交叉验证题

#p是多少个变量x,p=1;n是100,记录了n行数据
set.seed(1)
y=rnorm(100)
x=rnorm(100)
y=x-2x^2+rnorm(100)
plot(x,y)
##############
set.seed(1)
y=rnorm(100)
x=rnorm(100)
y=x-2
x^2+rnorm(100)

error=c() #因为循环里出现了error[i]
d=cbind(x,y) #c是竖着合并 r是横着合并
d=as.data.frame(d)
#前两步可合并为 d= data.frame(x,y)

for(i in 1:100)
{
m1=glm(y~x,data = d[-i,]) #去掉第i行的线性方程,此时一横行就是一个x+y了
pred_m1=predict(m1,newdata=d[i,])
error[i]=d[i,2]-pred_m1 #第i行第二列即y:真实值-预测值
}
sum(error^2)/dim(d)[1] #MSE LOOCV 1代表行,2代表列,即100

###################
library(boot)
ml=glm(y~x,data=d)
mlr=cv.glm(data=d,glmfit=ml,K=100) #k=n=100 #广义线性模型的交叉验证:估算K折交叉验证的预计误差
mlr$delta

ml2=glm(y~poly(x,2),data=d)
mlr2=cv.glm(data=d,glmfit=ml2,K=100)
mlr2$delta

ml3=glm(y~poly(x,3),data=d)
mlr3=cv.glm(data=d,glmfit=ml3,K=100)
mlr3$delta

ml4=glm(y~poly(x,4),data=d)
mlr4=cv.glm(data=d,glmfit=ml4,K=100)
mlr4$delta

##########这样可以找最小的MSE
error=c()
E = c()
d=data.frame(x,y)
for (j in 1:4) {
for (i in 1:100){
m1=glm(y~poly(x,j),data=d[-i,])
pred_m1=predict(m1,newdata=d[i,])
error[i]=d[i,2]-pred_m1
E[j]=sum(error^2)/dim(d)[1]
}
}
which.min(E)

你可能感兴趣的:(LOOCV交叉验证题)