R语言meta分析(4)网状Meta 分析
(1)网状Meta 分析介绍
网状Meta 分析(NMA)是一种允许在同一meta分析中比较多种治疗方法的统计技术 ,其近年来在医学文献中越来越受欢迎。网状Meta 分析自2002 年由Lumley 教授正式提出以来,引发广泛关注。网状meta分析的概念:基于间接比较或合并间接比较与直接比较而同时分析 2 个以上干预措施的 Meta分析。包括如下2种情况:①间接比较 Meta分析:当不存在直接比较情况下,基于共同对照对多个干预措施进行比较的 Meta分析;②混合治疗效应 Meta分析:当同时存在直接比较和间接比较的情况下,基于间接结果与直接结果的合并结果来同时分析多个干预措施的 Meta分析。
近年来基于严格设计的随机对照试验(RCT)已经被公认为评价干预措施疗效的最佳手段,这种比较所采用的针对两组研究结果比较的定量综合方法,被称为传统的 Meta 分析方法。传统 Meta 分析通过合并多个直接比较的研究而得到一个综合的评估结果,从而克服了单个研究样本量不足的缺陷,提高了研究的检验效能,特别是研究结果出现不一致时,运用 Meta 分析对判断某种干预措施的有效性与否发挥了重要作用。当欲开展两种干预措施利弊比较(A vs B)的 Meta 分析,但不能找到 A vs B 直接比较的 RCT,却可找到 A vs C与 B vs C 进行比较的 RCT,我们可以将 C 作为共同对照,通过 A vs C 与 B vs C的比较结果来间接得到 A vs B 的疗效比较,这种方法叫做间接比较(indirect comparison)。在实际的临床工作中,临床医生常常需要同时比较多种干预措施,权衡利弊以进行临床决策,这时证据网络中既存在直接证据,又存在间接证据,这种综合直接及间接证据的分析方法即为网状 Meta 分析(Network Meta-analysis, NMA)。 网状 Meta 分析可以同时比较三个或三个以上干预措施的疗效,因而被认为是传统 Meta 分析的扩展及延伸,即 NMA 可基于严格设计 RCT 同时比较多个干预措施,对直接及间接比较进行综合性分析。当无直接比较的研究存在时,间接比较成为提供有价值的卫生决策信息的有效途径;当有直接比较的研究存在时,综合直接比较与间接比较的研究结果能够提高结果的精度。不仅如此,NMA 还能够就不同干预措施的疗效进行排序,提供每一个干预措施是最佳干预措施的概率。关于 Meta 分析方法的研究迄今已经有 30 多年的时间,NMA作为一门新崛起的、一种循证医学统计学方法,越来越受到流行病学家、统计学家、临床研究者及药学家的关注及青睐。
为什么选择R语言
有多种统计学软件可以执行NMA所需的各种步骤。可以使用诸如SAS和STATA之类的商业程序来实现频繁模型。可自由使用的贝叶斯软件程序(如OpenBUGS,WinBUGS或JAGS)可用于执行贝叶斯NMA,但它们需要非常复杂的程序代码。此外,这些统计学软件可能不包含绘图工具。
而R语言是一类免费开源的软件,其在统计学家中广受欢迎。R语言用户无需在OpenBUGS,WinBUGS或JAGS中编程便可以实现这些包的功能同时输出美观的可视化结果,从而最大限度地减少了用户所需的编程。通过组合几个包的功能,几乎所有网络meta分析所需要的输出都可以在R中获得。
本文旨在向读者介绍三个R软件包,即gemtc,pcnetmeta和netmeta,以便临床研究人员和研究人员可以根据他们的分析需求快速进行网状Meta 分析。
netmeta包
netmeta 程序包是目前唯一一个基于频率学派研发的、且未使用回归模型就能一次性完成网状 Meta 分析的程序包。因此,其避免了贝叶斯统计中复杂先验设置、初始值设置,以及回归模型哑变量和方差- 协方差矩阵等设置所带来的人为偏差,简化了操作者对各参数的设定,因此更适合初学者。
在图形方面,netmeta 程序包已可绘制森林图;网状 Meta 分析中建议绘制的网状关系图可通过network 程序包等来实现 。 尽管该程序包在使用方面存在诸多优点,但对 于组间与组内的异质性与一致性的鉴别仍有所欠 缺,同时,对相关性的考量也未引入到该程序包中。
主要代码:
net1
seTE,tr eat1=data
t2,studlab=data$studlab,co mb.random=TRUE,sm="OR",reference="A")
所使用的数据示例如下:
studlab:配对治疗的研究编号;TE:配对药物 比较效应量,本处为logOR;seTE:配对药物比较效应量所对应的标准误;t1 与 t2:分别表示两种配对药物编号“comb.random”表示是否默认储存随机模 型,而配对研究的固定和随机模型均会执行; “sm” 表示选取的最终合并效应量; “reference”表示选取 的参考治疗方案,可以依次更改参考药名,来获取 其他配对结果。
library(netmeta)
# Load diabetes data (Senn 2013), included in R package netmeta
data(Senn2013)
# Look at first 5 lines: data are in contrast-based format
head(Senn2013, 5)
TE seTE treat1.long treat2.long treat1 treat2 studlab
1 -1.90 0.1414 Metformin Placebo metf plac DeFronzo1995
2 -0.82 0.0992 Metformin Placebo metf plac Lewin2007
3 -0.20 0.3579 Metformin Acarbose metf acar Willms1999
4 -1.34 0.1435 Rosiglitazone Placebo rosi plac Davidson2007
5 -1.10 0.1141 Rosiglitazone Placebo rosi plac Wolffenbuttel1999
## TE seTE treat1 treat2 studlab
# Network meta-analysis of diabetes data
net1
comb.fixed=FALSE, comb.random=TRUE)
# Summarize results
summary(net1)
Number of studies: k = 26
Number of treatments: n = 10
Number of pairwise comparisons: m = 28
Number of designs: d = 15
Random effects model
Treatment estimate (sm = 'MD'):
acar benf metf migl piog plac rosi sita sulf vild
acar . -0.1106 0.2850 0.1079 0.2873 -0.8418 0.3917 -0.2718 -0.4252 -0.1418
benf 0.1106 . 0.3956 0.2186 0.3979 -0.7311 0.5023 -0.1611 -0.3146 -0.0311
metf -0.2850 -0.3956 . -0.1770 0.0023 -1.1268 0.1067 -0.5568 -0.7102 -0.4268
migl -0.1079 -0.2186 0.1770 . 0.1794 -0.9497 0.2837 -0.3797 -0.5332 -0.2497
piog -0.2873 -0.3979 -0.0023 -0.1794 . -1.1291 0.1044 -0.5591 -0.7125 -0.4291
plac 0.8418 0.7311 1.1268 0.9497 1.1291 . 1.2335 0.5700 0.4166 0.7000
rosi -0.3917 -0.5023 -0.1067 -0.2837 -0.1044 -1.2335 . -0.6635 -0.8169 -0.5335
sita 0.2718 0.1611 0.5568 0.3797 0.5591 -0.5700 0.6635 . -0.1534 0.1300
sulf 0.4252 0.3146 0.7102 0.5332 0.7125 -0.4166 0.8169 0.1534 . 0.2834
vild 0.1418 0.0311 0.4268 0.2497 0.4291 -0.7000 0.5335 -0.1300 -0.2834 .
Lower 95%-confidence limit:
acar benf metf migl piog plac rosi sita sulf vild
acar . -0.8499 -0.2208 -0.5542 -0.3313 -1.3236 -0.1189 -1.1166 -0.9456 -0.9856
benf -0.6286 . -0.2414 -0.5030 -0.3089 -1.2918 -0.1118 -1.0534 -1.0476 -0.9224
metf -0.7908 -1.0327 . -0.7227 -0.4398 -1.4291 -0.2170 -1.3138 -1.1713 -1.1826
migl -0.7701 -0.9402 -0.3686 . -0.4465 -1.4040 -0.2350 -1.2092 -1.1883 -1.0781
piog -0.9059 -1.1048 -0.4444 -0.8052 . -1.5596 -0.3347 -1.3758 -1.3045 -1.2447
plac 0.3600 0.1705 0.8244 0.4955 0.6986 . 0.9830 -0.1240 -0.0556 0.0073
rosi -0.9023 -1.1164 -0.4304 -0.8025 -0.5435 -1.4839 . -1.4013 -1.2817 -1.2701
sita -0.5731 -0.7311 -0.2002 -0.4497 -0.2576 -1.2640 -0.0744 . -0.9928 -0.8506
sulf -0.0951 -0.4184 0.2491 -0.1220 0.1205 -0.8887 0.3521 -0.6859 . -0.5549
vild -0.7020 -0.8601 -0.3291 -0.5787 -0.3865 -1.3927 -0.2032 -1.1106 -1.1218 .
Upper 95%-confidence limit:
acar benf metf migl piog plac rosi sita sulf vild
acar . 0.6286 0.7908 0.7701 0.9059 -0.3600 0.9023 0.5731 0.0951 0.7020
benf 0.8499 . 1.0327 0.9402 1.1048 -0.1705 1.1164 0.7311 0.4184 0.8601
metf 0.2208 0.2414 . 0.3686 0.4444 -0.8244 0.4304 0.2002 -0.2491 0.3291
migl 0.5542 0.5030 0.7227 . 0.8052 -0.4955 0.8025 0.4497 0.1220 0.5787
piog 0.3313 0.3089 0.4398 0.4465 . -0.6986 0.5435 0.2576 -0.1205 0.3865
plac 1.3236 1.2918 1.4291 1.4040 1.5596 . 1.4839 1.2640 0.8887 1.3927
rosi 0.1189 0.1118 0.2170 0.2350 0.3347 -0.9830 . 0.0744 -0.3521 0.2032
sita 1.1166 1.0534 1.3138 1.2092 1.3758 0.1240 1.4013 . 0.6859 1.1106
sulf 0.9456 1.0476 1.1713 1.1883 1.3045 0.0556 1.2817 0.9928 . 1.1218
vild 0.9856 0.9224 1.1826 1.0781 1.2447 -0.0073 1.2701 0.8506 0.5549 .
Quantifying heterogeneity / inconsistency:
tau^2 = 0.1087; I^2 = 81.4%
Tests of heterogeneity (within designs) and inconsistency (between designs):
Q d.f. p-value
Total 96.99 18 < 0.0001
Within designs 74.46 11 < 0.0001
Between designs 22.53 7 0.0021
绘制森林图
# Look at result
forest(net1, ref = "plac",
pooled = "random", digits=2,
smlab = "Random effects model",
xlab = "HbA1c difference",
leftlabs = "Contrast to placebo")
绘制网络图
netgraph(net1)
trts
"metf", "rosi", "piog", "sita", "vild")
netgraph(net1, highlight = "rosi:plac", seq = trts)
网状meta分析图形布局中的节点对应于治疗方案,而图中的连线代表搜集的治疗比较研究。
更多示例代码
data(Senn2013)
#
# Fixed effect model (default)
#
net1
data=Senn2013, sm="MD")
net1
net1$Q.decomp
#
# Comparison with reference group
#
netmeta(TE, seTE, treat1, treat2, studlab,
data=Senn2013, sm="MD", reference="plac")
#
# Random effects model
#
net2
data=Senn2013, sm="MD", comb.random=TRUE)
net2
#
# Change printing order of treatments (placebo first)
#
trts
"rosi", "sita", "sulf", "vild")
net3
data=Senn2013, sm="MD",
seq=trts)
print(summary(net3), digits=2)