### copy data into 'dat' and examine data
dat <- dat.lopez2019
dat[1:10,1:6]
if (FALSE) {
### load metafor package
library(metafor)
### create network graph ('igraph' package must be installed)
library(igraph, warn.conflicts=FALSE)
pairs <- data.frame(do.call(rbind,
sapply(split(dat$treatment, dat$study), function(x) t(combn(x,2)))), stringsAsFactors=FALSE)
pairs$X1 <- factor(pairs$X1, levels=sort(unique(dat$treatment)))
pairs$X2 <- factor(pairs$X2, levels=sort(unique(dat$treatment)))
tab <- table(pairs[,1], pairs[,2])
tab # adjacency matrix
g <- graph_from_adjacency_matrix(tab, mode = "plus", weighted=TRUE, diag=FALSE)
plot(g, edge.curved=FALSE, edge.width=E(g)$weight/2,
layout=layout_in_circle(g, order=c("Wait list", "No treatment", "TAU", "Multimedia CBT",
"Hybrid CBT", "F2F CBT", "Placebo")),
vertex.size=45, vertex.color="lightgray", vertex.label.color="black", vertex.label.font=2)
### restructure data into wide format
dat <- to.wide(dat, study="study", grp="treatment", ref="TAU",
grpvars=c("diff","se","n"), postfix=c("1","2"))
### compute contrasts between treatment pairs and corresponding sampling variances
dat$yi <- with(dat, diff1 - diff2)
dat$vi <- with(dat, se1^2 + se2^2)
### calculate the variance-covariance matrix for multitreatment studies
calc.v <- function(x) {
v <- matrix(x$se2[1]^2, nrow=nrow(x), ncol=nrow(x))
diag(v) <- x$vi
v
}
V <- bldiag(lapply(split(dat, dat$study), calc.v))
### add contrast matrix to the dataset
dat <- contrmat(dat, grp1="treatment1", grp2="treatment2")
### network meta-analysis using a contrast-based random-effects model
### by setting rho=1/2, tau^2 reflects the amount of heterogeneity for all treatment comparisons
### the treatment left out (TAU) becomes the reference level for the treatment comparisons
res <- rma.mv(yi, V, data=dat,
mods = ~ 0 + No.treatment + Wait.list + Placebo + F2F.CBT + Hybrid.CBT + Multimedia.CBT,
random = ~ comp | study, rho=1/2)
res
### forest plot of the contrast estimates (treatments versus TAU)
forest(coef(res), diag(vcov(res)), slab=sub(".", " ", names(coef(res)), fixed=TRUE),
xlim=c(-5,5), alim=c(-3,3), psize=1, header="Treatment",
xlab="Difference in Standardized Mean Change (compared to TAU)")
### fit random inconsistency effects model (might have to switch optimizer to get convergence)
res <- rma.mv(yi, V, data=dat,
mods = ~ 0 + No.treatment + Wait.list + Placebo + F2F.CBT + Hybrid.CBT + Multimedia.CBT,
random = list(~ comp | study, ~ comp | design), rho=1/2, phi=1/2,
control=list(optimizer="BFGS"))
res
}
Run the code above in your browser using DataLab