R语言meta/forest对象如何自定义展示疫苗有效性VE等效应量
R语言meta/forest对象自定义效应量汇总实现方案(疫苗有效性VE场景)
无需修改meta、metafor包的底层效应量计算入口,直接通过包内置的transf参数传入自定义转换函数,即可实现VE(1-RR/1-OR)的自定义汇总展示,不需要额外依赖其他工具包。
常见误区说明
测试时发现transf参数不支持自定义规则,通常是因为尝试直接给escalc()的measure参数传入不存在的"1-RR"值。实际上效应量计算环节不需要自定义,只需要在模型汇总、森林图绘制环节做尺度转换即可,逻辑完全自洽,结果和直接计算VE的效应量完全一致。
metafor包实现代码
### 加载metafor包 library(metafor) ### 加载BCG疫苗数据集 data(dat.bcg) ### 第一步:按标准RR口径计算效应量(不需要自定义measure参数) dat <- escalc(measure="RR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg) ### 第二步:拟合Meta分析模型(随机/固定效应均可) res <- rma(yi, vi, data=dat, method="REML") ### 第三步:编写自定义VE转换函数 ### 注意:metafor存储的yi是对数转换后的RR,需要先取指数还原为原始RR,再计算1-RR trans_ve <- function(log_rr) { 1 - exp(log_rr) } ### 绘制自带VE汇总值的森林图 forest(res, transf = trans_ve, # 传入自定义转换函数 xlab = "疫苗有效性(VE = 1-RR)", refline = 0, # VE=0对应RR=1,即无保护效应 xlim = c(-1.5, 0.8), # 根据实际VE范围调整坐标轴区间 at = c(-1, -0.5, 0, 0.5, 0.75), # 自定义坐标轴刻度 header = c("研究", "VE [95%CI]"))
如果需要计算基于OR的VE,只需要把escalc()里的measure参数改为"OR"即可,转换函数逻辑不需要调整。
meta包实现代码
library(meta) ### 计算标准RR效应量 m_bcg <- metabin(event.e = tpos, n.e = tpos+tneg, event.c = cpos, n.c = cpos+cneg, data = dat.bcg, sm = "RR", method.tau = "REML") ### 绘制VE尺度森林图 ### 注意:meta包metabin对象存储的是原始尺度RR,不需要做指数转换 forest(m_bcg, transf = function(rr) 1 - rr, xlab = "疫苗有效性(VE = 1-RR)", refline = 0, leftlabs = "研究名称", rightlabs = "VE [95%CI]")
关键注意事项
- 转换前务必确认原效应量的存储尺度:metafor的rma类对象默认存储对数转换后的RR/OR,必须先
exp()还原再计算VE;meta包的metabin、metagen对象默认存储原始尺度的效应值,直接计算1-值即可,尺度搞错会出现完全错误的结果 - VE的置信区间方向和RR/OR相反:RR值越大对应VE值越小,转换时包会自动处理置信区间的上下限反转,不需要手动调整,只要转换函数逻辑正确即可
- 该方法仅改变效应量的展示尺度,不会改变模型的合并效应值、异质性检验、亚组分析等所有核心计算结果,统计可靠性和标准RR/OR输出完全一致
内容的提问来源于stack exchange,提问作者Nicolas
相关产品推荐
相关产品推荐

