大家好,本教程将介绍如何使用R的gemtc包对生存数据(HR为效应量)进行贝叶斯网状Meta分析。
前提条件
需要下载R软件(推荐使用的R版本为3.5.3),以及RStudio(一个R的友好交互界面)。
准备工作完成后,打开RStudio后,在console里输入:
install.packages(“gemtc”)
第一次安装的时候,安装速度可能比较慢,耐心等待一下。
等安装完成后,设置我们的工作目录,后面可以把待分析的数据放入这个工作目录,敲入:
setwd("D:\R网状教程\HR") #你可以更改为自己的工作目录,在后面环境变量增多的时候,在这一步前可以加一个rm(list=ls())清除环境变量。
然后敲入:
library(gemtc) #装载gemtc包
关于如何将生存数据准备成可以用R的GEMTC分析的格式,以及如何计算多臂研究中参考臂的标准误,请参考如下教程:
生存数据的网状Meta分析||如何整理为可以用R的gemtc包进行分析的格式
主要分析
把刚刚准备好的数据导入到R里,敲入:
data <- read.csv("sample1.csv", sep=",", header=T) #sep代表逗号为分隔符,header=T代表把首行的数据作为标题,<-是R里的赋值符号,你可以把它理解为=号。<-前面的变量名是可以自己任意指定的,以下类似。
把数据弄成gemtc的网络格式,敲入:
network <- mtc.network(data.re=data) #这里<-前面的network不一定非要叫network,改为其他的阿猫阿狗名称均可。以下类似,不再赘述。
输入:
plot(network)
可以看到网状图如下:

当然了,这些大小、颜色、字体等等的参数都是可以调整的,但是跟stata做网状图相比还是太麻烦了。Stata几乎不用调整一步到位,大家可以参考我之前制作的如何使用stata对生存数据做网状关系图的教程:
生存数据做网状Meta分析||如何做网状关系图
然后开始建立模型:
model <-mtc.model(network, type="consistency", n.chain=4,likelihood="binom",link="cloglog",linearModel="random")

其中,圆括号里的第一个参数为我们刚刚新建的gemtc网络类型的变量network,第二个参数type=”consistency”,是指我们的模型为一致性模型,n.chain指的是马尔科夫蒙特卡洛MCMC的链条数目,一般为2-4均可。因为我们进行的是生存数据的网状分析,所以likelihood=”binom”, link=”cloglog”。linearModel=”random”指的是我们使用的模型为随机效应,当然也可以指定fixed作为固定效应模型。这一步可能会跳出一些红色的warning,强迫症的同学看到可能会感到不安,但不用紧张,不影响后续的分析,不管它即可。
现在就可以进行迭代了,敲入:
results <- mtc.run(model, n.adapt = 20000, n.iter = 50000, thin = 1)
其中,model是我们上一步建立的模型名称,n.adapt为退火次数,n.iter为迭代次数。这个时候我们耐心等待,RStudio界面如下所示:

敲入:
summary(results)
可以看到如下结果:

其中结果包括DIC,DIC可以进一步与不一致性模型的DIC作比较,如果相差在5以内,就说明数据基本符合一致性的前提。DIC的绝对值没有任何意义,只用于相对比较。以及I2这个总体异质性参数。总体异质性参数也可以报告tau2,上图中的sd.d就是tau,本例中为0.25,那么tau2就是0.06。
敲入:
forest(relative.effect(results, "Control"))
可以看到每个干预相对于Control的森林图:

敲入:
plot(results) #可以看到每个指标的收敛情况以及密度图

敲入:
gelman.plot(results) # 收敛性诊断

对所有的干预措施进行排序,敲入:
ranks <- rank.probability(results, preferredDirection= -1) #这里的效应量越小越好,所以direction选择-1,默认为效应量越大越好
print(ranks)

制作联赛表:
a <- round(exp(relative.effect.table(results)),2)
write.csv(a, "leaguetable.csv")
以上步骤可以在工作目录中导出这个表格。

全局不一致(Global inconsistency)
很多同学不知道如何做不一致模型,想当然的以为将type=”inconsistency”就OK了,其实并非如此。而应是在模型那一步中将type=”ume”或者”use”。至于ume和use具体是什么,本文不再赘述,感兴趣的同学可以查看QQ交流群519864737群文件中TSD4(inconsistency)的文件。如下:
modelume <-mtc.model(network, type="ume", n.chain=4, likelihood="binom", link="cloglog", linearModel="random")
resultsume <- mtc.run(modelume, n.adapt = 20000, n.iter = 50000, thin = 1)
summary(resultsume) #查看不一致模型的DIC,然后与一致性模型进行比较。

局部不一致(local inconsistency)
用节点劈裂法
resultnodesplit <-mtc.nodesplit(network, n.adapt = 20000, n.iter = 50000, thin = 1, n.chain=4, likelihood="binom", link="cloglog",linearModel="random")

在这里,我们无需像在WinBUGS或者OpenBUGS软件里对初始值进行繁琐的设定,这一点是我非常喜欢R软件gemtc包的地方。
b<-summary(resultnodesplit) #查看节点劈裂法的结果
print(b)

plot(b)

异质性分析(heterogeneity)
resultanohe <- mtc.anohe(network, n.adapt = 20000, n.iter = 50000, thin = 1, n.chain=4, likelihood="binom", link="cloglog",linearModel="random")
c<-summary(resultanohe)
plot(c)


至此,主分析的步骤基本已经完成。
求winbugs网状meta生存分析代码