Skip to contents
library(multinma)
options(mc.cores = parallel::detectCores())
#> For execution on a local, multicore CPU with excess RAM we recommend calling
#> options(mc.cores = parallel::detectCores())
#> 
#> Attaching package: 'multinma'
#> The following objects are masked from 'package:stats':
#> 
#>     dgamma, pgamma, qgamma

This vignette describes the analysis of 50 trials of 8 thrombolytic drugs (streptokinase, SK; alteplase, t-PA; accelerated alteplase, Acc t-PA; streptokinase plus alteplase, SK+tPA; reteplase, r-PA; tenocteplase, TNK; urokinase, UK; anistreptilase, ASPAC) plus per-cutaneous transluminal coronary angioplasty (PTCA) (Boland et al. 2003; Lu and Ades 2006; Dias et al. 2011, 2010). The number of deaths in 30 or 35 days following acute myocardial infarction are recorded. The data are available in this package as thrombolytics:

head(thrombolytics)
#>   studyn trtn      trtc    r     n
#> 1      1    1        SK 1472 20251
#> 2      1    3  Acc t-PA  652 10396
#> 3      1    4 SK + t-PA  723 10374
#> 4      2    1        SK    9   130
#> 5      2    2      t-PA    6   123
#> 6      3    1        SK    5    63

Setting up the network

We begin by setting up the network. We have arm-level count data giving the number of deaths (r) out of the total (n) in each arm, so we use the function set_agd_arm(). By default, SK is set as the network reference treatment.

thrombo_net <- set_agd_arm(thrombolytics, 
                           study = studyn,
                           trt = trtc,
                           r = r, 
                           n = n)
thrombo_net
#> A network with 50 AgD studies (arm-based).
#> 
#> ------------------------------------------------------- AgD studies (arm-based) ---- 
#>  Study Treatment arms              
#>  1     3: SK | Acc t-PA | SK + t-PA
#>  2     2: SK | t-PA                
#>  3     2: SK | t-PA                
#>  4     2: SK | t-PA                
#>  5     2: SK | t-PA                
#>  6     3: SK | ASPAC | t-PA        
#>  7     2: SK | t-PA                
#>  8     2: SK | t-PA                
#>  9     2: SK | t-PA                
#>  10    2: SK | SK + t-PA           
#>  ... plus 40 more studies
#> 
#>  Outcome type: count
#> ------------------------------------------------------------------------------------
#> Total number of treatments: 9
#> Total number of studies: 50
#> Reference treatment is: SK
#> Network is connected

Plot the network structure.

plot(thrombo_net, weight_edges = TRUE, weight_nodes = TRUE)

Fixed effects NMA

Following TSD 4 (Dias et al. 2011), we fit a fixed effects NMA model, using the nma() function with trt_effects = "fixed". We use \(\mathrm{N}(0, 100^2)\) prior distributions for the treatment effects \(d_k\) and study-specific intercepts \(\mu_j\). We can examine the range of parameter values implied by these prior distributions with the summary() method:

summary(normal(scale = 100))
#> A Normal prior distribution: location = 0, scale = 100.
#> 50% of the prior density lies between -67.45 and 67.45.
#> 95% of the prior density lies between -196 and 196.

The model is fitted using the nma() function. By default, this will use a Binomial likelihood and a logit link function, auto-detected from the data.

thrombo_fit <- nma(thrombo_net, 
                   trt_effects = "fixed",
                   prior_intercept = normal(scale = 100),
                   prior_trt = normal(scale = 100))
#> Note: Setting "SK" as the network reference treatment.

Basic parameter summaries are given by the print() method:

thrombo_fit
#> A fixed effects NMA with a binomial likelihood (logit link).
#> Inference for Stan model: binomial_1par.
#> 4 chains, each with iter=2000; warmup=1000; thin=1; 
#> post-warmup draws per chain=1000, total post-warmup draws=4000.
#> 
#>                   mean se_mean   sd      2.5%       25%       50%       75%     97.5% n_eff
#> d[Acc t-PA]      -0.18    0.00 0.04     -0.26     -0.21     -0.18     -0.15     -0.09  2760
#> d[ASPAC]          0.02    0.00 0.04     -0.06     -0.01      0.02      0.04      0.09  5923
#> d[PTCA]          -0.48    0.00 0.10     -0.67     -0.54     -0.48     -0.41     -0.28  4065
#> d[r-PA]          -0.12    0.00 0.06     -0.24     -0.16     -0.12     -0.08      0.00  3931
#> d[SK + t-PA]     -0.05    0.00 0.05     -0.14     -0.08     -0.05     -0.02      0.04  5710
#> d[t-PA]           0.00    0.00 0.03     -0.06     -0.02      0.00      0.02      0.06  5374
#> d[TNK]           -0.17    0.00 0.08     -0.32     -0.22     -0.17     -0.12     -0.02  4421
#> d[UK]            -0.20    0.00 0.22     -0.64     -0.35     -0.20     -0.06      0.23  5063
#> lp__         -43042.80    0.14 5.48 -43054.54 -43046.38 -43042.43 -43039.00 -43033.13  1514
#>              Rhat
#> d[Acc t-PA]     1
#> d[ASPAC]        1
#> d[PTCA]         1
#> d[r-PA]         1
#> d[SK + t-PA]    1
#> d[t-PA]         1
#> d[TNK]          1
#> d[UK]           1
#> lp__            1
#> 
#> Samples were drawn using NUTS(diag_e) at Wed Mar  6 13:34:20 2024.
#> For each parameter, n_eff is a crude measure of effective sample size,
#> and Rhat is the potential scale reduction factor on split chains (at 
#> convergence, Rhat=1).

