Week 4, Session 3 — Network meta-analysis

Course 3 — #courses

Author

R. Heller

Note

Inference lab: Hypothesis → Visualise → Assumptions → Conduct → Conclude.

Learning objectives

  • Fit a network meta-analysis (NMA) using netmeta.
  • Draw and read the network graph.
  • Derive SUCRA rankings and interpret them cautiously.

Prerequisites

Pairwise meta-analysis (W4 S2).

Background

Network meta-analysis extends pairwise meta-analysis to more than two treatments by combining direct comparisons (from head-to-head trials) with indirect comparisons (inferred through a shared comparator). The central assumption is transitivity: the studies compared indirectly are exchangeable — no moderator distinguishes them in a way that systematically shifts the effect. The statistical analogue, consistency, checks whether direct and indirect estimates agree.

SUCRA (surface under the cumulative ranking curve) summarises each treatment’s rank distribution on a 0-1 scale, where 1 is best. SUCRA values compress a lot of uncertainty into a single number; they are useful for signalling but should be reported with interval estimates for every pairwise comparison.

Setup

library(tidyverse)
library(netmeta)
set.seed(42)
theme_set(theme_minimal(base_size = 12))

1. Hypothesis

H₀: all treatments in the network have equal efficacy. H₁: at least two differ.

2. Visualise

data(Senn2013)
head(Senn2013)
     TE   seTE   treat1.long treat2.long treat1 treat2           studlab
1 -1.90 0.1414     Metformin     Placebo   metf   plac      DeFronzo1995
2 -0.82 0.0992     Metformin     Placebo   metf   plac         Lewin2007
3 -0.20 0.3579     Metformin    Acarbose   metf   acar        Willms1999
4 -1.34 0.1435 Rosiglitazone     Placebo   rosi   plac      Davidson2007
5 -1.10 0.1141 Rosiglitazone     Placebo   rosi   plac Wolffenbuttel1999
6 -1.30 0.1268  Pioglitazone     Placebo   piog   plac        Kipnes2001
net <- netmeta(TE, seTE, treat1, treat2, studlab,
               data = Senn2013, sm = "MD",
               common = FALSE, random = TRUE,
               reference.group = "plac")
netgraph(net, plastic = FALSE, thickness = "number.of.studies",
         points = TRUE, cex.points = 2, cex = 0.8)

3. Assumptions

decomp.design(net)
Q statistics to assess homogeneity / consistency

                    Q df  p-value
Total           96.99 18 < 0.0001
Within designs  74.46 11 < 0.0001
Between designs 22.53  7   0.0021

Design-specific decomposition of within-designs Q statistic

    Design     Q df  p-value
 plac:metf 42.16  2 < 0.0001
 plac:rosi 21.27  5   0.0007
 plac:benf  4.38  1   0.0363
 plac:migl  6.45  2   0.0398
 metf:rosi  0.19  1   0.6655

Between-designs Q statistic after detaching of single designs
(influential designs have p-value markedly different from 0.0021)

 Detached design     Q df p-value
       rosi:sulf  6.77  6  0.3425
       metf:sulf  7.51  6  0.2760
       plac:rosi 16.29  6  0.0123
       metf:piog 17.13  6  0.0088
       plac:piog 17.25  6  0.0084
       plac:metf 22.07  6  0.0012
       plac:acar 22.44  6  0.0010
       piog:rosi 22.48  6  0.0010
       acar:sulf 22.52  6  0.0010
       metf:rosi 22.52  6  0.0010
  plac:acar:metf 22.38  5  0.0004

Q statistic to assess consistency under the assumption of
a full design-by-treatment interaction random effects model

                   Q df p-value tau.within tau2.within
Between designs 2.19  7  0.9483     0.3797      0.1442

The within-design heterogeneity and between-design inconsistency variances are the key diagnostics.

4. Conduct

summary(net)
Original data (with adjusted standard errors for multi-arm studies):

                   treat1 treat2      TE   seTE seTE.adj narms multiarm
