[R-meta] Antw: RE: Network Meta-analysis metafor

Caroline Woehl caroline.woehl at pg.hs-fulda.de
Thu Feb 15 21:54:15 CET 2018


Dear Wolfgang,

it works great, thanks a lot for that!

I've already created a forest plot and calculated some subgroups, for
example based on intervention duration or cognitive function at
baseline. Could you give me some advice on how to add two subgroups in
one forest plot? Is there any possibility?

Thanks again for your help.

Best regards,
Caroline

>>> "Viechtbauer Wolfgang (SP)"
<wolfgang.viechtbauer at maastrichtuniversity.nl> 14.02.18 13.16 Uhr >>>
Dear Caroline,

The example in help(dat.senn2013) uses mean differences to illustrate a
network MA with metafor but is easy to adjust to standardized mean
differences. For SMDs, you have to use a contrast-based model. The
dat.senn2013 dataset is given in an arm-based format, so it first needs
to be restructured. Note that Willms (1999) is the only multiarm study
in this dataset, but the code should work regardless of how many
multiarm studies there are. Just make sure that the 'reference'
treatment for multiarm studies always goes under 'trt1'.

library(metafor)

############################################################################

### load data
dat <- get(data(dat.senn2013, package="metafor"))

### restructure dataset to a contrast-based format
dat <- dat.senn2013[,c(1,4,3,2,5,6)]
dat.c <- lapply(split(dat, dat$study),
                function(x) cbind(x[rep(1,nrow(x)-1),], x[-1,c(3:6)]))
dat.c <- do.call(rbind, dat.c)
names(dat.c)[3:10] <- c("trt1", "n1i", "m1i", "sd1i", "trt2", "n2i",
"m2i", "sd2i")
rownames(dat.c) <- 1:nrow(dat.c)
dat.c$id <- 1:nrow(dat.c)
dat <- dat.c
rm(dat.c)

############################################################################

### make sure dataset is sorted by 'study'
dat <- dat[order(dat$study),]

### compute the total sample sizes of the studies
dat$Ni <- unlist(lapply(split(dat, dat$study), function(x) rep(x$n1i[1]
+ sum(x$n2i), each=nrow(x))))

### compute the pooled SDs of the studies
dat$sdpi <- unlist(lapply(split(dat, dat$study), function(x)
sqrt(((x$n1i[1]-1)*x$sd1i^2 + sum((x$n2i-1)*x$sd2i^2)) / ((x$n1i[1] - 1)
+ sum(x$n2i - 1)))))

### calculate SMDs and corresponding sampling variances
dat$yi <- with(dat, (m1i-m2i)/sdpi)
dat$vi <- with(dat, 1/n1i + 1/n2i + yi^2/(2*Ni))

### calculate the variance-covariance matrix of the SMDs for
multitreatment studies
calc.v <- function(x) {
   v <- matrix(1/x$n1i[1] + outer(x$yi, x$yi, "*")/(2*x$Ni[1]),
nrow=nrow(x), ncol=nrow(x))
   diag(v) <- x$vi
   v
}
V <- bldiag(lapply(split(dat, dat$study), calc.v))

### convert trt1 and trt2 variables to factors and set levels
lvls <- levels(factor(c(dat$trt1, dat$trt2)))
dat$trt1 <- factor(dat$trt1, levels=lvls)
dat$trt2 <- factor(dat$trt2, levels=lvls)

### create variables to indicate the contrasts examined
dat <- cbind(dat, model.matrix(~ dat$trt1 - 1) - model.matrix(~ dat$trt2
- 1))
names(dat)[(ncol(dat)-9):ncol(dat)] <- lvls

############################################################################

### 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 (placebo) becomes the reference level for the
treatment comparisons
res <- rma.mv(yi, V, mods = ~ acarbose + benfluorex + metformin +
miglitol + pioglitazone +
                              rosiglitazone + sitagliptin + sulfonylurea
+ vildagliptin - 1,
              random = ~ factor(id) | study, rho=1/2, data=dat)
res

### estimate/test all pairwise differences between treatments
### need 'multcomp' package for contrMat() function
library(multcomp)
contr <- contrMat(setNames(rep(1,res$p), colnames(res$X)), type="Tukey")
sav <- predict(res, newmods=contr)
sav[["slab"]] <- rownames(contr)
sav$pval <- anova(res, L=contr)$pval
sav

############################################################################

Two points:

1) Note that I am using the pooled SD of all arms within each trial to
compute the SMDs. That way, results within triIf you just use the pooled SD of each pairwise comparison, then this
won't be the case.

2) I see that you have the reference treatment listed under treat2. If
you want to use the code above, just rename your variables to: study
trt2 trt1 n2i m2i sd2i n1i m1i sd1i.

Best,
Wolfgang

-- 
Wolfgang Viechtbauer, Ph.D., Statistician | Department of Psychiatry and

Neuropsychology | Maastricht University | P.O. Box 616 (VIJV1) | 6200 MD

Maastricht, The Netherlands | +31 (43) 388-4170 | http://www.wvbauer.com


>-----Original Message-----
>From: R-sig-meta-analysis [mailto:r-sig-meta-analysis-bounces at r-
>project.org] On Behalf Of Caroline Woehl
>Sent: Wednesday, 14 February, 2018 8:45
>To: r-sig-meta-analysis at r-project.org
>Subject: [R-meta] Network Meta-analysis metafor
>
>Dear all,
>
>I've only calucated network meta-analyses with the package netmeta yet.
>Due to the possibility to calculate subgroup analyses, I'd like to have
>a try at a network meta-analysis with metafor.
>
>The analysis is based on 20 randomized controlled trials. They compare
>physical activity or cognitive activity with usual care. One of them is
>a multi-arm trial comparing physical and cognitive activity with usual
>care. I could extract sample size, mean und standard deviation
>(posttreatment) from each study arm. Thus, the file contains the study,
>treat1, treat2, n1i, m1i, sd1i, n2i, m2i and sd2i.
>
>Study                                                treat1      
treat2
>        n1i          m1i      sd1i        n2i          m2i       sd2i
>       1      physical activity    usual care     37   17,16    4,33
>36   15,17    4,48
>       2                    physical activity    usual care     39
>19,40    8,68    35   18,48    8,40
>       2                    cognitive activity   usual care    36
>19,98    8,16    35   18,48    8,40
>       3      cognitive activity usual care    35    42,34   9,30    33
>  44,49   9,53
>
>So far, I’ve calculated the standardized mean differences (yi) and
>variances (vi) for each pairwise comparison.
>nma <- escalc(measure="SMD", m1i=m1i, sd1i=sd1i, n1i=n1i, m2i=m2i,
>sd2i=sd2i, n2i=n2i, data=nma)
>
>How can I define usual care as the reference group in the next step?
>
>Many thanks for your help.
>
>Best regards,
>Caroline



More information about the R-sig-meta-analysis mailing list