By default, summaries of the study-specific intercepts \(\mu_j\) are hidden, but could be examined by changing the pars argument:

# Not run
print(thrombo_fit, pars = c("d", "mu"))

The prior and posterior distributions can be compared visually using the plot_prior_posterior() function:

plot_prior_posterior(thrombo_fit, prior = "trt")

Model fit can be checked using the dic() function

(dic_consistency <- dic(thrombo_fit))
#> Residual deviance: 105.8 (on 102 data points)
#>                pD: 58.6
#>               DIC: 164.4

and the residual deviance contributions examined with the corresponding plot() method.

plot(dic_consistency)

There are a number of points which are not very well fit by the model, having posterior mean residual deviance contributions greater than 1.

Checking for inconsistency

Note: The results of the inconsistency models here are slightly different to those of Dias et al. (2010, 2011), although the overall conclusions are the same. This is due to the presence of multi-arm trials and a different ordering of treatments, meaning that inconsistency is parameterised differently within the multi-arm trials. The same results as Dias et al. are obtained if the network is instead set up with trtn as the treatment variable.

Unrelated mean effects model

We first fit an unrelated mean effects (UME) model (Dias et al. 2011) to assess the consistency assumption. Again, we use the function nma(), but now with the argument consistency = "ume".

thrombo_fit_ume <- nma(thrombo_net, 
                       consistency = "ume",
                       trt_effects = "fixed",
                       prior_intercept = normal(scale = 100),
                       prior_trt = normal(scale = 100))
#> Note: Setting "SK" as the network reference treatment.
thrombo_fit_ume
#> A fixed effects NMA with a binomial likelihood (logit link).
#> An inconsistency model ('ume') was fitted.
#> Inference for Stan model: binomial_1par.
#> 4 chains, each with iter=2000; warmup=1000; thin=1; 
#> post-warmup draws per chain=1000, total post-warmup draws=4000.
#> 
#>                            mean se_mean   sd      2.5%       25%       50%       75%     97.5%
#> d[Acc t-PA vs. SK]        -0.16    0.00 0.05     -0.25     -0.19     -0.16     -0.12     -0.06
#> d[ASPAC vs. SK]            0.01    0.00 0.04     -0.07     -0.02      0.01      0.03      0.08
#> d[PTCA vs. SK]            -0.67    0.00 0.18     -1.02     -0.79     -0.67     -0.54     -0.32
#> d[r-PA vs. SK]            -0.06    0.00 0.09     -0.23     -0.12     -0.06      0.00      0.11
#> d[SK + t-PA vs. SK]       -0.04    0.00 0.05     -0.14     -0.08     -0.04     -0.01      0.05
#> d[t-PA vs. SK]             0.00    0.00 0.03     -0.06     -0.02      0.00      0.02      0.06
#> d[UK vs. SK]              -0.37    0.01 0.52     -1.41     -0.73     -0.36     -0.01      0.62
#> d[ASPAC vs. Acc t-PA]      1.40    0.01 0.41      0.64      1.12      1.39      1.67      2.27
#> d[PTCA vs. Acc t-PA]      -0.22    0.00 0.12     -0.45     -0.30     -0.22     -0.13      0.01
#> d[r-PA vs. Acc t-PA]       0.02    0.00 0.07     -0.11     -0.03      0.02      0.06      0.15
#> d[TNK vs. Acc t-PA]        0.00    0.00 0.06     -0.12     -0.04      0.01      0.05      0.13
#> d[UK vs. Acc t-PA]         0.14    0.01 0.35     -0.54     -0.09      0.13      0.38      0.85
#> d[t-PA vs. ASPAC]          0.30    0.01 0.36     -0.40      0.05      0.30      0.53      1.02
#> d[t-PA vs. PTCA]           0.55    0.01 0.41     -0.24      0.27      0.54      0.81      1.37
#> d[UK vs. t-PA]            -0.30    0.00 0.35     -1.00     -0.53     -0.29     -0.06      0.38
#> lp__                  -43039.57    0.15 5.79 -43051.95 -43043.42 -43039.20 -43035.40 -43029.49
#>                       n_eff Rhat
#> d[Acc t-PA vs. SK]     5993    1
#> d[ASPAC vs. SK]        4623    1
#> d[PTCA vs. SK]         5222    1
#> d[r-PA vs. SK]         4753    1
#> d[SK + t-PA vs. SK]    5823    1
#> d[t-PA vs. SK]         4145    1
#> d[UK vs. SK]           5509    1
#> d[ASPAC vs. Acc t-PA]  3506    1
#> d[PTCA vs. Acc t-PA]   4085    1
#> d[r-PA vs. Acc t-PA]   4229    1
#> d[TNK vs. Acc t-PA]    5760    1
#> d[UK vs. Acc t-PA]     4009    1
#> d[t-PA vs. ASPAC]      4722    1
#> d[t-PA vs. PTCA]       3925    1
#> d[UK vs. t-PA]         5219    1
#> lp__                   1530    1
#> 
#> Samples were drawn using NUTS(diag_e) at Wed Mar  6 13:34:31 2024.
#> For each parameter, n_eff is a crude measure of effective sample size,
#> and Rhat is the potential scale reduction factor on split chains (at 
#> convergence, Rhat=1).

