查看原文
其他

不得不爱(1)——网状meta分析必备技能(三):R软件gemtc包

2016-07-21 猴哥 Freescience联盟
###FS的宗旨:科学自由分享、人人平等,共求真理###

我们仅仅是代码的编辑者、整合者、搬运工,仅免费传授方法,下文数据和代码取自于网络和免费软件“R语言说明书”,如果您觉得我们侵犯了您的版权,请通知我们撤稿。
我们没有详细讲解理论是因为——高手们已经发表了网状meta分析的理论文章,请大家在cnki检索“网状meta分析”学习理论知识(高手告诉我:复制超过6个字,意味着侵犯版权)。请大家谅解,谢谢!

###FS的宗旨:科学自由分享、人人平等,共求真理###



第一部分   二分类数据网状meta分析的异质性###########


3.1 新的一天了,大家一定很累了,不知道上一章(忘记了?点这里),大家操练好了没有呢?我们来点简单的baidu google……


今天在这里我们将“R软件gemtc包”的实战讲透彻!具体理论请自行学习,可以baidu gemtc,摸索一下。或者google科学上网。



或者使用猴哥为大家准备的gemtc官方的说明书,具体下载地址如下:

http://pan.baidu.com/s/1dFNUNyp



3.2   0001 二分类数据 残差 残差分布


3.2.1 残差 残差分布


在回归分析中,测定值与按回归方程预测的值之差,以δ表示。残差δ遵从正态分布N(0,σ2)。(δ-残差的均值)/残差的标准差,称为标准化残差,以δ*表示。δ*遵从标准正态分布N(0,1)。实验点的标准化残差落在(-2,2)区间以外的概率≤0.05。若某一实验点的标准化残差落在(-2,2)区间以外,可在95%置信度将其判为异常实验点,不参与回归直线拟合。


显然,有多少对数据,就有多少个残差。残差分析就是通过残差所提供的信息,分析出数据的可靠性、周期性或其它干扰。


3.2.2 代码如下,请复制到Rstudio的r软件中


猴哥为大家准备的苹果版和WINDOWS R软件stata软件,具体下载地址如下:
http://pan.baidu.com/s/1dFNUNyp



#1清除环境变量,设置路径--------------------------------------------------
rm(list=ls())
getwd()
# 猴哥是放在F盘的0108gemtc_sm文件夹下,你可以自己新建一个文件夹
setwd("F:\\0108gemtc_sm\\gemtc\\inst")
# 如果没有安装gemtc,请执行如下命令,执行时去掉#,并在Rstudio中按 ctrl+enter
# install.packages("gemtc")


#2载入程序包--------------------------------------------------
# install.packages('code')
library(gemtc)
# library(code)
library(codetools)
library(testthat)

#3导入数据load file 1   
#3.1第一种方式

导入执行包gemtc包中的系统文件,并命名为file
file <- system.file('extdata/luades-smoking.gemtc', package='gemtc')  


# 看一下文件位置
print(file)


##读取gemtc文件,并保存为net
net = read.mtc.network(file)
# 或者命名为network
network <- read.mtc.network(file)   
# 看一下文件数据
print(net)
print(network)

#3.2保存数据
# 这里net 和network是list,所以不能直接保存数据,我们只能保存数据框
write.csv(network$treatments, file = "F:\\0108gemtc_sm\\network0001_treatments.csv")  
write.csv(network$data.ab, file = "F:\\0108gemtc_sm\\network0001_data.ab.csv")
# #或者,这里的file = " F:\\0108gemtc_sm\\network0001.csv"="F:/0108gemtc_sm/net0001.csv"
write.csv(net$treatments, file = "F:/0108gemtc_sm/net0001_treatments.csv")  
write.csv(net$data.ab, file = "F:/0108gemtc_sm/net0001_data.ab.csv")

#这里说明了戒烟的4个治疗手段,A B C D



#这里说明了戒烟的24个研究,共计50个arm的情况




#4导入数据,第2种方法----------------------------------------
#大家习惯了在excel中处理数据,可以先转化为 .csv格式
# 读取CSV文件
# header=T,表示文件存在,表示需要读取数据的数据头部
# skip=0,表示数据中没有需要跳过的行, ./treatments0001.csv表示本文件夹中的treatments0001.csv文件,row.names = 1是第一列作为行名
treatments<- read.csv("./net0001_treatments.csv",header=T,sep = ",",skip=0,row.names = 1)
# 我们看一下数据
head(treatments)

# 我们看一下数据
data <- read.csv("./net0001_data0001.csv",header=T,sep = ",",row.names = 1)
head(data)

#5创建network对象,建立成network 单臂长数据格式,

