R语言混合效应模型绘制Y轴为OR值点图问题求解
解决方案
核心需求对应实现逻辑
针对两个问题的实现思路如下:
- 坐标轴调整:
plot_model()原生支持坐标轴交换,旧版本可通过ggplot2的坐标翻转函数实现 - 变量筛选:无需手动枚举因子水平或待排除变量,可通过正则自动匹配目标变量的所有因子水平,适配任意数量的协变量
完整可复现代码
library(lme4) library(sjPlot) library(dplyr) library(ggplot2) # 数据处理 df <- sleepstudy %>% mutate( slow = ifelse(Reaction >= 300, 1, 0), Days = as.factor(Days) ) # 拟合混合效应逻辑回归 m <- glmer(slow ~ Days + (1 | Subject), data = df, family = binomial) # 自动匹配所有Days对应的固定效应项,无需手动逐个输入水平名 # sjPlot版本≥2.8.10可直接写 terms = "Days",无需grep步骤 selected_terms <- grep("^Days", names(fixef(m)), value = TRUE) # 输出目标图形 plot_model( m, terms = selected_terms, exponentiate = TRUE, # 返回OR值,而非logit变换后的系数 show.reflvl = TRUE, # 自动展示参考组(Days=0),OR固定为1 swap.axes = TRUE, # 交换坐标轴:X轴为天数,Y轴为OR值 title = "反应时慢于300ms的比值比随时间变化趋势", axis.title = c("天数", "比值比(OR)"), dot.size = 2, ci.lvl = 0.95 ) + # 可选美化:添加OR=1的无差异参考线,固定X轴天数按数值顺序排列 geom_hline(yintercept = 1, linetype = "dashed", color = "grey50") + scale_x_discrete(limits = levels(df$Days))
参数说明
- 变量自动筛选:
grep("^Days", names(fixef(m)), value = TRUE)会匹配所有以"Days"开头的固定效应系数,不管Days有多少个因子水平、模型中包含多少其他协变量,都能一键选中所有Days对应的效应,完全避免手动输入的繁琐操作。如果模型中存在Days相关的交互项不需要展示,可以调整正则规则进一步筛选。 - 坐标轴调整:
swap.axes = TRUE是sjPlot内置的坐标轴交换参数,设置后直接将分类变量(天数)放在X轴,效应值(OR)放在Y轴;如果使用的旧版本包没有这个参数,删掉该参数,在代码末尾加+ coord_flip()即可实现完全一致的效果。 - 参考组展示:
show.reflvl = TRUE会自动把因子的参考水平(Days=0)加入图中,不需要手动构造数据点,时间趋势从基线OR=1开始展示,更符合纵向研究的展示逻辑。
内容的提问来源于stack exchange,提问作者Tan Sing Chee
相关产品推荐
相关产品推荐