Comparing the model fit statistics

dic_consistency
#> Residual deviance: 105.8 (on 102 data points)
#>                pD: 58.6
#>               DIC: 164.4
(dic_ume <- dic(thrombo_fit_ume))
#> Residual deviance: 99.3 (on 102 data points)
#>                pD: 65.6
#>               DIC: 164.9

Whilst the UME model fits the data better, having a lower residual deviance, the additional parameters in the UME model mean that the DIC is very similar between both models. However, it is also important to examine the individual contributions to model fit of each data point under the two models (a so-called “dev-dev” plot). Passing two nma_dic objects produced by the dic() function to the plot() method produces this dev-dev plot:

plot(dic_consistency, dic_ume, show_uncertainty = FALSE)

The four points lying in the lower right corner of the plot have much lower posterior mean residual deviance under the UME model, indicating that these data are potentially inconsistent. These points correspond to trials 44 and 45, the only two trials comparing Acc t-PA to ASPAC. The ASPAC vs. Acc t-PA estimates are very different under the consistency model and inconsistency (UME) model, suggesting that these two trials may be systematically different from the others in the network.

Node-splitting

Another method for assessing inconsistency is node-splitting (Dias et al. 2011, 2010). Whereas the UME model assesses inconsistency globally, node-splitting assesses inconsistency locally for each potentially inconsistent comparison (those with both direct and indirect evidence) in turn.

Node-splitting can be performed using the nma() function with the argument consistency = "nodesplit". By default, all possible comparisons will be split (as determined by the get_nodesplits() function). Alternatively, a specific comparison or comparisons to split can be provided to the nodesplit argument.

thrombo_nodesplit <- nma(thrombo_net, 
                         consistency = "nodesplit",
                         trt_effects = "fixed",
                         prior_intercept = normal(scale = 100),
                         prior_trt = normal(scale = 100))
#> Fitting model 1 of 15, node-split: Acc t-PA vs. SK
#> Note: Setting "SK" as the network reference treatment.
#> Fitting model 2 of 15, node-split: ASPAC vs. SK
#> Note: Setting "SK" as the network reference treatment.
#> Fitting model 3 of 15, node-split: PTCA vs. SK
#> Note: Setting "SK" as the network reference treatment.
#> Fitting model 4 of 15, node-split: r-PA vs. SK
#> Note: Setting "SK" as the network reference treatment.
#> Fitting model 5 of 15, node-split: t-PA vs. SK
#> Note: Setting "SK" as the network reference treatment.
#> Fitting model 6 of 15, node-split: UK vs. SK
#> Note: Setting "SK" as the network reference treatment.
#> Fitting model 7 of 15, node-split: ASPAC vs. Acc t-PA
#> Note: Setting "SK" as the network reference treatment.
#> Fitting model 8 of 15, node-split: PTCA vs. Acc t-PA
#> Note: Setting "SK" as the network reference treatment.
#> Fitting model 9 of 15, node-split: r-PA vs. Acc t-PA
#> Note: Setting "SK" as the network reference treatment.
#> Fitting model 10 of 15, node-split: SK + t-PA vs. Acc t-PA
#> Note: Setting "SK" as the network reference treatment.
#> Fitting model 11 of 15, node-split: UK vs. Acc t-PA
#> Note: Setting "SK" as the network reference treatment.
#> Fitting model 12 of 15, node-split: t-PA vs. ASPAC
#> Note: Setting "SK" as the network reference treatment.
#> Fitting model 13 of 15, node-split: t-PA vs. PTCA
#> Note: Setting "SK" as the network reference treatment.
#> Fitting model 14 of 15, node-split: UK vs. t-PA
#> Note: Setting "SK" as the network reference treatment.
#> Fitting model 15 of 15, consistency model
#> Note: Setting "SK" as the network reference treatment.

