我使用标准的 lm 函数以及 rlm 和 lmrob 构建了一些“常规”和稳健的回归模型。虽然我知道有一些关于使用逐步回归的讨论,但我已经使用 stepAIC 函数来修剪我的变量集。在我使用 stepAIC 获得一组减少的变量后,我运行了一些稳健的回归。
cvTools包允许我使用交叉验证来比较各种模型的性能。
我显然想在我的数据集上运行套索回归(最好使用glmnet包)。
我的问题是是否有一个已经构建的包/功能允许我使用交叉验证来比较套索回归模型与其他模型。
如果没有,那么我最初的想法是回到第一原则并手动编码 K 折交叉验证以进行 lasso 回归。但是,我现在想知道这在理论上是否是一个好主意。每次我在手动 CV 中运行折叠时,我都会在训练集上运行 cv.glmnet。每个训练集很可能会产生不同的 lambda.min 和 lambda.1se。
我的问题是:考虑到为每个折叠选择的 lambda 将产生不同的套索结果,通过平均每个折叠的误差来确定整体 CV 误差在技术上是否合适?
这是我用来在数据集上创建留一式 CV 以评估套索回归的一些示例代码。我已经使用 lambda.1se 和 labmda.min 计算了每个折叠出现的交叉验证错误。
lassocv<-function() {
len<-length(drx$DR)
errmin<-0
err1se<-0
print(len)
for (i in 1:len) {
gmer<-data.matrix(drx[-i,])
yxer<-yx[-i]
lfit<-cv.glmnet(gmer, yxer)
newr<-data.matrix(drx[i,])
pmin<-predict(lfit,newx=newr,s=lfit$lambda.min)[[1]]
p1se<-predict(lfit,newx=newr,s=lfit$lambda.1se)[[1]]
errmin<-errmin+abs(pmin-yx[i])
err1se<-err1se+abs(p1se-yx[i])
}
print(errmin/len)
print(err1se/len)
}
但是,我得到了不同的简历结果。为我的数据集返回的两个结果是 21.94867 和 23.74074。