线性模型子集选择拟合优度与k折交叉验证

时间:2018-01-15 15:14:30

标签: subset cross-validation

我正在学习'统计学习简介'来自James等(2015)。在实验部分中,使用k折交叉验证方法计算不同子集的拟合优度的脚本。

当我尝试绘制误差系数时,我得到错误:

Error in UseMethod("predict") : no applicable method for 'predict' applied to an object of class "regsubsets"

这个剧本让我不知道自己做错了什么。任何人都可以帮我解释一下吗?

library(leaps)
library(ISLR)

k=10
set.seed(1)
folds=sample(1:k,nrow(Hitters),replace=TRUE)
cv.errors=matrix(NA,k,19, dimnames=list(NULL, paste(1:19)))

for(j in 1:k){
  best.fit=regsubsets(Salary~.,data=Hitters[folds!=j,],nvmax=19)
  for(i in 1:19){
    pred=predict(best.fit,Hitters[folds==j,],id=i)
    cv.errors[j,i]=mean( (Hitters$Salary[folds==j]-pred)^2)
    }
  }

mean.cv.errors=apply(cv.errors,2,mean)
mean.cv.errors

par(mfrow=c(1,1))
plot(mean.cv.errors,type='b')

reg.best=regsubsets(Salary~.,data=Hitters, nvmax=19)
coef(reg.best,11)

1 个答案:

答案 0 :(得分:1)

我也遇到了这个问题。希望你找到答案。如果没有,这就是答案。

我确信您已经创建了以下功能。

predict.regsubsets <- function(object, newdata, id,...) {
  form <- as.formula(object$call[[2]])
  mat <- model.matrix(form, newdata)
  coefi <- coef(object, id = id)
  xvars <- names(coefi)
  mat[,xvars]%*%coefi
}

现在您必须将pred=predict(best.fit,Hitters[folds==j,],id=i)更改为pred <- predict.regsubsets(best.fit, hitters[folds == j, ], id = i)

希望它有所帮助。