DeFronzo1995         metf   plac -1.9000 0.1414   0.3588     2         
Lewin2007            metf   plac -0.8200 0.0992   0.3443     2         
Willms1999           acar   metf  0.2000 0.3579   0.5574     3        *
Davidson2007         plac   rosi  1.3400 0.1435   0.3596     2         
Wolffenbuttel1999    plac   rosi  1.1000 0.1141   0.3489     2         
Kipnes2001           piog   plac -1.3000 0.1268   0.3533     2         
Kerenyi2004          plac   rosi  0.7700 0.1078   0.3469     2         
Hanefeld2004         metf   piog -0.1600 0.0849   0.3405     2         
Derosa2004           piog   rosi  0.1000 0.1831   0.3772     2         
Baksi2004            plac   rosi  1.3000 0.1014   0.3450     2         
Rosenstock2008       plac   rosi  1.0900 0.2263   0.3999     2         
Zhu2003              plac   rosi  1.5000 0.1624   0.3675     2         
Yang2003             metf   rosi  0.1400 0.2239   0.3986     2         
Vongthavaravat2002   rosi   sulf -1.2000 0.1436   0.3596     2         
Oyama2008            acar   sulf -0.4000 0.1549   0.3643     2         
Costa1997            acar   plac -0.8000 0.1432   0.3595     2         
Hermansen2007        plac   sita  0.5700 0.1291   0.3541     2         
Garber2008           plac   vild  0.7000 0.1273   0.3534     2         
Alex1998             metf   sulf -0.3700 0.1184   0.3503     2         
Johnston1994         migl   plac -0.7400 0.1839   0.3775     2         
Johnston1998a        migl   plac -1.4100 0.2235   0.3983     2         
Kim2007              metf   rosi -0.0000 0.2339   0.4043     2         
Johnston1998b        migl   plac -0.6800 0.2828   0.4344     2         
Gonzalez-Ortiz2004   metf   plac -0.4000 0.4356   0.5463     2         
Stucci1996           benf   plac -0.2300 0.3467   0.4785     2         
Moulin2006           benf   plac -1.0100 0.1366   0.3569     2         
Willms1999           metf   plac -1.2000 0.3758   0.5802     3        *
Willms1999           acar   plac -1.0000 0.4669   0.8122     3        *

Number of treatment arms per study (by decreasing number of arms):
                   narms multiarm
Willms1999             3        *
DeFronzo1995           2         
Lewin2007              2         
Davidson2007           2         
Wolffenbuttel1999      2         
Kipnes2001             2         
Kerenyi2004            2         
Hanefeld2004           2         
Derosa2004             2         
Baksi2004              2         
Rosenstock2008         2         
Zhu2003                2         
Yang2003               2         
Vongthavaravat2002     2         
Oyama2008              2         
Costa1997              2         
Hermansen2007          2         
Garber2008             2         
Alex1998               2         
Johnston1994           2         
Johnston1998a          2         
Kim2007                2         
Johnston1998b          2         
Gonzalez-Ortiz2004     2         
Stucci1996             2         
Moulin2006             2         

Results (random effects model):

                   treat1 treat2      MD             95%-CI
DeFronzo1995         metf   plac -1.1268 [-1.4291; -0.8244]
Lewin2007            metf   plac -1.1268 [-1.4291; -0.8244]
Willms1999           acar   metf  0.2850 [-0.2208;  0.7908]
Davidson2007         plac   rosi  1.2335 [ 0.9830;  1.4839]
Wolffenbuttel1999    plac   rosi  1.2335 [ 0.9830;  1.4839]
Kipnes2001           piog   plac -1.1291 [-1.5596; -0.6986]
Kerenyi2004          plac   rosi  1.2335 [ 0.9830;  1.4839]
Hanefeld2004         metf   piog  0.0023 [-0.4398;  0.4444]
Derosa2004           piog   rosi  0.1044 [-0.3347;  0.5435]
Baksi2004            plac   rosi  1.2335 [ 0.9830;  1.4839]
Rosenstock2008       plac   rosi  1.2335 [ 0.9830;  1.4839]
Zhu2003              plac   rosi  1.2335 [ 0.9830;  1.4839]
Yang2003             metf   rosi  0.1067 [-0.2170;  0.4304]
Vongthavaravat2002   rosi   sulf -0.8169 [-1.2817; -0.3521]
Oyama2008            acar   sulf -0.4252 [-0.9456;  0.0951]
Costa1997            acar   plac -0.8418 [-1.3236; -0.3600]
Hermansen2007        plac   sita  0.5700 [-0.1240;  1.2640]
Garber2008           plac   vild  0.7000 [ 0.0073;  1.3927]
Alex1998             metf   sulf -0.7102 [-1.1713; -0.2491]
Johnston1994         migl   plac -0.9497 [-1.4040; -0.4955]
Johnston1998a        migl   plac -0.9497 [-1.4040; -0.4955]
Kim2007              metf   rosi  0.1067 [-0.2170;  0.4304]
Johnston1998b        migl   plac -0.9497 [-1.4040; -0.4955]
Gonzalez-Ortiz2004   metf   plac -1.1268 [-1.4291; -0.8244]
Stucci1996           benf   plac -0.7311 [-1.2918; -0.1705]
Moulin2006           benf   plac -0.7311 [-1.2918; -0.1705]
Willms1999           metf   plac -1.1268 [-1.4291; -0.8244]
Willms1999           acar   plac -0.8418 [-1.3236; -0.3600]

Number of studies: k = 26
Number of pairwise comparisons: m = 28
Number of treatments: n = 10
Number of designs: d = 15

Random effects model

Treatment estimate (other treatments vs 'plac'):
          MD             95%-CI     z  p-value