The summary() method summarises the node-splitting results, displaying the direct and indirect estimates \(d_\mathrm{dir}\) and \(d_\mathrm{ind}\) from each node-split model, the network estimate \(d_\mathrm{net}\) from the consistency model, the inconsistency factor \(\omega = d_\mathrm{dir} - d_\mathrm{ind}\), and a Bayesian \(p\)-value for inconsistency on each comparison. The DIC model fit statistics are also provided. (If a random effects model was fitted, the heterogeneity standard deviation \(\tau\) under each node-split model and under the consistency model would also be displayed.)

summary(thrombo_nodesplit)
#> Node-splitting models fitted for 14 comparisons.
#> 
#> ---------------------------------------------------- Node-split Acc t-PA vs. SK ---- 
#> 
#>        mean   sd  2.5%   25%   50%   75% 97.5% Bulk_ESS Tail_ESS Rhat
#> d_net -0.18 0.04 -0.26 -0.20 -0.18 -0.15 -0.09     2540     3148 1.00
#> d_dir -0.16 0.05 -0.26 -0.19 -0.16 -0.12 -0.06     4404     3826 1.00
#> d_ind -0.24 0.09 -0.42 -0.31 -0.24 -0.18 -0.07      610     1376 1.01
#> omega  0.09 0.10 -0.12  0.02  0.09  0.15  0.29      722     1816 1.01
#> 
#> Residual deviance: 106 (on 102 data points)
#>                pD: 59.5
#>               DIC: 165.5
#> 
#> Bayesian p-value: 0.39
#> 
#> ------------------------------------------------------- Node-split ASPAC vs. SK ---- 
#> 
#>        mean   sd  2.5%   25%   50%   75% 97.5% Bulk_ESS Tail_ESS Rhat
#> d_net  0.02 0.04 -0.06 -0.01  0.02  0.04  0.09     5967     3467    1
#> d_dir  0.01 0.04 -0.07 -0.02  0.01  0.03  0.08     4326     3410    1
#> d_ind  0.42 0.25 -0.06  0.25  0.41  0.58  0.91     2588     2561    1
#> omega -0.41 0.25 -0.91 -0.57 -0.41 -0.24  0.07     2672     2718    1
#> 
#> Residual deviance: 104.2 (on 102 data points)
#>                pD: 59.6
#>               DIC: 163.8
#> 
#> Bayesian p-value: 0.1
#> 
#> -------------------------------------------------------- Node-split PTCA vs. SK ---- 
#> 
#>        mean   sd  2.5%   25%   50%   75% 97.5% Bulk_ESS Tail_ESS Rhat
#> d_net -0.47 0.10 -0.68 -0.54 -0.48 -0.40 -0.27     4536     3325    1
#> d_dir -0.66 0.19 -1.04 -0.79 -0.66 -0.54 -0.29     5841     3688    1
#> d_ind -0.40 0.12 -0.63 -0.48 -0.40 -0.32 -0.17     3887     3660    1
#> omega -0.27 0.22 -0.72 -0.42 -0.26 -0.12  0.17     4401     3512    1
#> 
#> Residual deviance: 105.2 (on 102 data points)
#>                pD: 59.5
#>               DIC: 164.7
#> 
#> Bayesian p-value: 0.22
#> 
#> -------------------------------------------------------- Node-split r-PA vs. SK ---- 
#> 
#>        mean   sd  2.5%   25%   50%   75% 97.5% Bulk_ESS Tail_ESS Rhat
#> d_net -0.12 0.06 -0.24 -0.16 -0.13 -0.08 -0.01     3698     3326    1
#> d_dir -0.06 0.09 -0.25 -0.12 -0.06  0.00  0.11     5016     3541    1
#> d_ind -0.18 0.08 -0.33 -0.23 -0.18 -0.12 -0.02     2421     3385    1
#> omega  0.12 0.12 -0.12  0.04  0.12  0.20  0.35     2909     3292    1
#> 
#> Residual deviance: 106.2 (on 102 data points)
#>                pD: 59.9
#>               DIC: 166.2
#> 
#> Bayesian p-value: 0.34
#> 
#> -------------------------------------------------------- Node-split t-PA vs. SK ---- 
#> 
#>        mean   sd  2.5%   25%   50%   75% 97.5% Bulk_ESS Tail_ESS Rhat
#> d_net  0.00 0.03 -0.06 -0.02  0.00  0.02  0.06     5010     3566    1
#> d_dir  0.00 0.03 -0.06 -0.02  0.00  0.02  0.06     3309     3300    1
#> d_ind  0.19 0.23 -0.25  0.04  0.19  0.35  0.64     1057     1796    1
#> omega -0.19 0.23 -0.65 -0.35 -0.19 -0.03  0.25     1088     2031    1
#> 
#> Residual deviance: 105.9 (on 102 data points)
#>                pD: 59.4
#>               DIC: 165.3
#> 
#> Bayesian p-value: 0.41
#> 
#> ---------------------------------------------------------- Node-split UK vs. SK ---- 
#> 
#>        mean   sd  2.5%   25%   50%   75% 97.5% Bulk_ESS Tail_ESS Rhat
#> d_net -0.20 0.22 -0.63 -0.35 -0.20 -0.05  0.24     4712     3165    1
#> d_dir -0.39 0.53 -1.44 -0.74 -0.37 -0.01  0.61     6044     3449    1
#> d_ind -0.17 0.24 -0.63 -0.34 -0.17 -0.01  0.30     3998     3484    1
#> omega -0.21 0.57 -1.40 -0.61 -0.20  0.17  0.88     5322     3506    1
#> 
#> Residual deviance: 107.1 (on 102 data points)
#>                pD: 60
#>               DIC: 167
#> 
#> Bayesian p-value: 0.72
#> 
#> ------------------------------------------------- Node-split ASPAC vs. Acc t-PA ---- 
#> 
#>       mean   sd 2.5%  25%  50%  75% 97.5% Bulk_ESS Tail_ESS Rhat
#> d_net 0.19 0.06 0.08 0.15 0.19 0.23  0.30     3583     3514    1
#> d_dir 1.41 0.41 0.64 1.13 1.40 1.68  2.24     4007     3178    1
#> d_ind 0.16 0.06 0.05 0.13 0.17 0.20  0.28     3550     3595    1
#> omega 1.25 0.41 0.47 0.97 1.24 1.52  2.09     3866     3232    1
#> 
#> Residual deviance: 97 (on 102 data points)
#>                pD: 59.9
#>               DIC: 157
#> 
#> Bayesian p-value: <0.01
#> 
#> -------------------------------------------------- Node-split PTCA vs. Acc t-PA ---- 
#> 
#>        mean   sd  2.5%   25%   50%   75% 97.5% Bulk_ESS Tail_ESS Rhat
#> d_net -0.30 0.10 -0.49 -0.37 -0.30 -0.23 -0.11     5432     3387    1
#> d_dir -0.22 0.12 -0.46 -0.30 -0.22 -0.14  0.02     4277     3403    1
#> d_ind -0.47 0.17 -0.81 -0.58 -0.47 -0.35 -0.16     3129     3109    1
#> omega  0.26 0.21 -0.14  0.11  0.25  0.39  0.66     3028     2866    1
#> 
#> Residual deviance: 105.1 (on 102 data points)
#>                pD: 59.5
#>               DIC: 164.6
#> 
#> Bayesian p-value: 0.21
#> 
#> -------------------------------------------------- Node-split r-PA vs. Acc t-PA ---- 
#> 
#>        mean   sd  2.5%   25%   50%   75% 97.5% Bulk_ESS Tail_ESS Rhat
#> d_net  0.05 0.05 -0.05  0.02  0.05  0.09  0.16     5710     3445    1
#> d_dir  0.02 0.07 -0.11 -0.03  0.02  0.06  0.15     4875     3717    1
#> d_ind  0.13 0.10 -0.06  0.06  0.13  0.20  0.33     1681     2266    1
#> omega -0.11 0.12 -0.34 -0.20 -0.12 -0.04  0.13     1622     2381    1
#> 
#> Residual deviance: 106.2 (on 102 data points)
#>                pD: 59.9
#>               DIC: 166.2
#> 
#> Bayesian p-value: 0.34
#> 
#> --------------------------------------------- Node-split SK + t-PA vs. Acc t-PA ---- 
#> 
#>        mean   sd  2.5%   25%   50%   75% 97.5% Bulk_ESS Tail_ESS Rhat
#> d_net  0.13 0.05  0.03  0.09  0.13  0.16  0.23     5169     2976    1
#> d_dir  0.13 0.05  0.03  0.09  0.13  0.16  0.23     3402     3584    1
#> d_ind  0.62 0.71 -0.70  0.14  0.61  1.09  2.08     2582     2055    1
#> omega -0.50 0.71 -1.95 -0.96 -0.48 -0.02  0.85     2567     2038    1
#> 
#> Residual deviance: 106.9 (on 102 data points)
#>                pD: 60.2
#>               DIC: 167.1
#> 
#> Bayesian p-value: 0.48
#> 
#> ---------------------------------------------------- Node-split UK vs. Acc t-PA ---- 
#> 
#>        mean   sd  2.5%   25%   50%  75% 97.5% Bulk_ESS Tail_ESS Rhat
#> d_net -0.02 0.22 -0.45 -0.18 -0.02 0.13  0.41     4872     3174    1
#> d_dir  0.14 0.36 -0.53 -0.10  0.13 0.38  0.85     4488     3522    1
#> d_ind -0.14 0.29 -0.71 -0.33 -0.14 0.06  0.43     3626     3146    1
#> omega  0.28 0.46 -0.62 -0.02  0.28 0.59  1.17     3587     3075    1
#> 
#> Residual deviance: 107.1 (on 102 data points)
#>                pD: 60.2
#>               DIC: 167.3
#> 
#> Bayesian p-value: 0.53
#> 
#> ----------------------------------------------------- Node-split t-PA vs. ASPAC ---- 
#> 
#>        mean   sd  2.5%   25%   50%   75% 97.5% Bulk_ESS Tail_ESS Rhat
#> d_net -0.01 0.04 -0.08 -0.04 -0.01  0.01  0.06     7274     3513    1
#> d_dir -0.02 0.04 -0.10 -0.05 -0.02  0.00  0.05     4912     3121    1
#> d_ind  0.02 0.06 -0.10 -0.02  0.03  0.07  0.15     3211     3061    1
#> omega -0.05 0.06 -0.17 -0.09 -0.05 -0.01  0.07     3143     2932    1
#> 
#> Residual deviance: 106.3 (on 102 data points)
#>                pD: 59.8
#>               DIC: 166.2
#> 
#> Bayesian p-value: 0.43
#> 
#> ------------------------------------------------------ Node-split t-PA vs. PTCA ---- 
#> 
#>       mean   sd  2.5%   25%  50%  75% 97.5% Bulk_ESS Tail_ESS Rhat
#> d_net 0.48 0.11  0.27  0.40 0.48 0.55  0.68     4721     3218    1
#> d_dir 0.54 0.42 -0.24  0.25 0.53 0.82  1.41     4872     2748    1
#> d_ind 0.48 0.11  0.27  0.40 0.48 0.55  0.69     3740     3793    1
#> omega 0.07 0.43 -0.74 -0.23 0.06 0.35  0.96     4372     2788    1
#> 
#> Residual deviance: 107 (on 102 data points)
#>                pD: 59.8
#>               DIC: 166.8
#> 
#> Bayesian p-value: 0.9
#> 
#> -------------------------------------------------------- Node-split UK vs. t-PA ---- 
#> 
#>        mean   sd  2.5%   25%   50%   75% 97.5% Bulk_ESS Tail_ESS Rhat
#> d_net -0.20 0.22 -0.62 -0.35 -0.20 -0.06  0.23     4810     3391    1
#> d_dir -0.29 0.34 -0.98 -0.51 -0.28 -0.06  0.38     4912     3610    1
#> d_ind -0.15 0.29 -0.74 -0.34 -0.15  0.05  0.43     4028     3324    1
#> omega -0.14 0.45 -1.04 -0.44 -0.13  0.16  0.75     3904     3125    1
#> 
#> Residual deviance: 106.4 (on 102 data points)
#>                pD: 59.3
#>               DIC: 165.8
#> 
#> Bayesian p-value: 0.75

