NMA for Dichotomous Outcomes

Justin Slater, Audrey Beliveau

2019-08-30

Data Preparation

data(thrombolytic)

age <- rnorm(nrow(thrombolytic), 60, 10)

dich.slr <- data.prep(arm.data = cbind(thrombolytic, age),
                     varname.t = "treatment",
                     varname.s = "study")

Feasibility Assessment

Network Plot

Generate Network Characteristics via net.tab()

Network Characteristics

network.char$network generates characteristics about the network, such as connectedness, number of treatments in the network, and in the case of a binomial outcome, the number of events in the network.

Characteristic Value
Number of Interventions 8
Number of Studies 28
Total Number of Patients in Network 146528
Total Possible Pairwise Comparisons 28
Total Number of Pairwise Comparisons With Direct Data 13
Is the network connected? TRUE
Number of Two-arm Studies 26
Number of Multi-Arms Studies 2
Total Number of Events in Network 12009
Number of Studies With No Zero Events 28
Number of Studies With At Least One Zero Event 0
Number of Studies with All Zero Events 0

Intervention Characteristics

network.char$intervention generates outcome and sample size data broken down by treatment.

treatment n.studies n.events n.patients min.outcome max.outcome av.outcome
ASPAC 9 1514 14769 0.0344828 0.1051332 0.1025120
AtPA 8 1565 24550 0.0217391 0.0838710 0.0637475
Ret 3 1034 13301 0.0414201 0.0901804 0.0777385
SK 16 4181 48650 0.0348837 0.1055878 0.0859404
SKtPA 2 729 10437 0.0550459 0.0700039 0.0698477
Ten 1 523 8461 0.0618130 0.0618130 0.0618130
tPA 13 2418 25405 0.0338983 0.1031573 0.0951781
UK 6 45 955 0.0353535 0.1296296 0.0471204

Comparison Characteristics

network.char$comparison generates outcome and sample size data broken down by treatment comparison.

comparison n.studies n.patients n.outcomes proportion
ASPAC vs. AtPA 2 706 38 0.0538244
ASPAC vs. SK 5 28324 2946 0.1040107
ASPAC vs. tPA 3 28027 2901 0.1035073
AtPA vs. Ret 2 15383 1133 0.0736527
AtPA vs. SK 1 30507 2124 0.0696234
AtPA vs. SKtPA 1 20672 1375 0.0665151
AtPA vs. Ten 1 16949 1045 0.0616556
AtPA vs. UK 2 698 37 0.0530086
Ret vs. SK 1 5986 555 0.0927163
SK vs. SKtPA 2 30707 2205 0.0718077
SK vs. tPA 8 49529 4762 0.0961457
SK vs. UK 1 401 17 0.0423940
tPA vs. UK 3 773 39 0.0504528

Main analysis

nma.model() creates BUGS code and that will be put into nma.run() and analysed through JAGS (Plummer 2017). The reference parameter indicates the name of the treatment that will be seen as the ‘referent’ comparator, this is often a placebo of some sort. In our case, it is streptokinase (“SK”). Since our outcome is dichotomous, and we are not interested in event rates, we are using the “binomial” family. In our case, we want to compare relative risks, so we are using the \(log\) link. If you are interested in using an odds ratio, set link="logit".

fixed_effects_model <- nma.model(data=dich.slr,
                     outcome="events",
                     N="sampleSize",
                     reference="SK",
                     family="binomial",
                     link="log",
                     effects="fixed")

random_effects_model <- nma.model(data=dich.slr,
                     outcome="events",
                     N="sampleSize",
                     reference="SK",
                     family="binomial",
                     link="log",
                     effects="random")

If you want to review or modify the BUGS code, you can review it by outputting cat(fixed_effects_model$bugs) and cat(random_effects_model$bugs).

The next step is to run the NMA model using nma.run(). Since we are working in a Bayesian framework, we need to specify the number of adaptations, burn-ins, and iterations. A description of Bayesian MCMC is omitted here, we direct the reader to any introductory text on Bayesian Modelling (Lunn et al. 2012).

set.seed(20190829)
fixed_effects_results <- nma.run(fixed_effects_model,
                           n.adapt=1000,
                           n.burnin=1000,
                           n.iter=10000)

random_effects_results <- nma.run(random_effects_model,
                           n.adapt=1000,
                           n.burnin=1000,
                           n.iter=10000)

Assess model fit

par(mfrow = c(1,2))
nma.fit(fixed_effects_results, main = "Fixed Effects Model" )
nma.fit(random_effects_results, main= "Random Effects Model")

Results

Check inconsistency

References

Lunn, David, Chris Jackson, Nicky Best, David Spiegelhalter, and Andrew Thomas. 2012. The Bugs Book: A Practical Introduction to Bayesian Analysis. Chapman; Hall/CRC.

Plummer, Martyn. 2017. JAGS Version 4.3.0 User Manual. http://people.stat.sc.edu/hansont/stat740/jags_user_manual.pdf.