【问题标题】:How to calculate the cross-validated R2 on a LASSO regression?如何计算 LASSO 回归的交叉验证 R2?
【发布时间】:2018-11-18 21:11:56
【问题描述】:

我正在使用此代码使用 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 时执行的交叉验证。基于此post,似乎可以使用

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 的最佳方法吗?

【问题讨论】:

    标签: r regression glmnet lasso-regression


    【解决方案1】:

    函数 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]
    

    【讨论】:

    • 非常感谢您的回复!您介意详细说明这如何与两个 lambda 一起工作吗?最终模型是否有两个不同的 lambda,分别进行优化?
    • 再次感谢您的回复。我想要做的是测量最终适合的模型的 R2。你介意解释你的代码中发生了什么吗?似乎它为每次迭代计算 R2,但仍然使用一个 lambda?你介意解释一下为什么这对获得 R2 有效吗?这本质上是具有最终被选择的 lambda 模型的 R2 吗?
    猜你喜欢
    • 2018-10-02
    • 2016-09-30
    • 2016-06-27
    • 2017-11-12
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 2020-05-30
    相关资源
    最近更新 更多