description=" Luades_smoking "是对network的描述
network<- mtc.network(data, description="Luades_smoking", treatments=treatments)

#network是单臂长数据
network
# 进一步了解 network的属性
head(network)

#6构建模型####
#一致性模块
# 其中, network 为 network 数据, type 为是否选取一致性模型,
# n.chain 为迭代运算中链的条数。需要注意的是,目前该程序包通过 R 软件只能使用一致性模型

# model <- mtc.model(network, linearModel='fixed', likelihood='normal', link='identity')  
# model1
model <- mtc.model(network, type = 'consistency')

# 以下model2模型和上面的模型,意义差不多
# model2
model <- mtc.model(network,type = "consistency", factor = 2.5, n.chain = 3)  



#7网状证据图####
#网状图在可这里可以直接出图
#模型网状图
plot(network)
# # points(network, cex = .5, col = "dark red")  #改变颜色没有用
# #network图汇总
summary(network)

# 网状图导出
#绘制tiff图片并保存在Rwork文件夹下
tiff(file="network.tiff")
plot(network)
 dev.off()

#8运行结果####
#使用#JAGS进行运算
#8.1简单命令
result <- mtc.run(model)
#8.2复杂命令
result <-mtc.run(model, sampler ="rjags", n.adapt = 5000, n.iter = 20000, thin = 1)   
#Setting the sampler is deprecated, only JAGS is supported.  #sunmin dell PC

#9拟合模型,等待一段时间

#####################以下内容和上一章相同,是结果的输出部分######################


#10网状证据图####
#网状图在可这里可以直接出图
#模型网状图
plot(network)


# # points(network, cex = .5, col = "dark red")  #改变颜色没有用
# #network图汇总,右下角的窗口中出现了,我们要的图形

# 网状图导出
#绘制tiff图片并保存在所在目录文件夹下
tiff(file="0101network.tiff")
plot(network)
dev.off()
#文件夹中出现了,我们要的森林图,其他同理可得

summary(network)

#诊断收敛性
gelman.plot(result)


# 收敛图导出
#绘制tiff图片并保存在所在目录文件夹下
tiff(file="0102gelman.plot.tiff")
gelman.plot(result,auto.layout =F)
dev.off()

#结果汇总
summary(result)

#密度图
plot(result)

# 密度图导出
#绘制tiff图片并保存在所在目录文件夹下
tiff(file="0103密度图.tiff")
plot(result)
dev.off()

#森林图
forest(result)

# 森林图导出
#绘制tiff图片并保存在所在目录文件夹下
tiff(file="0104森林图.tiff")
forest(result)
dev.off()


#等级排名
ranks <- rank.probability(result)
print(ranks)

#排序图,堆积排序图
tiff(file="0105堆积排序图.tiff")
plot(ranks) # plot a cumulative rank plot
dev.off()

#单个排序图,等级图
tiff(file="0106单个排序图.tiff")
barplot(t(ranks), beside=TRUE)    # plot a 'rankogram'
dev.off()

#单个排序图,等级图,我们让色彩丰富一些
tiff(file="0107单个排序图.tiff")
barplot(t(ranks), beside = TRUE,
        col = c("lightblue", "mistyrose", "lightcyan",
                "lavender", "cornsilk"),
        legend = rownames(VADeaths), ylim = c(0, 1))
title(main = "Death Rates in Virginia", font.main = 8)
dev.off()

#单个排序图,等级图,我们让色彩更丰富一些
barplot(t(ranks), beside=TRUE, col = colors(1:14))

# 单个排序图导出
#绘制tiff图片并保存在所在目录文件夹下
tiff(file="0108单个排序图.tiff")
barplot(t(ranks), beside=TRUE, col = colors(1:14))
dev.off()

#11相对影响森林图

# 相对影响森林图导出vsB
tiff(file="0109相对影响森林图导出vsA.tiff")
forest(relative.effect(result, "A"))
dev.off()

summary(relative.effect(result, "A", c("B", "C", "D")))

#12残差
print(result$deviance)

#13杠杆效应####
## residual deviance plot

# #the first method,暂不能实现,但需要运行
if (model$data$ns.r2 + model$data$ns.rm == 0) {
  tpl <- gemtc:::arm.index.matrix(model[['network']])
  study <- matrix(rep(1:nrow(tpl), times=ncol(tpl)), nrow=nrow(tpl), ncol=ncol(tpl))
  study <- t(study)[t(!is.na(tpl))]
  devbar <- t(results$deviance$dev.ab)[t(!is.na(tpl))]
  title <- "Per-arm residual deviance"
  xlab <- "Arm"
} else {
  nd <- model$data$na
  nd[-(1:model$data$ns.a)] <- nd[-(1:model$data$ns.a)] - 1
  devbar <- c(apply(result$deviance$dev.ab, 1, sum, na.rm=TRUE), result$deviance$dev.re) / nd
  study <- 1:length(devbar)
  title <- "Per-study mean per-datapoint residual deviance"
  xlab <- "Study"
}
plot(devbar, ylim=c(0,max(devbar, na.rm=TRUE)),
     ylab="Residual deviance", xlab=xlab,
     main=title, pch=c(1, 22)[(study%%2)+1])