acar -0.8418 [-1.3236; -0.3600] -3.42   0.0006
benf -0.7311 [-1.2918; -0.1705] -2.56   0.0106
metf -1.1268 [-1.4291; -0.8244] -7.30 < 0.0001
migl -0.9497 [-1.4040; -0.4955] -4.10 < 0.0001
piog -1.1291 [-1.5596; -0.6986] -5.14 < 0.0001
plac       .                  .     .        .
rosi -1.2335 [-1.4839; -0.9830] -9.65 < 0.0001
sita -0.5700 [-1.2640;  0.1240] -1.61   0.1075
sulf -0.4166 [-0.8887;  0.0556] -1.73   0.0838
vild -0.7000 [-1.3927; -0.0073] -1.98   0.0476

Quantifying heterogeneity / inconsistency:
tau^2 = 0.1087; tau = 0.3297; I^2 = 81.4% [72.0%; 87.7%]

Tests of heterogeneity (within designs) and inconsistency (between designs):
                    Q d.f.  p-value
Total           96.99   18 < 0.0001
Within designs  74.46   11 < 0.0001
Between designs 22.53    7   0.0021

Details of network meta-analysis methods:
- Frequentist graph-theoretical approach
- DerSimonian-Laird estimator for tau^2
- Calculation of I^2 based on Q
rank_df <- netrank(net, small.values = "good")
rank_df
     P-score
rosi  0.8934
metf  0.7818
piog  0.7746
migl  0.6137
acar  0.5203
benf  0.4358
vild  0.4232
sita  0.3331
sulf  0.2103
plac  0.0139

5. Concluding statement

In a network meta-analysis of 10 treatments across 26 studies (28 pairwise comparisons), the treatment with the highest SUCRA for HbA1c lowering was rosi (SUCRA = 0.89). SUCRA rankings should be interpreted alongside the pairwise effect estimates and their intervals, not as a standalone conclusion.

Remind the audience that SUCRA rankings are heavily influenced by studies with sparse networks and that “best on SUCRA” is not the same as “best by pairwise CI”.

Common pitfalls

  • Treating SUCRA as if it were the effect size.
  • Ignoring the transitivity assumption because the output compiled.
  • Mixing direct and indirect evidence without quantifying inconsistency.

Further reading

  • Rücker G, Schwarzer G. (2015). Ranking treatments in frequentist network meta-analysis.
  • Salanti G. (2012). Indirect and mixed-treatment comparison…

Session info

sessionInfo()
R version 4.4.1 (2024-06-14)
Platform: x86_64-pc-linux-gnu
Running under: Ubuntu 24.04.4 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so;  LAPACK version 3.12.0

locale:
 [1] LC_CTYPE=C.UTF-8       LC_NUMERIC=C           LC_TIME=C.UTF-8       
 [4] LC_COLLATE=C.UTF-8     LC_MONETARY=C.UTF-8    LC_MESSAGES=C.UTF-8   
 [7] LC_PAPER=C.UTF-8       LC_NAME=C              LC_ADDRESS=C          
[10] LC_TELEPHONE=C         LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C   

time zone: UTC
tzcode source: system (glibc)

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] netmeta_3.4-0   meta_8.3-0      metadat_1.6-0   metabook_0.2-0 
 [5] lubridate_1.9.5 forcats_1.0.1   stringr_1.6.0   dplyr_1.2.1    
 [9] purrr_1.2.2     readr_2.2.0     tidyr_1.3.2     tibble_3.3.1   
[13] ggplot2_4.0.3   tidyverse_2.0.0

loaded via a namespace (and not attached):
 [1] gtable_0.3.6        xfun_0.57           htmlwidgets_1.6.4  
 [4] CompQuadForm_1.4.4  lattice_0.22-6      mathjaxr_2.0-0     
 [7] tzdb_0.5.0          numDeriv_2016.8-1.1 vctrs_0.7.3        
[10] tools_4.4.1         Rdpack_2.6.6        generics_0.1.4     
[13] pkgconfig_2.0.3     Matrix_1.7-0        RColorBrewer_1.1-3 
[16] S7_0.2.2            lifecycle_1.0.5     compiler_4.4.1     
[19] farver_2.1.2        htmltools_0.5.9     yaml_2.3.12        
[22] pillar_1.11.1       nloptr_2.2.1        MASS_7.3-60.2      
[25] reformulas_0.4.4    abind_1.4-8         boot_1.3-30        
[28] nlme_3.1-164        tidyselect_1.2.1    digest_0.6.39      
[31] mvtnorm_1.3-7       stringi_1.8.7       splines_4.4.1      
[34] magic_1.6-1         fastmap_1.2.0       grid_4.4.1         
[37] colorspace_2.1-2    cli_3.6.6           metafor_5.0-1      
[40] magrittr_2.0.5      withr_3.0.2         scales_1.4.0       
[43] timechange_0.4.0    rmarkdown_2.31      igraph_2.3.1       
[46] otel_0.2.0          lme4_2.0-1          hms_1.1.4          
[49] evaluate_1.0.5      knitr_1.51          rbibutils_2.4.1    
[52] rlang_1.2.0         Rcpp_1.1.1-1.1      glue_1.8.1         
[55] xml2_1.5.2          minqa_1.2.8         jsonlite_2.0.0     
[58] R6_2.6.1