> 之前的推送中介绍了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)
```

## 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)
```

### 两个重要的图形绘制完毕,但问题还没解决:
- λ是多少?
- 其中哪些变量留下来了?
- 他们的系数分别是多少?
## 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")
```

```
# 使用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)
```


# 结果解读
## 1. 回归系数路径图解读

- 共纳入了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}$),平衡模型复杂度与效果。

- 曲线从左到右逐渐上升:λ 越小,惩罚越弱,模型越复杂,过拟合风险高;λ 越大,惩罚越强,变量被逐步压缩为 0,模型越简约,误差先降后升。
- λ_min:模型预测性能最优,变量数相对多;
- λ_1se:模型误差仅比最小误差高1个标准误,变量数更少,临床科研中模型易解释、泛化能力更强。
## 3. 从系数到临床意义
Lasso回归的结果解读核心是“系数分析”与“变量优先级判断”,结合医学场景转化为临床结论。
- 系数非零变量:这些是对因变量有显著影响的关键变量,系数绝对值越大,影响程度越强。
- 系数符号:正系数表示该变量与因变量呈正相关;负系数表示负相关。
- 系数为零变量:这些变量对因变量的影响极小或可被其他变量替代,可从模型中剔除。
>Lasso回归作用在于筛选自变量,最终,某一个自变量对结局的影响如何?需要采用Cox回归或者Logistics回归或者线性回归来进一步分析。
本文由[mdnice](https://mdnice.com/?platform=6)多平台发布
网友评论