Node-splitting the ASPAC vs. Acc t-PA comparison results the lowest DIC, and this is lower than the consistency model. The posterior distribution for the inconsistency factor \(\omega\) for this comparison lies far from 0 and the Bayesian \(p\)-value for inconsistency is small (< 0.01), meaning that there is substantial disagreement between the direct and indirect evidence on this comparison.

We can visually compare the direct, indirect, and network estimates using the plot() method.

plot(thrombo_nodesplit)

We can also plot the posterior distributions of the inconsistency factors \(\omega\), again using the plot() method. Here, we specify a “halfeye” plot of the posterior density with median and credible intervals, and customise the plot layout with standard ggplot2 functions.

plot(thrombo_nodesplit, pars = "omega", stat = "halfeye", ref_line = 0) +
  ggplot2::aes(y = comparison) +
  ggplot2::facet_null()

Notice again that the posterior distribution of the inconsistency factor for the ASPAC vs. Acc t-PA comparison lies far from 0, indicating substantial inconsistency between the direct and indirect evidence on this comparison.

Further results

Relative effects for all pairwise contrasts between treatments can be produced using the relative_effects() function, with all_contrasts = TRUE.

(thrombo_releff <- relative_effects(thrombo_fit, all_contrasts = TRUE))
#>                            mean   sd  2.5%   25%   50%   75% 97.5% Bulk_ESS Tail_ESS Rhat
#> d[Acc t-PA vs. SK]        -0.18 0.04 -0.26 -0.21 -0.18 -0.15 -0.09     2760     2716    1
#> d[ASPAC vs. SK]            0.02 0.04 -0.06 -0.01  0.02  0.04  0.09     6008     3632    1
#> d[PTCA vs. SK]            -0.48 0.10 -0.67 -0.54 -0.48 -0.41 -0.28     4044     3190    1
#> d[r-PA vs. SK]            -0.12 0.06 -0.24 -0.16 -0.12 -0.08  0.00     3986     3208    1
#> d[SK + t-PA vs. SK]       -0.05 0.05 -0.14 -0.08 -0.05 -0.02  0.04     5664     2864    1
#> d[t-PA vs. SK]             0.00 0.03 -0.06 -0.02  0.00  0.02  0.06     5268     3386    1
#> d[TNK vs. SK]             -0.17 0.08 -0.32 -0.22 -0.17 -0.12 -0.02     4431     3368    1
#> d[UK vs. SK]              -0.20 0.22 -0.64 -0.35 -0.20 -0.06  0.23     4991     3232    1
#> d[ASPAC vs. Acc t-PA]      0.19 0.06  0.08  0.15  0.19  0.23  0.30     3907     2972    1
#> d[PTCA vs. Acc t-PA]      -0.30 0.10 -0.48 -0.36 -0.30 -0.23 -0.11     4934     3320    1
#> d[r-PA vs. Acc t-PA]       0.06 0.06 -0.06  0.02  0.06  0.09  0.17     5521     2935    1
#> d[SK + t-PA vs. Acc t-PA]  0.13 0.05  0.02  0.09  0.13  0.16  0.24     5728     2914    1
#> d[t-PA vs. Acc t-PA]       0.18 0.05  0.08  0.14  0.18  0.22  0.28     3380     3185    1
#> d[TNK vs. Acc t-PA]        0.01 0.06 -0.12 -0.04  0.01  0.05  0.13     6016     3561    1
#> d[UK vs. Acc t-PA]        -0.02 0.22 -0.46 -0.17 -0.02  0.12  0.41     5220     3351    1
#> d[PTCA vs. ASPAC]         -0.49 0.11 -0.69 -0.56 -0.49 -0.42 -0.28     4399     3005    1
#> d[r-PA vs. ASPAC]         -0.14 0.07 -0.27 -0.19 -0.14 -0.09  0.00     4613     3161    1
#> d[SK + t-PA vs. ASPAC]    -0.07 0.06 -0.18 -0.11 -0.07 -0.03  0.05     6138     3240    1
#> d[t-PA vs. ASPAC]         -0.01 0.04 -0.09 -0.04 -0.01  0.01  0.06     6668     3250    1
#> d[TNK vs. ASPAC]          -0.19 0.09 -0.35 -0.25 -0.19 -0.13 -0.02     5017     3006    1
#> d[UK vs. ASPAC]           -0.22 0.22 -0.65 -0.37 -0.21 -0.07  0.21     5097     3432    1
#> d[r-PA vs. PTCA]           0.35 0.11  0.14  0.28  0.35  0.43  0.56     5023     3369    1
#> d[SK + t-PA vs. PTCA]      0.43 0.11  0.21  0.36  0.43  0.50  0.63     5404     2903    1
#> d[t-PA vs. PTCA]           0.48 0.10  0.27  0.41  0.48  0.55  0.68     4166     3207    1
#> d[TNK vs. PTCA]            0.30 0.12  0.06  0.23  0.31  0.38  0.53     5551     3048    1
#> d[UK vs. PTCA]             0.27 0.24 -0.18  0.11  0.27  0.43  0.73     5256     3114    1
#> d[SK + t-PA vs. r-PA]      0.07 0.07 -0.07  0.02  0.07  0.12  0.21     6692     3109    1
#> d[t-PA vs. r-PA]           0.12 0.07 -0.01  0.08  0.12  0.17  0.26     4169     3169    1
#> d[TNK vs. r-PA]           -0.05 0.08 -0.21 -0.10 -0.05  0.01  0.12     7662     2726    1
#> d[UK vs. r-PA]            -0.08 0.23 -0.53 -0.23 -0.08  0.07  0.37     5197     3605    1
#> d[t-PA vs. SK + t-PA]      0.05 0.05 -0.06  0.01  0.05  0.09  0.16     5596     3253    1
#> d[TNK vs. SK + t-PA]      -0.12 0.08 -0.29 -0.18 -0.12 -0.07  0.04     6689     2927    1
#> d[UK vs. SK + t-PA]       -0.15 0.22 -0.60 -0.30 -0.15  0.00  0.30     5257     3406    1
#> d[TNK vs. t-PA]           -0.17 0.08 -0.34 -0.23 -0.17 -0.12 -0.01     4687     3053    1
#> d[UK vs. t-PA]            -0.20 0.22 -0.64 -0.35 -0.20 -0.06  0.23     5081     3356    1
#> d[UK vs. TNK]             -0.03 0.23 -0.48 -0.18 -0.03  0.12  0.42     5247     3393    1
plot(thrombo_releff, ref_line = 0)