# #the second method
###########################
for (i in 1:length(devbar)) {
  lines(c(i, i), c(0, devbar[i]))
}

# w <- sign(r - rfit) * sqrt(devbar)

# plot(w, leverage, xlim=c(-3,3), ylim=c(0, 4.5))
# x <- seq(from=-3, to=3, by=0.05)
# for (c in 1:4) { lines(x, c - x^2) }
fit.ab <- apply(result$deviance$fit.ab, 1, sum, na.rm=TRUE)
dev.ab <- apply(result$deviance$dev.ab, 1, sum, na.rm=TRUE)
lev.ab <- dev.ab - fit.ab
fit.re <- result$deviance$fit.re
dev.re <- result$deviance$dev.re
lev.re <- dev.re - fit.re
nd <- model$data$na
nd[-(1:model$data$ns.a)] <- nd[-(1:model$data$ns.a)] - 1
w <- sqrt(c(dev.ab, dev.re) / nd)
lev <- c(lev.ab, lev.re) / nd

plot(w, lev, xlim=c(0, max(c(w, 2.5))), ylim=c(0, max(c(lev, 4))),
     xlab="Square root of residual deviance", ylab="Leverage",
     main="Leverage versus residual deviance")
mtext("Per-study mean per-datapoint contribution")

x <- seq(from=0, to=3, by=0.05)
for (c in 1:4) { lines(x, c - x^2) }

# 重新运行下画图程序,可以出图
tiff(file="0110相对影响森林图导出vsB.tiff")
plot(w, lev, xlim=c(0, max(c(w, 2.5))), ylim=c(0, max(c(lev, 4))),
     xlab="Square root of residual deviance", ylab="Leverage",
     main="Leverage versus residual deviance")
mtext("Per-study mean per-datapoint contribution")

x <- seq(from=0, to=3, by=0.05)
for (c in 1:4) { lines(x, c - x^2) }
dev.off()

#14万众期待的异质性图,猴哥自家的代码,google里面没有哦############

# mtc.anohe(network)
# 14非常重要##############
# 14smok研究间的异质性和森林图##############
result.anohe <- mtc.anohe(network, n.adapt=1000, n.iter=5000)

# plot(result.anohe)

summary.anohe <- summary(result.anohe)

plot(summary.anohe, xlim=log(c(0.2, 5)))

summary.anohe

# Analysis of heterogeneity
# =========================
#   
#   Per-comparison I-squared:
#   -------------------------
#   
#   t1 t2  i2.pair  i2.cons  incons.p
# 1  A  B 61.68561 66.88978 0.7106796
# 2  A  C 92.68188 92.19784 0.9117685
# 3  A  D 86.36661 57.96352 0.4816269
# 4  B  C  0.00000  0.00000 0.4877663
# 5  B  D 40.96877  0.00000 0.8934959
# 6  C  D 62.36553 58.46978 0.2931933
#
# Global I-squared:
#   -------------------------
#   
#   i2.pair i2.cons
# 1 89.69921 88.5369

summary.anohe$consEffects

# t1 t2        pe       ci.l     ci.u
# 1  A  B 0.4815935 -0.2926061 1.315680
# 2  A  C 0.8316086  0.3862057 1.361283
# 3  A  D 1.0858208  0.2467852 2.027102
# 4  B  C 0.3514423 -0.4599256 1.200236
# 5  B  D 0.6080877 -0.3433846 1.603331
# 6  C  D 0.2507416 -0.5646447 1.088071


summary.anohe$studyEffects

