我正在做一个多层次的荟萃分析。许多研究有几个亚组。当我绘制森林图时,研究是以子群的形式呈现的。其中有60项,然而,我想根据研究规划研究,然后是25项研究,这将更合适。有人知道如何绘制这个森林图吗?
我是这样做的:
full.model <- rma.mv(yi = yi,
V = vi,
slab = Author,
data = df,
random = ~ 1 | Author/Study,
test = "t",
method = "REML")
forest(full.model)
我不清楚您是想聚合到Author
级别还是Study
级别。如果特定研究有多行数据,那么模型并不是真正完整的,你可能需要为研究中的估计水平添加另一个随机截距。从本质上讲,最低随机效应在输出中的nlvls
值应该与估计值(k
(一样多。
让我们首先处理这样一种情况,即我们有一个多层次结构,包括两个层次、研究和研究中的多个估计(出于一些技术原因,有些人可能会称之为三层次模型,但我们不要深入讨论(。我将使用一个完全可复制的例子进行说明,使用dat.konstantopoulos2011
数据集,其中我们有地区和地区内的学校。我们适合您所拥有的类型的多级模型:
library(metafor)
dat <- dat.konstantopoulos2011
res <- rma.mv(yi, vi, random = ~ 1 | district/school, data=dat)
res
我们可以使用aggregate()
函数将估计值聚合到地区级别,指定模型估计值的边际var cov矩阵,以说明它们的非独立性(注意,这使用了仅适用于escalc
对象的aggregate.escalc()
,因此如果不是,则需要将数据集转换为一个数据集-有关详细信息,请参阅help(aggregate.escalc)
(:
agg <- aggregate(dat, cluster=dat$district, V=vcov(res, type="obs"))
agg
你会发现,如果你根据汇总数据将等效应模型拟合到这些估计中,结果与你从多水平模型中获得的结果相同(我们使用等效应模型,因为多水平模型所解释的异质性已经封装在vcov(res, type="obs")
中(:
rma(yi, vi, method="EE", data=agg)
因此,我们现在可以在森林图中使用这些聚合值:
with(agg, forest(yi, vi, slab=district))
根据您的描述,我的猜测是,您实际上有一个额外的级别,应该包括在模型中,并且您希望聚合到中间级别。这有点复杂,因为aggregate()
并不适用于此。只是为了说明的目的,假设我们使用year
作为另一个(更高(级别,我会对数据进行一些处理,使所有三个方差分量都为非零(同样,只是为了说明目的(:
dat$yi[dat$year == 1976] <- dat$yi[dat$year == 1976] + 0.8
res <- rma.mv(yi, vi, random = ~ 1 | year/district/school, data=dat)
res
现在,我们可以使用多元模型来代替aggregate()
,包括中间水平作为因子,并再次使用vcov(res, type="obs")
作为var cov矩阵:
agg <- rma.mv(yi, V=vcov(res, type="obs"), mods = ~ 0 + factor(district), data=dat)
agg
现在这个模型的模型系数是聚合值,模型系数的var cov矩阵是这些聚合值的var cow矩阵:
coef(agg)
vcov(agg)
它们并不都是独立的(因为我们还没有聚合到最高级别(,所以如果我们想检查我们是否可以获得与多级模型相同的结果,我们必须考虑这种依赖性:
rma.mv(coef(agg), V=vcov(agg), method="EE")
同样,结果完全相同。因此,现在我们使用这些系数和vcov(agg)
的对角线作为它们在森林图中的采样方差:
forest(coef(agg), diag(vcov(agg)), slab=names(coef(agg)))
林图无法指示这些值中仍然存在的依赖性,因此,如果仅使用diag(vcov(agg))
作为采样方差对这些聚合值进行元分析,结果将与从完整多级模型中获得的结果不相同。但实际上没有办法解决这一问题,该图只是汇总估计的可视化,显示的CI是正确的。
您需要在data
的新列中指定自己的分组,并将其用作新的随机效果:
df$study_group <- c(1,1,1,2,2,3,4,5,5,5) # example
full.model <- rma.mv(yi = yi,
V = vi,
slab = Author,
data = df,
random = ~ 1 | study_group,
test = "t",
method = "REML")
forest(full.model)