r - 如何计算 LASSO 回归的交叉验证 R2?
问题描述
我正在使用此代码来拟合使用 LASSO 回归的模型。
library(glmnet)
IV1 <- data.frame(IV1 = rnorm(100))
IV2 <- data.frame(IV2 = rnorm(100))
IV3 <- data.frame(IV3 = rnorm(100))
IV4 <- data.frame(IV4 = rnorm(100))
IV5 <- data.frame(IV5 = rnorm(100))
DV <- data.frame(DV = rnorm(100))
data<-data.frame(IV1,IV2,IV3,IV4,IV5,DV)
x <-model.matrix(DV~.-IV5 , data)[,-1]
y <- data$DV
AB<-glmnet(x=x, y=y, alpha=1)
plot(AB,xvar="lambda")
lambdas = NULL
for (i in 1:100)
{
fit <- cv.glmnet(x,y)
errors = data.frame(fit$lambda,fit$cvm)
lambdas <- rbind(lambdas,errors)
}
lambdas <- aggregate(lambdas[, 2], list(lambdas$fit.lambda), mean)
bestindex = which(lambdas[2]==min(lambdas[2]))
bestlambda = lambdas[bestindex,1]
fit <- glmnet(x,y,lambda=bestlambda)
我想使用训练数据计算某种 R2。我假设一种方法是使用我在选择 lambda 时执行的交叉验证。根据这篇文章,这似乎可以使用
r2<-max(1-fit$cvm/var(y))
但是,当我运行它时,我收到此错误:
Warning message:
In max(1 - fit$cvm/var(y)) :
no non-missing arguments to max; returning -Inf
谁能指出我正确的方向?这是根据训练数据计算 R2 的最佳方法吗?
解决方案
函数 glmnet 不返回 cvm 作为 fit 的结果
?glmnet
你想要做的是使用 cv.glmnet
?cv.glmnet
以下作品(请注意,您必须指定超过 1 个 lambda 或让它自己弄清楚)
fit <- cv.glmnet(x,y,lambda=lambdas[,1])
r2<-max(1-fit$cvm/var(y))
我不确定我是否理解您要执行的操作。也许这样做?
for (i in 1:100)
{
fit <- cv.glmnet(x,y)
errors = data.frame(fit$lambda,fit$cvm)
lambdas <- rbind(lambdas,errors)
r2[i]<-max(1-fit$cvm/var(y))
}
lambdas <- aggregate(lambdas[, 2], list(lambdas$fit.lambda), mean)
bestindex = which(lambdas[2]==min(lambdas[2]))
bestlambda = lambdas[bestindex,1]
r2[bestindex]
推荐阅读
- arrays - 如何获得两个字符串数组的相对补码?
- c - C, Fork(), 取 CL 参数并执行 CHDIR
- php - 允许 PHP 脚本访问文件夹中的 PDF - 但禁止直接引用 URL
- python - 无法用科学计数法打印出 p 值
- applescript - 曾经工作——在 Safari 中使用 AppleScript 自动截屏
- php - 在 vuejs 中操作数据并将其发布到输入字段中
- python - Genshi:复杂表达式中的大括号导致 ParseError
- java - Jackson YAML - 将 null 序列化为空值
- linux - 如何通过使用 grep 和 find 命令替换字符串来更新文件的内容
- html - Laravel website with boostrap4 : FOUC on pages using container-fluid