Example: Thrombolytic treatments

library(multinma)
options(mc.cores = parallel::detectCores())

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 Rhat
#> d[Acc t-PA]      -0.18    0.00 0.04     -0.26     -0.21     -0.18     -0.15     -0.09  2684    1
#> d[ASPAC]          0.02    0.00 0.04     -0.06     -0.01      0.02      0.04      0.09  5412    1
#> d[PTCA]          -0.48    0.00 0.10     -0.67     -0.54     -0.47     -0.41     -0.28  4307    1
#> d[r-PA]          -0.12    0.00 0.06     -0.24     -0.16     -0.12     -0.08     -0.01  3487    1
#> d[SK + t-PA]     -0.05    0.00 0.05     -0.14     -0.08     -0.05     -0.02      0.03  4989    1
#> d[t-PA]           0.00    0.00 0.03     -0.06     -0.02      0.00      0.02      0.06  4673    1
#> d[TNK]           -0.17    0.00 0.08     -0.32     -0.22     -0.17     -0.12     -0.03  3396    1
#> d[UK]            -0.20    0.00 0.22     -0.64     -0.35     -0.20     -0.06      0.23  4386    1
#> lp__         -43363.25    0.14 5.44 -43375.04 -43366.66 -43362.92 -43359.45 -43353.69  1518    1
#> 
#> Samples were drawn using NUTS(diag_e) at Tue Jan  9 17:51:58 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.9 (on 102 data points)
#>                pD: 58.7
#>               DIC: 164.6

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.13     -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.66    0.00 0.19     -1.05     -0.79     -0.66     -0.53     -0.30
#> 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.13     -0.07     -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.38    0.01 0.52     -1.46     -0.71     -0.36     -0.03      0.61
#> d[ASPAC vs. Acc t-PA]      1.40    0.01 0.41      0.63      1.13      1.39      1.66      2.26
#> d[PTCA vs. Acc t-PA]      -0.21    0.00 0.12     -0.44     -0.29     -0.21     -0.13      0.00
#> 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.01    0.00 0.06     -0.11     -0.03      0.00      0.05      0.13
#> d[UK vs. Acc t-PA]         0.15    0.01 0.35     -0.52     -0.09      0.14      0.38      0.86
#> d[t-PA vs. ASPAC]          0.29    0.01 0.36     -0.41      0.04      0.29      0.53      0.99
#> d[t-PA vs. PTCA]           0.55    0.01 0.42     -0.26      0.26      0.55      0.83      1.39
#> d[UK vs. t-PA]            -0.30    0.00 0.35     -0.99     -0.53     -0.30     -0.06      0.35
#> lp__                  -43398.57    0.15 5.66 -43410.36 -43402.09 -43398.22 -43394.67 -43388.36
#>                       n_eff Rhat
#> d[Acc t-PA vs. SK]     6371    1
#> d[ASPAC vs. SK]        5128    1
#> d[PTCA vs. SK]         6178    1
#> d[r-PA vs. SK]         5639    1
#> d[SK + t-PA vs. SK]    6335    1
#> d[t-PA vs. SK]         4381    1
#> d[UK vs. SK]           6049    1
#> d[ASPAC vs. Acc t-PA]  3523    1
#> d[PTCA vs. Acc t-PA]   5434    1
#> d[r-PA vs. Acc t-PA]   4181    1
#> d[TNK vs. Acc t-PA]    5208    1
#> d[UK vs. Acc t-PA]     4806    1
#> d[t-PA vs. ASPAC]      3952    1
#> d[t-PA vs. PTCA]       4330    1
#> d[UK vs. t-PA]         5413    1
#> lp__                   1501    1
#> 
#> Samples were drawn using NUTS(diag_e) at Tue Jan  9 17:52:14 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.9 (on 102 data points)
#>                pD: 58.7
#>               DIC: 164.6
(dic_ume <- dic(thrombo_fit_ume))
#> Residual deviance: 99.2 (on 102 data points)
#>                pD: 65.4
#>               DIC: 164.6

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.21 -0.18 -0.15 -0.09     2662     2706 1.00
#> d_dir -0.16 0.05 -0.25 -0.19 -0.16 -0.13 -0.06     3762     3206 1.00
#> d_ind -0.25 0.09 -0.42 -0.31 -0.25 -0.19 -0.07      624     1381 1.01
#> omega  0.09 0.10 -0.11  0.02  0.09  0.16  0.28      710     1431 1.01
#> 
#> Residual deviance: 106.3 (on 102 data points)
#>                pD: 59.8
#>               DIC: 166.2
#> 
#> Bayesian p-value: 0.37
#> 
#> ------------------------------------------------------- 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.05 -0.01  0.01  0.04  0.09     5308     3551 1.00
#> d_dir  0.01 0.04 -0.07 -0.01  0.01  0.03  0.08     4364     3332 1.00
#> d_ind  0.42 0.25 -0.07  0.26  0.42  0.59  0.92     2211     2269 1.01
#> omega -0.41 0.25 -0.93 -0.58 -0.41 -0.25  0.08     2161     2569 1.01
#> 
#> Residual deviance: 104.3 (on 102 data points)
#>                pD: 59.8
#>               DIC: 164.1
#> 
#> Bayesian p-value: 0.099
#> 
#> -------------------------------------------------------- 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.67 -0.54 -0.47 -0.41 -0.28     4455     3354    1
#> d_dir -0.66 0.18 -1.03 -0.79 -0.66 -0.54 -0.31     5811     3652    1
#> d_ind -0.39 0.12 -0.63 -0.47 -0.39 -0.31 -0.16     3588     3650    1
#> omega -0.27 0.22 -0.70 -0.42 -0.27 -0.12  0.15     4697     3255    1
#> 
#> Residual deviance: 105.6 (on 102 data points)
#>                pD: 59.9
#>               DIC: 165.4
#> 
#> Bayesian p-value: 0.21
#> 
#> -------------------------------------------------------- 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.12 -0.08 -0.01     3503     2795    1
#> d_dir -0.06 0.09 -0.24 -0.12 -0.06  0.00  0.12     4951     3469    1
#> d_ind -0.18 0.08 -0.33 -0.23 -0.18 -0.12 -0.02     1940     2837    1
#> omega  0.12 0.12 -0.12  0.04  0.12  0.20  0.35     2423     3008    1
#> 
#> Residual deviance: 105.5 (on 102 data points)
#>                pD: 59.3
#>               DIC: 164.8
#> 
#> Bayesian p-value: 0.33
#> 
#> -------------------------------------------------------- Node-split t-PA vs. SK ---- 
#> 
#>       mean   sd  2.5%   25%   50%   75% 97.5% Bulk_ESS Tail_ESS Rhat
#> d_net  0.0 0.03 -0.05 -0.02  0.00  0.02  0.06     4483     3263    1
#> d_dir  0.0 0.03 -0.06 -0.02  0.00  0.02  0.06     3522     3092    1
#> d_ind  0.2 0.24 -0.25  0.03  0.19  0.36  0.67     1326     2110    1
#> omega -0.2 0.24 -0.67 -0.36 -0.19 -0.03  0.25     1343     2124    1
#> 
#> Residual deviance: 106.3 (on 102 data points)
#>                pD: 59.7
#>               DIC: 166
#> 
#> 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     4556     3686    1
#> d_dir -0.37 0.52 -1.44 -0.72 -0.38 -0.01  0.64     6175     2633    1
#> d_ind -0.17 0.25 -0.65 -0.34 -0.17  0.00  0.32     4602     3339    1
#> omega -0.21 0.58 -1.33 -0.58 -0.21  0.19  0.93     5140     3212    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.16 0.19 0.23  0.31     3308     3091    1
#> d_dir 1.40 0.42 0.63 1.11 1.38 1.67  2.28     4043     2897    1
#> d_ind 0.16 0.06 0.05 0.13 0.16 0.20  0.27     3358     3192    1
#> omega 1.23 0.42 0.46 0.94 1.22 1.51  2.11     3898     2765    1
#> 
#> Residual deviance: 97.3 (on 102 data points)
#>                pD: 60.2
#>               DIC: 157.4
#> 
#> 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.36 -0.30 -0.23 -0.11     5836     3271    1
#> d_dir -0.22 0.12 -0.45 -0.30 -0.22 -0.14  0.01     4572     3760    1
#> d_ind -0.47 0.17 -0.81 -0.59 -0.47 -0.35 -0.13     3190     3164    1
#> omega  0.26 0.21 -0.16  0.12  0.26  0.40  0.66     3208     3208    1
#> 
#> Residual deviance: 105.4 (on 102 data points)
#>                pD: 59.7
#>               DIC: 165.2
#> 
#> Bayesian p-value: 0.22
#> 
#> -------------------------------------------------- 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     5571     3446    1
#> d_dir  0.02 0.07 -0.11 -0.03  0.02  0.06  0.15     4975     3427    1
#> d_ind  0.13 0.10 -0.06  0.07  0.13  0.20  0.33     2043     2565    1
#> omega -0.11 0.12 -0.35 -0.19 -0.11 -0.03  0.12     2030     2820    1
#> 
#> Residual deviance: 105.6 (on 102 data points)
#>                pD: 59.3
#>               DIC: 164.9
#> 
#> Bayesian p-value: 0.35
#> 
#> --------------------------------------------- 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.02  0.09  0.13  0.17  0.24     5412     3327    1
#> d_dir  0.13 0.05  0.02  0.09  0.13  0.16  0.23     3674     3556    1
#> d_ind  0.62 0.68 -0.69  0.15  0.61  1.07  1.99     3064     2531    1
#> omega -0.49 0.68 -1.85 -0.94 -0.48 -0.03  0.82     3068     2590    1
#> 
#> Residual deviance: 106.4 (on 102 data points)
#>                pD: 59.7
#>               DIC: 166.2
#> 
#> Bayesian p-value: 0.47
#> 
#> ---------------------------------------------------- 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.46 -0.17 -0.02 0.13  0.42     4584     3689    1
#> d_dir  0.15 0.36 -0.55 -0.10  0.14 0.39  0.86     4966     3076    1
#> d_ind -0.13 0.29 -0.70 -0.33 -0.13 0.06  0.42     3933     3434    1
#> omega  0.28 0.46 -0.61 -0.03  0.28 0.58  1.19     3841     3455    1
#> 
#> Residual deviance: 106.6 (on 102 data points)
#>                pD: 59.8
#>               DIC: 166.4
#> 
#> Bayesian p-value: 0.54
#> 
#> ----------------------------------------------------- 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.09 -0.04 -0.01  0.01  0.06     6805     3346    1
#> d_dir -0.02 0.04 -0.10 -0.05 -0.02  0.00  0.05     4947     3028    1
#> d_ind  0.03 0.06 -0.09 -0.02  0.03  0.07  0.14     3743     3119    1
#> omega -0.05 0.06 -0.17 -0.09 -0.05 -0.01  0.07     3439     2768    1
#> 
#> Residual deviance: 106.5 (on 102 data points)
#>                pD: 59.9
#>               DIC: 166.4
#> 
#> Bayesian p-value: 0.41
#> 
#> ------------------------------------------------------ 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.41 0.48 0.55  0.69     4385     3501    1
#> d_dir 0.55 0.42 -0.27  0.27 0.55 0.83  1.40     4566     3333    1
#> d_ind 0.47 0.11  0.26  0.40 0.47 0.54  0.68     3645     3195    1
#> omega 0.08 0.43 -0.79 -0.21 0.08 0.38  0.94     3996     3131    1
#> 
#> Residual deviance: 107.1 (on 102 data points)
#>                pD: 59.9
#>               DIC: 167
#> 
#> Bayesian p-value: 0.87
#> 
#> -------------------------------------------------------- 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.63 -0.35 -0.20 -0.06  0.23     4764     3777    1
#> d_dir -0.30 0.34 -0.97 -0.53 -0.30 -0.07  0.35     4873     3291    1
#> d_ind -0.14 0.29 -0.71 -0.34 -0.14  0.04  0.44     3254     3105    1
#> omega -0.15 0.44 -1.03 -0.45 -0.15  0.14  0.73     3519     3319    1
#> 
#> Residual deviance: 107 (on 102 data points)
#>                pD: 59.9
#>               DIC: 166.9
#> 
#> Bayesian p-value: 0.73

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     2691     2739    1
#> d[ASPAC vs. SK]            0.02 0.04 -0.06 -0.01  0.02  0.04  0.09     5417     3300    1
#> d[PTCA vs. SK]            -0.48 0.10 -0.67 -0.54 -0.47 -0.41 -0.28     4424     3327    1
#> d[r-PA vs. SK]            -0.12 0.06 -0.24 -0.16 -0.12 -0.08 -0.01     3552     3120    1
#> d[SK + t-PA vs. SK]       -0.05 0.05 -0.14 -0.08 -0.05 -0.02  0.03     5137     3276    1
#> d[t-PA vs. SK]             0.00 0.03 -0.06 -0.02  0.00  0.02  0.06     4638     3299    1
#> d[TNK vs. SK]             -0.17 0.08 -0.32 -0.22 -0.17 -0.12 -0.03     3463     3261    1
#> d[UK vs. SK]              -0.20 0.22 -0.64 -0.35 -0.20 -0.06  0.23     4401     3465    1
#> d[ASPAC vs. Acc t-PA]      0.19 0.06  0.08  0.16  0.19  0.23  0.30     3584     2944    1
#> d[PTCA vs. Acc t-PA]      -0.30 0.10 -0.49 -0.36 -0.30 -0.23 -0.10     5764     3497    1
#> d[r-PA vs. Acc t-PA]       0.05 0.05 -0.05  0.02  0.05  0.09  0.16     5770     3515    1
#> d[SK + t-PA vs. Acc t-PA]  0.13 0.05  0.02  0.09  0.13  0.16  0.23     5522     3665    1
#> d[t-PA vs. Acc t-PA]       0.18 0.05  0.08  0.14  0.18  0.22  0.28     3504     3697    1
#> d[TNK vs. Acc t-PA]        0.01 0.06 -0.11 -0.04  0.01  0.05  0.13     5714     3437    1
#> d[UK vs. Acc t-PA]        -0.03 0.22 -0.46 -0.17 -0.02  0.12  0.41     4453     3305    1
#> d[PTCA vs. ASPAC]         -0.49 0.11 -0.71 -0.56 -0.49 -0.42 -0.29     4705     3678    1
#> d[r-PA vs. ASPAC]         -0.14 0.07 -0.27 -0.19 -0.14 -0.09  0.00     4096     3418    1
#> d[SK + t-PA vs. ASPAC]    -0.07 0.06 -0.18 -0.10 -0.07 -0.03  0.04     5366     3666    1
#> d[t-PA vs. ASPAC]         -0.01 0.04 -0.08 -0.04 -0.01  0.01  0.06     7301     3418    1
#> d[TNK vs. ASPAC]          -0.19 0.08 -0.35 -0.24 -0.19 -0.13 -0.02     3677     3420    1
#> d[UK vs. ASPAC]           -0.22 0.22 -0.66 -0.37 -0.21 -0.07  0.22     4562     3361    1
#> d[r-PA vs. PTCA]           0.35 0.11  0.14  0.28  0.35  0.43  0.57     5661     3518    1
#> d[SK + t-PA vs. PTCA]      0.43 0.11  0.23  0.35  0.43  0.50  0.64     5763     3491    1
#> d[t-PA vs. PTCA]           0.48 0.10  0.28  0.41  0.48  0.55  0.69     4551     3692    1
#> d[TNK vs. PTCA]            0.30 0.12  0.08  0.22  0.30  0.39  0.53     6202     3478    1
#> d[UK vs. PTCA]             0.27 0.24 -0.21  0.12  0.27  0.44  0.74     4546     3377    1
#> d[SK + t-PA vs. r-PA]      0.07 0.07 -0.06  0.03  0.07  0.12  0.21     5642     3193    1
#> d[t-PA vs. r-PA]           0.13 0.07 -0.01  0.08  0.13  0.17  0.26     3989     3304    1
#> d[TNK vs. r-PA]           -0.05 0.08 -0.20 -0.10 -0.05  0.01  0.11     6599     3035    1
#> d[UK vs. r-PA]            -0.08 0.23 -0.53 -0.23 -0.08  0.07  0.36     4573     3439    1
#> d[t-PA vs. SK + t-PA]      0.05 0.05 -0.05  0.01  0.05  0.09  0.16     5053     3345    1
#> d[TNK vs. SK + t-PA]      -0.12 0.08 -0.28 -0.18 -0.12 -0.07  0.04     5949     3340    1
#> d[UK vs. SK + t-PA]       -0.15 0.22 -0.59 -0.30 -0.15 -0.01  0.29     4515     3478    1
#> d[TNK vs. t-PA]           -0.17 0.08 -0.33 -0.23 -0.17 -0.12 -0.01     3614     3630    1
#> d[UK vs. t-PA]            -0.21 0.22 -0.64 -0.35 -0.20 -0.06  0.23     4515     3391    1
#> d[UK vs. TNK]             -0.03 0.23 -0.48 -0.18 -0.03  0.12  0.41     4540     3355    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.47 0.94    6   7   7   8     9     3931       NA    1
#> rank[Acc t-PA]  3.15 0.81    2   3   3   4     5     4111     3662    1
#> rank[ASPAC]     7.97 1.16    5   7   8   9     9     4921       NA    1
#> rank[PTCA]      1.13 0.36    1   1   1   1     2     3438     3415    1
#> rank[r-PA]      4.43 1.18    2   4   5   5     7     5037     3418    1
#> rank[SK + t-PA] 5.98 1.21    4   5   6   6     9     4940       NA    1
#> rank[t-PA]      7.50 1.11    5   7   8   8     9     4518       NA    1
#> rank[TNK]       3.49 1.24    2   3   3   4     6     5086     3109    1
#> rank[UK]        3.88 2.65    1   2   3   5     9     4328       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.01      0.12      0.39      0.33
#> d[Acc t-PA]       0.00      0.22      0.46      0.29      0.04      0.00      0.00      0.00
#> d[ASPAC]          0.00      0.00      0.00      0.00      0.03      0.09      0.18      0.25
#> d[PTCA]           0.87      0.12      0.00      0.00      0.00      0.00      0.00      0.00
#> d[r-PA]           0.00      0.05      0.14      0.31      0.38      0.08      0.02      0.01
#> d[SK + t-PA]      0.00      0.00      0.01      0.06      0.25      0.47      0.09      0.06
#> d[t-PA]           0.00      0.00      0.00      0.00      0.04      0.14      0.29      0.32
#> d[TNK]            0.00      0.24      0.31      0.25      0.15      0.03      0.01      0.00
#> d[UK]             0.12      0.37      0.08      0.09      0.10      0.06      0.02      0.02
#>              p_rank[9]
#> d[SK]             0.15
#> d[Acc t-PA]       0.00
#> d[ASPAC]          0.44
#> d[PTCA]           0.00
#> d[r-PA]           0.01
#> d[SK + t-PA]      0.06
#> d[t-PA]           0.21
#> d[TNK]            0.00
#> 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.01      0.14      0.53      0.85
#> d[Acc t-PA]       0.00      0.22      0.67      0.96      1.00      1.00      1.00      1.00
#> d[ASPAC]          0.00      0.00      0.00      0.00      0.03      0.12      0.31      0.56
#> 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.01      0.07      0.32      0.79      0.88      0.94
#> d[t-PA]           0.00      0.00      0.00      0.00      0.04      0.18      0.47      0.79
#> d[TNK]            0.00      0.24      0.55      0.80      0.95      0.98      0.99      1.00
#> d[UK]             0.12      0.49      0.57      0.66      0.76      0.82      0.84      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.