如何计算R2R2套索 (glmnet)

机器算法验证 r 多重回归 套索 r平方 网络
2022-03-23 19:35:42

我很困惑如何计算 glmnet 拟合的 r 平方(LASSO、elastic-net 等)。我见过的一种方法是通过对应于 lambdas 之一的 cvm:

cvfit2 <- glmnet::cv.glmnet(datam, fundm,alpha=1,nfolds=10)
cf<-coef(cvfit2, s = "lambda.1se")
i<-which(cvfit2$lambda == cvfit2$lambda.1se)
e<-cvfit2$cvm[i]
r2<-1-e/var(fundm)
r2
#[1]  0.4571688

通过计算残差方差的经典方法:

datam2<-as.matrix(datam)
cc2<-as.matrix(cf[-1,]) #removing the intercept row
predict<-datam2 %*% cc2
err<-predict - fundm
View(err)
r2b<-1-var(err)/var(fundm)
r2b
#[1] 0.6100457

差异很大,我不确定第一种计算的方法是否正确。R2

我的问题

  1. 计算r平方的正确方法是什么?

  2. glmnet 对象具有组件 dev.ratio 和 nulldev。来自 glmnet 文档:

    “解释的(空)偏差分数(对于“elnet”,这是 R 平方)。”

我们是否应该将 dev.ratio 用于计算?如果是,如何为给定的 lambda 索引提取它?dev.ratio 数组有 100 个值,但只有 88 个值。R2cvfit2$lambda

我真的很困惑,非常感谢您的反馈。

2个回答

我在用着

r2 <- fit$glmnet.fit$dev.ratio[which(fitnet$glmnet.fit$lambda == fitnet$lambda.min)]

或者如果您选择了 lambda.1se

r2 <- fit$glmnet.fit$dev.ratio[which(fitnet$glmnet.fit$lambda == fitnet$lambda.1se)] 

如果您使用传统回归 lm() 和 summary()$r.squared 进行交叉检查,如果权重接近弹性网络,它将匹配结果。

我想我知道为什么这两种计算会产生不同的答案。来自对象的cvm变量cvm.glmnet是一个交叉验证的错误。它是根据验证折叠中的残差计算的。predict()另一方面,该功能没有交叉验证。它是根据整个数据集的预测残差计算得出的。