Treatment rankings, rank probabilities, and cumulative rank probabilities.

(thrombo_ranks <- posterior_ranks(thrombo_fit))
#>                 mean   sd 2.5% 25% 50% 75% 97.5% Bulk_ESS Tail_ESS Rhat
#> rank[SK]        7.45 0.98    6   7   7   8     9     4168       NA    1
#> rank[Acc t-PA]  3.18 0.82    2   3   3   4     5     4356     3834    1
#> rank[ASPAC]     7.96 1.14    5   7   8   9     9     4980       NA    1
#> rank[PTCA]      1.13 0.36    1   1   1   1     2     4068     3530    1
#> rank[r-PA]      4.45 1.18    2   4   5   5     7     4874     3259    1
#> rank[SK + t-PA] 5.98 1.25    4   5   6   6     9     5575       NA    1
#> rank[t-PA]      7.48 1.10    5   7   8   8     9     4537       NA    1
#> rank[TNK]       3.48 1.26    2   3   3   4     6     5191     3162    1
#> rank[UK]        3.89 2.69    1   2   2   5     9     4900       NA    1
plot(thrombo_ranks)

(thrombo_rankprobs <- posterior_rank_probs(thrombo_fit))
#>              p_rank[1] p_rank[2] p_rank[3] p_rank[4] p_rank[5] p_rank[6] p_rank[7] p_rank[8]
#> d[SK]             0.00      0.00      0.00      0.00      0.02      0.13      0.38      0.31
#> d[Acc t-PA]       0.00      0.21      0.46      0.28      0.05      0.00      0.00      0.00
#> d[ASPAC]          0.00      0.00      0.00      0.00      0.03      0.10      0.18      0.27
#> d[PTCA]           0.87      0.13      0.00      0.00      0.00      0.00      0.00      0.00
#> d[r-PA]           0.00      0.05      0.13      0.31      0.38      0.09      0.01      0.01
#> d[SK + t-PA]      0.00      0.00      0.01      0.06      0.25      0.45      0.10      0.06
#> d[t-PA]           0.00      0.00      0.00      0.00      0.04      0.14      0.31      0.32
#> d[TNK]            0.00      0.23      0.33      0.24      0.14      0.04      0.01      0.00
#> d[UK]             0.13      0.38      0.06      0.09      0.09      0.05      0.02      0.03
#>              p_rank[9]
#> d[SK]             0.16
#> d[Acc t-PA]       0.00
#> d[ASPAC]          0.43
#> d[PTCA]           0.00
#> d[r-PA]           0.01
#> d[SK + t-PA]      0.06
#> d[t-PA]           0.20
#> d[TNK]            0.01
#> d[UK]             0.14
plot(thrombo_rankprobs)

