You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在R语言中使用glmnet计算Lasso回归的R平方值

解决Lasso回归中R平方与调整R平方的计算问题

嘿,我来帮你搞定这个glmnet包Lasso回归的模型性能评估问题~先梳理下你的操作和遇到的问题:

你的现有操作流程

1. 拟合Lasso模型并绘制系数路径图

fit.lasso <- glmnet(x,y)
plot(fit.lasso,xvar="lambda",label=TRUE)

对应的系数路径图:
Lasso系数随lambda变化的路径图

2. 执行交叉验证并绘制lambda-MSE关系图

cv.lasso=cv.glmnet(x,y)
plot(cv.lasso)

对应的交叉验证MSE与lambda关系图:
交叉验证中lambda与MSE的关系图

遇到的问题

你参考了一份教程给出的R平方计算代码:

R_Squared = 1 - cv.lasso$cvm/var(y)

但这个方法无法生效,你希望能像lm()函数那样,得到R平方和调整R平方来评估模型的拟合效果。


问题根源

cv.lasso$cvm每个lambda对应的交叉验证平均MSE,而直接用它除以var(y)不符合R平方的定义——R平方衡量的是模型解释的变异占总变异的比例,需要基于模型的预测残差来计算,而非交叉验证MSE的平均值。

正确的计算方法

我们需要针对最优lambda对应的模型来计算R平方和调整R平方,步骤如下:

1. 选定最优lambda

cv.glmnet会给出两个常用的最优lambda:

  • cv.lasso$lambda.min:交叉验证MSE最小的lambda(拟合效果最好)
  • cv.lasso$lambda.1se:MSE在最小MSE加1倍标准差范围内的最大lambda(模型更简洁)

这里以lambda.min为例:

best_lambda <- cv.lasso$lambda.min

2. 计算模型的预测值

用最优lambda对应的模型对训练集做预测:

# 注意x需要是glmnet要求的矩阵格式
y_pred <- predict(cv.lasso, newx = x, s = best_lambda)

3. 计算R平方

公式和线性回归一致:

# 总平方和(总变异)
ss_total <- sum((y - mean(y))^2)
# 残差平方和(未被解释的变异)
ss_residual <- sum((y - y_pred)^2)
# R平方
r_squared <- 1 - (ss_residual / ss_total)

4. 计算调整R平方

调整R平方会修正自变量数量对R平方的影响,公式为:

# 获取模型中非零系数的数量(减去截距项)
k <- sum(coef(cv.lasso, s = best_lambda) != 0) - 1
n <- length(y)
# 调整R平方
adj_r_squared <- 1 - ((ss_residual/(n - k - 1)) / (ss_total/(n - 1)))

快捷方式:用glmnet自带功能获取R平方

glmnetpredict函数支持直接返回R平方(针对训练集):

r_squared_fast <- predict(cv.lasso, newx = x, s = best_lambda, type = "r2")

基于交叉验证的R平方(可选)

如果你想基于交叉验证的结果计算R平方(更能反映模型泛化能力),可以用交叉验证的预测残差:

# 获取交叉验证过程中的预测值
y_cv_pred <- predict(cv.lasso, newx = x, s = best_lambda, exact = TRUE, x = x, y = y)
# 计算交叉验证版R平方
ss_residual_cv <- sum((y - y_cv_pred)^2)
r_squared_cv <- 1 - (ss_residual_cv / ss_total)

内容的提问来源于stack exchange,提问作者AKD

火山引擎 最新活动