Meta分析:meta与metafor包原始均值变化分析的结果差异问询
问题
我拟开展一项前后测均值变化的Meta分析,发现metafor包的rma()函数与meta包的metamean()函数输出结果存在差异。
首先,由于缺失前后测相关系数,我假设r=0.5,使用escalc()计算原始均值变化:
data$r <- 0.5 es <- escalc( measure = "MC", m1i = M_pre, sd1i = SD_pre, m2i = M_post, sd2i = SD_post, ni = n, ri = r, data = data )
得到示例数据:
structure(list(M_pre = c(0.551, 0.6, 1.32, 1.293, 1.055357, 1.7125, 0.983, 1.1, 0.581), SD_pre = c(0.261, 0.274, 0.07, 0.462, 0.4004462, 0.1875, 0.273, 0.316, 0.17475), M_post = c(0.92, 1, 1.13, 0.975, 1.067857, 1.125, 0.813, 1.111, 0.376), SD_post = c(0.352, 0.334, 0.06, 0.409, 0.3856812, 0.243, 0.488, 0.344, 0.16325), n = c(7, 7, 39, 14, 56, 8, 6, 9, 11), r = c(0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5), yi = c(-0.369, -0.4, 0.19, 0.318, -0.0125, 0.5875, 0.17, -0.011, 0.205), vi = c(0.0143075714, 0.013588, 0.0001102564, 0.0136976429, 0.0027618317, 0.0060803438, 0.0299081667, 0.0121653333, 0.0026054716)), class = "data.frame", row.names = c(NA, -9L))
随后我使用以下代码调用两个函数,确保均采用REML随机效应模型、逆方差加权及标准正态分布计算置信区间:
meta <- rma(yi, vi, data = es, method = "REML") meta <- metamean(n = n, mean = yi, sd = sqrt(vi), # meta uses sd not variance data = es, fixed = FALSE, method.tau = "REML")
但结果显示,不仅合并效应量不同,单个研究的置信区间及异质性指标也存在差异。
rma()输出结果:
Random-Effects Model (k = 9; tau^2 estimator: REML) logLik deviance AIC BIC AICc -2.1154 4.2307 8.2307 8.3896 10.6307 tau^2 (estimated amount of total heterogeneity): 0.0885 (SE = 0.0491) tau (square root of estimated tau^2 value): 0.2975 I^2 (total heterogeneity / total variability): 96.22% H^2 (total variability / sampling variability): 26.48 Test for Heterogeneity: Q(df = 8) = 92.0790, p-val < .0001 Model Results: estimate se zval pval ci.lb ci.ub 0.0809 0.1045 0.7737 0.4391 -0.1240 0.2858
metamean()输出结果:
mean 95%-CI %W(random) 1 -0.3690 [-0.4576; -0.2804] 11.0 2 -0.4000 [-0.4864; -0.3136] 11.0 3 0.1900 [ 0.1867; 0.1933] 11.3 4 0.3180 [ 0.2567; 0.3793] 11.2 5 -0.0125 [-0.0263; 0.0013] 11.3 6 0.5875 [ 0.5335; 0.6415] 11.2 7 0.1700 [ 0.0316; 0.3084] 10.7 8 -0.0110 [-0.0831; 0.0611] 11.1 9 0.2050 [ 0.1748; 0.2352] 11.2 Number of studies: k = 9 Number of observations: o = 157 mean 95%-CI Random effects model 0.0763 [-0.1300; 0.2825] Quantifying heterogeneity: tau^2 = 0.0983 [0.0441; 0.3649]; tau = 0.3135 [0.2100; 0.6041] I^2 = 99.4% [99.3%; 99.5%]; H = 13.11 [11.82; 14.54] Test for Heterogeneity: Q d.f. p-value 1374.87 8 < 0.0001 Details on meta-analytical method: - Inverse variance method - Restricted maximum-likelihood estimator for tau^2 - Q-Profile method for confidence interval of tau^2 and tau - Untransformed (raw) means
请问差异产生的原因是什么?如何调整以消除差异?是否有其他解决方案?哪种结果更准确?我更倾向使用meta包,因其森林图更易调整。
解答
差异产生的原因
- 单个研究置信区间计算逻辑不同
metafor::rma()默认基于效应量的标准误(sqrt(vi))和正态分布计算置信区间;而meta::metamean()默认用t分布(基于样本量计算自由度),小样本研究的置信区间会更宽,这直接导致两者单研究区间差异。 - 异质性Q统计量计算逻辑错误匹配
rma()的Q统计量基于效应量的抽样方差vi计算;但metamean()是为单组均值Meta分析设计的,它错误地将输入的yi当作原始组均值,用(yi - ybar)^2 / (sd^2/n)的逻辑计算Q值,导致Q值被极度放大,进而影响I^2和tau^2的估计。 - tau²的REML估计细节差异
两个包的REML迭代算法、收敛标准略有不同,再加上Q统计量的偏差,最终导致tau²估计值出现差异。
消除差异的调整方法
若要让meta包结果与rma()对齐,需用metacont()替代metamean()(匹配配对设计的均值差逻辑),并调整参数:
meta_meta <- metacont( n.e = n, mean.e = yi, sd.e = sqrt(vi), n.c = rep(1, nrow(es)), mean.c = rep(0, nrow(es)), sd.c = rep(0, nrow(es)), data = es, fixed = FALSE, method.tau = "REML", method.ci = "normal", sm = "MD" )
该设置通过模拟配对设计的对照(对照组均值为0),强制使用正态分布计算置信区间,同时让Q统计量基于效应量抽样方差计算,最终结果会与rma()基本一致。
其他解决方案
- 自定义
metafor森林图:metafor的forest()函数可通过addpoly()、text()等函数自定义样式,灵活性更高。 - 统一效应量输入:始终基于
escalc()得到的yi和vi进行分析,避免包内置的效应量转换逻辑干扰。
结果准确性对比
metafor::rma()的结果更准确:
你的分析对象是前后测差值的均值变化,escalc(measure="MC")已正确计算配对设计的均值差及其抽样方差,rma()直接基于这些正确的效应量建模,逻辑完全匹配;而metamean()是为单组均值分析设计的,强行输入差值会触发错误计算逻辑,不符合你的研究设计。
若偏好meta包的森林图,建议用上述metacont()的调整方法,确保建模逻辑正确后再生成图形。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

