如何合并队列样本的glmnet模型结果并生成累积模型与可视化?
合并多个glmnet模型结果并绘制可视化图
步骤1:完善模型拟合代码
先修正原代码的语法问题,确保LASSO模型正确拟合:
library(tidyr) library(dplyr) library(glmnet) library(ggplot2) # 统一数据名,使用你提供的SLE28sy_w20_dat3 data_long <- SLE28sy_w20_dat3 |> pivot_longer(cols = starts_with('EE'), names_to = 'EE_variant', values_to = 'Y') data_nested <- data_long |> group_by(EE_variant) |> nest(data = -EE_variant) # 拟合LASSO模型(alpha=1),修正语法闭合问题 las_glmnet <- data_nested |> rowwise() |> summarise(the_model = list(glmnet(x = data |> select(-Y) |> data.matrix(), y = data |> select(Y) |> data.matrix(), alpha = 1)))
步骤2:提取所有模型的系数与lambda信息
从每个glmnet模型中提取系数路径和对应lambda值,整理为结构化数据框:
# 提取每个模型的系数路径与lambda model_coefs <- las_glmnet |> mutate( coef_paths = list( coef(the_model) |> as.matrix() |> t() |> as.data.frame() |> mutate(lambda = the_model$lambda) ) ) |> select(EE_variant, coef_paths) |> unnest(coef_paths) # 转为长格式,适配ggplot绘图 model_coefs_long <- model_coefs |> pivot_longer(cols = -c(EE_variant, lambda), names_to = "predictor", values_to = "coefficient")
步骤3:用ggplot2绘制可视化图
提供两种实用的可视化方案:
方案1:叠加所有模型路径+均值参考线
展示每个EE变体的系数路径,同时添加均值路径作为整体趋势参考:
# 计算每个lambda和预测器下的系数均值 coef_means <- model_coefs_long |> group_by(lambda, predictor) |> summarise(mean_coef = mean(coefficient), .groups = "drop") ggplot() + # 单个模型路径(浅色,避免杂乱) geom_line(data = model_coefs_long, aes(x = log(lambda), y = coefficient, color = EE_variant), alpha = 0.3) + # 均值路径(深色粗线,突出整体趋势) geom_line(data = coef_means, aes(x = log(lambda), y = mean_coef, color = predictor), linewidth = 1) + labs(x = "Log(Lambda)", y = "系数值", title = "不同EE变体的LASSO系数路径", color = "EE变体 / 预测变量") + theme_minimal()
方案2:按预测器分面展示
聚焦每个预测变量在不同模型中的系数变化:
ggplot(model_coefs_long, aes(x = log(lambda), y = coefficient, color = EE_variant)) + geom_line(alpha = 0.6) + facet_wrap(~predictor, scales = "free_y") + labs(x = "Log(Lambda)", y = "系数值", title = "按预测变量分组的LASSO系数路径", color = "EE变体") + theme_minimal()
关键提示
- 使用
log(lambda)作为x轴是因为glmnet的lambda范围通常为对数尺度,能让系数变化趋势更清晰 - 若需要聚焦特定lambda值(如交叉验证选出的
lambda.min或lambda.1se),可在提取系数时指定s参数,例如coef(the_model, s = the_model$lambda.min) - 大样本量下,降低单个模型路径的alpha值可避免图面过于拥挤
内容的提问来源于stack exchange,提问作者Debajyoti Kabiraj
相关产品推荐
相关产品推荐

