R ggplot2实现多因变量线性模型分面毛毛虫图绘制咨询
同自变量多因变量分面毛毛虫图实现方案
核心思路:长格式转换后按因变量分组批量拟合模型,统一提取系数后直接用ggplot分面绘制,无需单独绘图再拼接。
依赖包加载
首先加载需要用到的包,注意提取模型系数的tidy()函数来自broom包,不是tidytext,你之前的参考代码存在包名笔误:
library(ggplot2) library(dplyr) library(tidyr) library(broom)
批量拟合模型提取系数
你之前的长格式转换逻辑是正确的,搭配group_modify()即可对每个因变量分组单独运行线性模型,一次性提取所有模型的系数,不需要手动拆分数据循环建模:
# 构造测试数据集 x1 <- c(1,2,3,4,5) x2 <- c(4,5,6,1,2) x3 <- c(7,8,3,2,1) x4 <- c(3,4,5,6,7) y1 <- c(10,9,11,18,13) y2 <- c(12,20,21,19,11) y3 <- c(18,16,12,11,18) df <- data.frame(x1, x2, x3, x4, y1, y2, y3) # 批量建模提取系数 coef_df <- df %>% pivot_longer(cols = c(y1, y2, y3), names_to = "dv", values_to = "y") %>% group_by(dv) %>% # 对每个分组的因变量拟合全自变量线性模型,直接提取系数表 group_modify(~ tidy(lm(y ~ x1 + x2 + x3 + x4, data = .x))) %>% # 可选:过滤掉截距项,仅保留自变量系数 filter(term != "(Intercept)")
group_modify()会自动遍历每个因变量分组,传入的.x代表当前分组对应的子数据集,无需额外写循环拆分数据。
分面绘图
得到统一格式的系数表后,直接绘制带95%置信区间的标准毛毛虫图,通过facet_wrap()实现分面效果:
ggplot(coef_df, aes(x = estimate, y = term)) + # 绘制95%置信区间误差线 geom_errorbarh( aes(xmin = estimate - 1.96*std.error, xmax = estimate + 1.96*std.error), height = 0.2, color = "grey60", linewidth = 1 ) + # 绘制系数点 geom_point(size = 3, color = "#2166ac") + # 添加x=0参考线(系数为0的无效应基准线) geom_vline(xintercept = 0, linetype = "dashed", color = "#b2182b") + # 按因变量分面,可通过ncol/nrow调整分面排列方式 facet_wrap(~dv, ncol = 1, scales = "free_x") + # 调整标签与主题 labs( x = "回归系数估计值(95%置信区间)", y = "自变量", title = "多因变量回归系数毛毛虫图" ) + theme_bw()
常用调整选项
- 需要保留截距项展示时,删除
filter(term != "(Intercept)")代码即可 - 需要横向排列分面时,将
facet_wrap()中的ncol = 1修改为nrow = 1 - 需要标记显著性结果时,可在
coef_df中新增显著性判断列,将该列映射到geom_point()和geom_errorbarh()的color美学即可
内容的提问来源于stack exchange,提问作者Ashu
相关产品推荐
相关产品推荐