# study t1 t2          pe         ci.l        ci.u
# 1      1  A  C  1.08468247  0.131825883  2.03753906
# 2      1  A  D  0.13179134 -1.246876317  1.51045900
# 3      1  C  D -0.95289113 -1.864452746 -0.04132951
# 4      2  B  C  0.01477717 -1.344989257  1.37454359
# 5      2  B  D  0.26425258 -0.598264269  1.12676944
# 6      2  C  D  0.24947542 -0.590747993  1.08969883
# 7      3  A  B -0.01509682 -0.346692546  0.31649890
# 8      4  A  B  0.39503472 -0.244562172  1.03463162
# 9      5  A  B  0.72634581 -0.155105472  1.60779709
# 10     6  A  C  2.21424725  1.930107850  2.49838665
# 11     7  A  C  1.09410003 -0.675247258  2.86344732
# 12     8  A  C  0.42748862  0.122258254  0.73271898
# 13     9  A  C 18.71338529 -8.494560712 45.92133130
# 14    10  A  C  2.86935813  1.584637810  4.15407844
# 15    11  A  C  3.08048940  0.444298661  5.71668015
# 16    12  A  C  0.50230300 -0.532874788  1.53748079
# 17    13  A  C  0.46393989  0.179475792  0.74840399
# 18    14  A  C -0.13551085 -0.764993165  0.49397147
# 19    15  A  C -0.24361822 -0.585177256  0.09794082
# 20    16  A  C  0.04031725 -0.329491827  0.41012633
# 21    17  A  C  0.39445062  0.062293725  0.72660752
# 22    18  A  C  0.14917935 -1.067970279  1.36632897
# 23    19  A  C  0.58502492 -0.002707489  1.17275734
# 24    20  A  D 24.42541723 -2.919989916 51.77082438
# 25    21  B  C -0.15718293 -1.008726421  0.69436056
# 26    22  B  D  1.10500752  0.174982175  2.03503287
# 27    23  C  D  0.70010819 -0.112046095  1.51226247
# 28    24  C  D -0.51648572 -1.993457795  0.96048635

summary.anohe$pairEffects

# t1 t2          pe        ci.l     ci.u
# 1  A  B  0.34239499 -0.71419051 1.465357
# 2  A  C  0.82173062  0.33285861 1.368663
# 3  A  D  1.65193949 -0.04405122 3.577416
# 4  B  C -0.08185359 -1.55575229 1.402015
# 5  B  D  0.67841016 -0.72818479 2.105401
# 6  C  D -0.07257150 -1.12055323 0.925233





#15节点劈裂法,探讨模型的一致性和不一致性####


network

result <-mtc.nodesplit(network)
summary(result)

names(result)
# [1] "d.A.C" "d.A.D" "d.B.D" "d.C.D" "consistency"

summary(result$d.A.C)

# Overall summary and plot
summary.ns <- summary(result)
print(summary.ns)
plot(summary.ns)
# 建议大家在 r软件中画图哦,Rstudio中只能整理看一下结果
#或者直接导出到pdf



###FS的宗旨:科学自由分享、人人平等,共求真理###


第二部分  Gemtc实现以二分类网络meta分析  例文赏析#######

中文题目:2016rNMA gemtc五种常见麻醉在小儿麻醉和恢复中的特点:网络的Meta分析
Emergence and Recovery Characteristics of Five Common
Anesthetics in Pediatric Anesthesia: a Network Meta-analysis
Jianrong Guo1 & Xiaoju Jin2 & Huan Wang1 & Jun Yu2 & Xiaofang Zhou1 & Yong Cheng1 &Qiang Tao1 & Li Liu1 & Jianping Zhang Mol Neurobiol

DOI 10.1007/s12035-016-9982-3 (在对话框回复NMA01,获得文献哦)


图1 是r软件gemtc包做的5种治疗方案的 网状证据图   代码见我们上面的  “#7网状证据图####”部分



图2 相对相应森林图
代码见我们的“# 森林图导出” 和 “#11相对影响森林图”



图3和图5 是探讨模型的一致性和不一致性,代码见我们上文的“#15节点劈裂法,探讨模型的一致性和不一致性####“




图4和图6 是探讨模型的一致性和不一致性,代码见我们上文的“#15节点劈裂法,探讨模型的一致性和不一致性####“






图7 是探讨模型的一致性和不一致性,代码见我们上文的“#15节点劈裂法,探讨模型的一致性和不一致性###”



图8 是探讨模型的一致性和不一致性,代码见我们上文的“#15节点劈裂法,探讨模型的一致性和不一致性###”




###FS的宗旨:科学自由分享、人人平等,共求真理###

谢谢大家,请多指教!!!



META专栏主编

猴哥:Freescience公众号meta分析栏目现任主编。副主任医师,武汉大学肿瘤学博士,专注于胃肠道肿瘤分子生物学机制、系统评价/Meta分析、数据挖掘、临床统计研究。



科研路,不孤单!

Freescience医学科研联盟全国火热招募ing

50家高校及医院的小伙伴已经加入啦

具体点这里

想围观一篇SCI论文是怎样写成的吗?

Freescience线上沙龙之SCI论文合作呼唤你

具体点这里

FS科研软件库,集合50+医学科研必备神器,现在统统打包分享点这里


还有Freescience科研交流群


长按二维码加小秘书为好友


科学自由共享投稿请扔至freescience@zju.edu.cn

未经许可 不得转载长按二维码关注

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存