(thrombo_cumrankprobs <- posterior_rank_probs(thrombo_fit, cumulative = TRUE))
#>              p_rank[1] p_rank[2] p_rank[3] p_rank[4] p_rank[5] p_rank[6] p_rank[7] p_rank[8]
#> d[SK]             0.00      0.00      0.00      0.00      0.02      0.16      0.53      0.84
#> d[Acc t-PA]       0.00      0.21      0.67      0.95      1.00      1.00      1.00      1.00
#> d[ASPAC]          0.00      0.00      0.00      0.00      0.03      0.13      0.31      0.57
#> d[PTCA]           0.87      1.00      1.00      1.00      1.00      1.00      1.00      1.00
#> d[r-PA]           0.00      0.05      0.19      0.50      0.88      0.97      0.98      0.99
#> d[SK + t-PA]      0.00      0.00      0.02      0.08      0.33      0.78      0.88      0.94
#> d[t-PA]           0.00      0.00      0.00      0.00      0.04      0.18      0.49      0.80
#> d[TNK]            0.00      0.24      0.56      0.80      0.95      0.98      0.99      0.99
#> d[UK]             0.13      0.51      0.57      0.66      0.75      0.81      0.83      0.86
#>              p_rank[9]
#> d[SK]                1
#> d[Acc t-PA]          1
#> d[ASPAC]             1
#> d[PTCA]              1
#> d[r-PA]              1
#> d[SK + t-PA]         1
#> d[t-PA]              1
#> d[TNK]               1
#> d[UK]                1
plot(thrombo_cumrankprobs)

References

Boland, A., Y. Dundar, A. Bagust, A. Haycox, R. Hill, R. Mujica Mota, T. Walley, and R. Dickson. 2003. “Early Thrombolysis for the Treatment of Acute Myocardial Infarction: A Systematic Review and Economic Evaluation.” Health Technology Assessment 7 (15). https://doi.org/10.3310/hta7150.
Dias, S., N. J. Welton, D. M. Caldwell, and A. E. Ades. 2010. “Checking Consistency in Mixed Treatment Comparison Meta-Analysis.” Statistics in Medicine 29 (7-8): 932–44. https://doi.org/10.1002/sim.3767.
Dias, S., N. J. Welton, A. J. Sutton, D. M. Caldwell, G. Lu, and A. E. Ades. 2011. NICE DSU Technical Support Document 4: Inconsistency in Networks of Evidence Based on Randomised Controlled Trials.” National Institute for Health and Care Excellence. https://www.sheffield.ac.uk/nice-dsu.
Lu, G. B., and A. E. Ades. 2006. “Assessing Evidence Inconsistency in Mixed Treatment Comparisons.” Journal of the American Statistical Association 101 (474): 447–59. https://doi.org/10.1198/016214505000001302.