如何为混合模型绘制森林图并实现OR值降序排列
混合模型森林图按OR降序排列实现方案
你代码里存在一个小问题:拟合的模型对象命名为Model,调用plot_summs时传入的是小写model,会导致调用报错,先修正命名一致性问题。
jtools包的plot_summs()函数原生支持自定义系数排序,不需要额外重写绘图逻辑,按以下步骤操作即可实现OR值降序排列:
- 注意前提:
lme拟合的线性混合模型默认输出连续结局的回归系数,只有当你拟合的是广义线性混合模型(用glmer/逻辑回归连接函数)时,指数化得到的OR值才有实际解释意义,线性模型直接按原始回归系数排序即可。 - 第一步:提取模型的系数值,计算对应OR(需要展示OR则加指数转换),过滤掉通常不展示的截距项
- 第二步:按OR值降序生成系数排序索引,传入
plot_summs的coef_order参数 - 第三步:如果要展示OR值,添加
exp = TRUE参数自动完成系数指数转换
可直接运行的代码示例
# 加载依赖包 library(nlme) library(jtools) # 修正后的模型拟合代码(统一对象命名) Model <- lme(fixed = score ~ Age + Sex + yearsofeducation + walkspeed, random = ~1|ID, data = DB, na.action = na.omit, method = "ML") # 提取系数并按OR降序排序 coef_table <- summary(Model)$tTable # 计算OR值,去掉截距项 or_values <- exp(coef_table[, "Value"]) or_values <- or_values[names(or_values) != "(Intercept)"] # 生成降序排列的索引 sort_index <- order(or_values, decreasing = TRUE) # 绘制排序后的森林图 plot_summs(Model, exp = TRUE, # 线性模型展示回归系数请删除此行 coef_order = sort_index, omit.coefs = "(Intercept)", # 不展示截距 legend.title = "模型")
如果需要更高的绘图自定义自由度,可以提取系数表后用ggplot2手动绘制,排序逻辑完全可控:
library(ggplot2) library(dplyr) # 提取带95%置信区间的系数结果 plot_df <- summ(Model, exp = TRUE, confint = TRUE) |> as.data.frame() |> tibble::rownames_to_column("variable") |> filter(variable != "(Intercept)") |> # 按OR值降序排列,将变量转为因子固定y轴顺序 arrange(desc(est)) |> mutate(variable = factor(variable, levels = rev(variable))) # 手动绘制森林图 ggplot(plot_df, aes(x = est, y = variable)) + geom_vline(xintercept = 1, linetype = 2, color = "grey50") + # OR=1参考线,线性模型改为xintercept=0 geom_errorbarh(aes(xmin = `2.5%`, xmax = `97.5%`), height = 0.2, linewidth = 1) + geom_point(shape = 18, size = 4, color = "#2c3e50") + labs(x = "OR值 (95% 置信区间)", y = "协变量") + theme_bw(base_size = 12)
提示:如果是线性混合模型(结局为连续变量score),删除所有代码里的
exp = TRUE参数,排序时直接用原始系数coef_table[, "Value"]替换or_values即可,不需要做指数转换。
内容的提问来源于stack exchange,提问作者Sari Katish
相关产品推荐
相关产品推荐

