如何使用modelplot绘制多数据集LMM与GLM系数对比分面森林图
解决方法
核心思路是拆分数据集和模型类型两个维度,先统一提取所有模型的系数数据再自定义绘图,比直接传入大模型列表给modelplot的运行速度快很多,完整实现代码如下:
library(tidyverse) library(lme4) library(modelsummary) # ========== 你已有的数据和模型拟合代码 ========== data_list <- list() for (i in 1:30){ data_list[[i]] <- tibble::as_tibble(mtcars) } compute_model_lmm <- function(data){ lmer("mpg ~ hp + disp + drat + (1|cyl)", data = data) } compute_model_glm <- function(data){ glm("mpg ~ hp + disp + drat + cyl", data = data) } result_list_lmm <- lapply(data_list, compute_model_lmm) result_list_glm <- lapply(data_list, compute_model_glm) # ========== 新增的绘图适配代码 ========== # 1. 给两类模型添加标识名称,格式为「数据集ID_模型类型」 names(result_list_lmm) <- paste0("数据集", 1:30, "_线性混合模型") names(result_list_glm) <- paste0("数据集", 1:30, "_广义线性模型") # 2. 合并所有模型为一个列表 all_models <- c(result_list_lmm, result_list_glm) # 3. 提取所有模型的系数+置信区间数据(不直接绘图,性能更高) plot_data <- modelplot(all_models, output = "dataframe") # 4. 拆分模型名称,得到独立的数据集列和模型类型列 plot_data <- plot_data %>% separate(model, into = c("dataset", "model_type"), sep = "_(?=[^_]+$)") # 5. 自定义绘图实现需求 ggplot(plot_data, aes( x = estimate, y = term, color = model_type, xmin = conf.low, xmax = conf.high )) + geom_pointrange(position = position_dodge(width = 0.5)) + # 同变量的两个模型系数错开避免重叠 facet_wrap(~dataset) + # 按数据集分面 labs(x = "系数估计值", y = "变量名", color = "模型类型") + theme_bw()
如果希望保留modelplot的默认样式,也可以直接在modelplot返回的ggplot对象基础上修改分面逻辑,但自定义绘图的灵活度更高,也更容易调整样式适配你的需求。
内容的提问来源于stack exchange,提问作者Giulio Centorame
相关产品推荐
相关产品推荐

