如何通过研究绘制多层次荟萃分析(与亚组相比)?
How to plot multi-level meta-analysis by study (in contrast to the subgroup)?
我正在进行多层次的荟萃分析。许多研究有几个亚组。当我制作森林图时,研究以子组的形式呈现。其中有 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)
您需要在 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)
我不清楚是要聚合到 Author
级别还是要聚合到 Study
级别。如果特定研究有多行数据,则模型并不真正完整,您可能希望为研究中的估计水平添加另一个随机截距。本质上,最低的随机效应应该在输出中具有与估计值 (k
).
一样多的 nlvls
值。
让我们首先处理我们有一个多层次结构的情况,其中有两个层次,研究和研究中的多个估计(由于某些技术原因,有些人可能称其为 three-level 模型,但我们不深入讨论这个).我将使用一个完全可重现的示例来说明目的,使用 dat.konstantopoulos2011
数据集,其中我们有学区和学区内的学校。我们适合您所拥有的类型的多级模型:
library(metafor)
dat <- dat.konstantopoulos2011
res <- rma.mv(yi, vi, random = ~ 1 | district/school, data=dat)
res
我们可以使用 aggregate()
函数将估计值汇总到地区级别,指定模型估计值的边际 var-cov 矩阵来说明它们的 non-independence(请注意这利用了仅适用于 escalc
对象的 aggregate.escalc()
,因此如果不是,您需要将数据集转换为一个数据集 - 有关详细信息,请参阅 help(aggregate.escalc)
):
agg <- aggregate(dat, cluster=dat$district, V=vcov(res, type="obs"))
agg
您会发现,如果您随后根据聚合数据将 equal-effects 模型拟合到这些估计值,那么结果与您从多级模型中获得的结果相同(我们使用 equal-effects模型,因为多级模型所解释的异质性已经封装在 vcov(res, type="obs")
):
rma(yi, vi, method="EE", data=agg)
因此,我们现在可以在森林图中使用这些聚合值:
with(agg, forest(yi, vi, slab=district))
根据您的描述,我的猜测是您实际上还有一个应该包含在模型中的额外级别,并且您希望聚合到中间级别。这有点复杂,因为 aggregate()
不是那个意思。仅出于说明目的,假设我们使用 year
作为另一个(更高)级别,我将对数据进行一些处理,以便所有三个方差分量均为 non-zero(同样,仅出于说明目的):
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-cov矩阵:
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)))
森林图无法表明仍然存在于这些值中的相关性,因此如果 meta-analyze 这些聚合值仅使用 diag(vcov(agg))
作为其抽样方差,结果将不相同到你从完整的多层次模型中得到的东西。但实际上并没有办法解决这个问题,该图只是汇总估计的可视化,显示的 CI 是正确的。
我正在进行多层次的荟萃分析。许多研究有几个亚组。当我制作森林图时,研究以子组的形式呈现。其中有 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)
您需要在 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)
我不清楚是要聚合到 Author
级别还是要聚合到 Study
级别。如果特定研究有多行数据,则模型并不真正完整,您可能希望为研究中的估计水平添加另一个随机截距。本质上,最低的随机效应应该在输出中具有与估计值 (k
).
nlvls
值。
让我们首先处理我们有一个多层次结构的情况,其中有两个层次,研究和研究中的多个估计(由于某些技术原因,有些人可能称其为 three-level 模型,但我们不深入讨论这个).我将使用一个完全可重现的示例来说明目的,使用 dat.konstantopoulos2011
数据集,其中我们有学区和学区内的学校。我们适合您所拥有的类型的多级模型:
library(metafor)
dat <- dat.konstantopoulos2011
res <- rma.mv(yi, vi, random = ~ 1 | district/school, data=dat)
res
我们可以使用 aggregate()
函数将估计值汇总到地区级别,指定模型估计值的边际 var-cov 矩阵来说明它们的 non-independence(请注意这利用了仅适用于 escalc
对象的 aggregate.escalc()
,因此如果不是,您需要将数据集转换为一个数据集 - 有关详细信息,请参阅 help(aggregate.escalc)
):
agg <- aggregate(dat, cluster=dat$district, V=vcov(res, type="obs"))
agg
您会发现,如果您随后根据聚合数据将 equal-effects 模型拟合到这些估计值,那么结果与您从多级模型中获得的结果相同(我们使用 equal-effects模型,因为多级模型所解释的异质性已经封装在 vcov(res, type="obs")
):
rma(yi, vi, method="EE", data=agg)
因此,我们现在可以在森林图中使用这些聚合值:
with(agg, forest(yi, vi, slab=district))
根据您的描述,我的猜测是您实际上还有一个应该包含在模型中的额外级别,并且您希望聚合到中间级别。这有点复杂,因为 aggregate()
不是那个意思。仅出于说明目的,假设我们使用 year
作为另一个(更高)级别,我将对数据进行一些处理,以便所有三个方差分量均为 non-zero(同样,仅出于说明目的):
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-cov矩阵:
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)))
森林图无法表明仍然存在于这些值中的相关性,因此如果 meta-analyze 这些聚合值仅使用 diag(vcov(agg))
作为其抽样方差,结果将不相同到你从完整的多层次模型中得到的东西。但实际上并没有办法解决这个问题,该图只是汇总估计的可视化,显示的 CI 是正确的。