You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R的metafor包中设置森林图X轴为对数刻度并截断CI

解决方法
  • 先将OR和置信区间转换为对数尺度,因为森林图的对数刻度需要基于对数转换后的值绘制
  • 用clim参数指定置信区间的截断范围(对应对数尺度下的0.5和2)
  • 设置at参数定义X轴刻度的对数位置,配合atransf=exp将刻度标签转换回原始OR值
  • 保留原有布局和标注参数,确保图形结构不变

修改后的完整代码:

library(metafor)
library(tibble)

base_data <- tibble(
  OR  = c(0.87, 0.93, 0.93, 0.97, 1.03, 1, 1.02, 0.99),
  ci.ub = c(3.12, 3.38, 3.39, 3.57, 1.58, 1.54, 1.56, 1.51),
  ci.lb = c(0.24, 0.26, 0.26, 0.26, 0.68, 0.65, 0.67, 0.64),
  study = c("ITT", "PP", "ITT", "PP", "ITT", "PP", "ITT", "PP")
)

# 转换为对数尺度
base_data <- base_data %>%
  mutate(
    log_OR = log(OR),
    log_ci_lb = log(ci.lb),
    log_ci_ub = log(ci.ub)
  )

# 定义对数刻度的范围和刻度点
log_alim <- log(c(0.5, 2))
log_at <- log(c(0.5, 0.75, 1, 1.5, 2))

with(base_data, forest(
  log_OR, 
  ci.lb = log_ci_lb, 
  ci.ub = log_ci_ub,
  header = c("Study", "OR (95% CI)"),
  xlab = "OR (95% CI)",
  refline = log(1),  # 对数尺度下的参考线为log(1)=0
  slab = study,
  rows = c(1:2, 4:5, 7:8, 10:11),
  at = log_at,
  atransf = exp,  # 将刻度标签转换回原始OR值
  alim = log_alim,
  clim = log_alim,  # 截断超出范围的置信区间
  ilab = cbind(
    c(6.3, 6.5, 6.4, 6.6, 0.9, 0.8, 0.9, 0.8), 
    c(7.0, 7.0, 7.1, 7.1, 1.2, 1.2, 1.3, 1.3)
  )
))

par(font=2)
text(c(-0.7,-0.2), 13, c("Intervention", "Control"))

par(font=4)
text(-2.3,
     c(11.5, 8.5, 5.5, 2.5), 
     pos=4, 
     c("Model 1", "Model 2", "Model 3", "Model 4")
)

关键说明

  • 对数转换:直接用原始OR值配合atransf=exp会导致刻度逻辑冲突,先转换为对数尺度再绘图是正确路径
  • CI截断:clim参数强制将置信区间限制在alim定义的范围内,超出部分会被自动截断
  • 刻度显示:at参数设置对数尺度下的刻度位置,atransf=exp将这些位置转换为原始OR值显示,既实现对数刻度的视觉效果,又保留OR值的直观性

内容的提问来源于stack exchange,提问作者Anna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:17:15