R语言实战:Lasso回归实现及结果解读

2026-01-24  本文已影响0人  实验诊断与临床
> 之前的推送中介绍了Lasso回归分析的重要性[Lasso回归在医学研究中的应用](https://mp.weixin.qq.com/s/G2VX6a2BKBxU0Y37sys7Uw),但如何实现呢?结果如何分析? # 数据预处理 ## 1. 数据清洗与标准化 为建模奠定基础,数据质量是顺利分析的前提条件。 - 变量整理:明确因变量和自变量,对分类变量进行哑变量编码。 - 缺失值处理:连续变量可用均值、中位数插补,分类变量用众数插补;缺失率过高(如>20%)的变量直接剔除。 - 标准化:由于Lasso对变量量纲敏感,需将自变量标准化(如Z-score标准化),使各变量处于同一数量级。 - 数据拆分:将数据分为训练集与测试集。 # R语言可视化 ## 1. 数据和变量处理 以Lasso-cox回归分析为例: ``` #加载包 library(glmnet) #lasso回归专用 library(dplyr) #批量标准化 library(survival)#COX回归生存分析 #将所有数值变量标准化,并生成新的一列,以_scaled结尾 df_with_new_cols <- data %>% mutate(across(where(is.numeric), ~ scale(.), .names = "{.col}_scaled")) #批量提取变量名,方便后面复制使用 cat(paste0('"', colnames(df_with_new_cols), '"', collapse = ",")) #挑选要研究的分类变量 categorical_vars <- c("sex", "smoke", "drink", "HTN", "DM", "CAD", "Cholelithiasis", "Nephrolithiasis", "HUA") #分类变量转为因子 for (var in categorical_vars) { df_with_new_cols[[var]] <- as.factor(df_with_new_cols[[var]]) #所有的自变量 predictor_names <- c("sex", "smoke", "drink", "HTN", "DM", "CAD", "Cholelithiasis", "Nephrolithiasis", "HUA","WC_scaled","Height_scaled","Weight_scaled","WHtR_scaled", "BMI_scaled","SBP_scaled","DBP_scaled","ALT_scaled") #构建生存时间数据的特殊对象y y <- Surv(df_with_new_cols$time, df_with_new_cols$Diagnoise) x <- model.matrix(~ ., data = df_with_new_cols[, predictor_names])[, -1] ``` ## 2. 绘制交叉验证曲线 交叉验证(CV)曲线核心是以惩罚系数 λ 的对数为横轴,以交叉验证的均方误差(MSE)/ 偏差为纵轴,展示不同 λ 下模型的预测性能,同时标注最优 λ(最小误差对应的 λ)和1-SEλ(最小误差 + 1 个标准误对应的 λ,更简约的模型),是选择 LASSO 惩罚强度的核心图。一般采用10折交叉验证遍历一系列 λ 值。 ``` set.seed(123) cv_fit <- cv.glmnet(x, y, family = "cox", alpha = 1, nfolds = 10) plot(cv_fit) ``` ![交叉验证曲线](https://img.haomeiwen.com/i20783724/dcf8caacae3165d1.png) ## 3. 绘制系数路径图 系数路径图展示不同惩罚强度(λ)下,所有自变量的回归系数如何被逐步压缩至 0,从而直观呈现变量筛选的全过程。 ``` fit_full <- glmnet(x, y, family = "cox", alpha = 1) plot(fit_full, xvar = "lambda", label = TRUE) abline(v = log(optimal_lambda), col = "red", lty = 2) abline(v = log(simplified_lambda), col = "blue", lty = 2) legend(x = -6, y = 0.5, # 调整到合适位置 legend = c("lambda.min", "lambda.1se"), col = c("red", "blue"), #整体缩小 cex = 0.8, # 进一步减小文字大小 seg.len = 1.0, # 进一步减小文字大小 text.width = 1.0,lty = 2,# 控制文本显示宽度 # 调整间距 x.intersp = 0.3, # 水平间距(文本和线条间) y.intersp = 0.5, # 垂直间距(条目间) # 边框控制 bty = "n", # 去掉边框(或 "o" 保留但调整box.lwd等) box.lwd = 0.5) ``` ![LASSO系数路径图](https://img.haomeiwen.com/i20783724/2e5ba0e3ed7b5381.png) ### 两个重要的图形绘制完毕,但问题还没解决: - λ是多少? - 其中哪些变量留下来了? - 他们的系数分别是多少? ## 4. 查看λ和具体变量 ``` # lambda.min:追求最佳预测精度 optimal_lambda <- cv_fit$lambda.min # lambda.1se:追求更简洁的模型(变量更少) simplified_lambda <- cv_fit$lambda.1se cat("lambda.min:", optimal_lambda, "\n") cat("lambda.1se:", simplified_lambda, "\n") ``` ![λ具体数值](https://img.haomeiwen.com/i20783724/b6dad166cc77ef5b.png) ``` # 使用lambda.min coef_min <- coef(cv_fit, s = "lambda.min") # 使用lambda.1se coef_1se <- coef(cv_fit, s = "lambda.1se") # 获取lambda.min下选中的变量名 selected_vars_min <- rownames(coef_min)[as.vector(coef_min != 0)] # 获取lambda.1se下选中的变量名(通常更少) selected_vars_1se <- rownames(coef_min)[as.vector(coef_1se != 0)] cat("\n使用 lambda.min 选中的变量:\n") print(selected_vars_min) cat("\n使用 lambda.1se 选中的变量(更简模型):\n") print(selected_vars_1se) #还可以查看具体系数 print(coef_min) print(coef_1se) ``` ![具体留下的变量有哪些](https://img.haomeiwen.com/i20783724/4efd537767702bd3.png) ![被留下变量的系数](https://img.haomeiwen.com/i20783724/74ee2ef74299e21d.png) # 结果解读 ## 1. 回归系数路径图解读 ![系数路径图](https://img.haomeiwen.com/i20783724/f9958c45380a4fbe.png) - 共纳入了27个变量,便有27条不同颜色的线。每条线上都有变量编号。即每一条曲线代表了每一个自变量系数的变化轨迹,纵坐标是系数的值,下横坐标是log(λ),上横坐标是此时模型中非零系数的个数。 - 可以看到,随着参数log λ增大,回归系数(即纵坐标值)不断收敛,最终收敛成0。 - 图例显示的红色虚线为λ min,意思是偏差最小时的λ ,代表在该lambda取值下,模型拟合效果最高。变量数是22,相比λ-se,保留下来的变量更多。 - 蓝色虚线为λ-se,意思是最小λ右侧的1个标准误。在该λ取值下,构建模型的拟合效果也很好,同时纳入方程的个数更少(4个),模型更简单。**因此,临床上一般会选择右侧的λ1-se作为最终方程筛选标准。** ## 2. 最优$\lambda$值确定 $\lambda$的选择直接影响模型效果,常用K折交叉验证:将训练集分成K份,轮流用K-1份建模、1份验证,计算不同$\lambda$对应的预测误差,选择误差最小的$\lambda$(记为$\lambda_{\text{min}}$),或选择误差在$\lambda_{\text{min}}$1个标准差内且系数数量最少的$\lambda$(记为$\lambda_{1se}$),平衡模型复杂度与效果。 ![交叉验证图](https://img.haomeiwen.com/i20783724/efbc84be63f32608.png) - 曲线从左到右逐渐上升:λ 越小,惩罚越弱,模型越复杂,过拟合风险高;λ 越大,惩罚越强,变量被逐步压缩为 0,模型越简约,误差先降后升。 - λ_min:模型预测性能最优,变量数相对多; - λ_1se:模型误差仅比最小误差高1个标准误,变量数更少,临床科研中模型易解释、泛化能力更强。 ## 3. 从系数到临床意义 Lasso回归的结果解读核心是“系数分析”与“变量优先级判断”,结合医学场景转化为临床结论。 - 系数非零变量:这些是对因变量有显著影响的关键变量,系数绝对值越大,影响程度越强。 - 系数符号:正系数表示该变量与因变量呈正相关;负系数表示负相关。 - 系数为零变量:这些变量对因变量的影响极小或可被其他变量替代,可从模型中剔除。 >Lasso回归作用在于筛选自变量,最终,某一个自变量对结局的影响如何?需要采用Cox回归或者Logistics回归或者线性回归来进一步分析。 本文由[mdnice](https://mdnice.com/?platform=6)多平台发布
上一篇 下一篇

猜你喜欢

热点阅读