Performs the Bayesian node-splitting approach of Dias et al. (2010) extended to address aggregate binary and continuous missing participant outcome data via the pattern-mixture model (Spineli et al., 2021; Spineli, 2019). This model offers a local evaluation of the plausibility of the consistency assumption in the network (Dias et al., 2010).
Arguments
- full
- n_chains
Positive integer specifying the number of chains for the MCMC sampling; an argument of the
jags
function of the R-package R2jags. The default argument is 2.- n_iter
Positive integer specifying the number of Markov chains for the MCMC sampling; an argument of the
jags
function of the R-package R2jags. The default argument is 10000.- n_burnin
Positive integer specifying the number of iterations to discard at the beginning of the MCMC sampling; an argument of the
jags
function of the R-package R2jags. The default argument is 1000.- n_thin
Positive integer specifying the thinning rate for the MCMC sampling; an argument of the
jags
function of the R-package R2jags. The default argument is 1.- inits
A list with the initial values for the parameters; an argument of the
jags
function of the R-package R2jags. The default argument isNULL
, and JAGS generates the initial values.
Value
An R2jags output on the summaries of the posterior distribution, and the Gelman-Rubin convergence diagnostic of the following monitored parameters:
- direct
The summary effect measure (according to the argument
measure
defined inrun_model
) of each split node based on the corresponding trials.- indirect
The indirect summary effect measure (according to the argument
measure
defined inrun_model
) of each split node based on the remaining network after removing (splitting) the corresponding node.- diff
The inconsistency parameter for each split node defined as the difference between the direct and indirect effect of the corresponding split node.
- tau
The between-trial standard deviation after each split node, when the random-effects model has been specified.
Furthermore, the output includes the following element:
- model_assessment
A data-frame on the measures of model assessment after each split node: deviance information criterion, total residual deviance, and number of effective parameters.
Details
run_nodesplit
inherits the arguments data
,
measure
, model
, assumption
, heter_prior
,
mean_misspar
, var_misspar
, ref
, and indic
from
run_model
(now contained in the argument full
).
This prevents specifying a different Bayesian model from that considered
in run_model
. Therefore, the user needs first to apply
run_model
, and then use run_nodesplit
(see 'Examples').
For a binary outcome, when measure
is "RR" (relative risk) or "RD"
(risk difference) in run_model
, run_nodesplit
currently performs node-splitting using the odds ratio as effect measure
for being the base-case effect measure in run_model
for a binary outcome (see also 'Details' in run_model
).
To perform the Bayesian node-splitting approach, the
prepare_nodesplit
function is called which contains the
WinBUGS code as written by Dias et al. (2010) for binomial and normal
likelihood to analyse binary and continuous outcome data, respectively.
prepare_nodesplit
has been extended to incorporate the
pattern-mixture model with informative missingness parameters for binary
and continuous outcome data (see 'Details' in run_model
).
run_nodesplit
runs the Bayesian node-splitting approach in
JAGS
. The progress of the simulation appears on the R console. The
number of times run_nodesplit
is used appears on the R console as a
text in red and it equals the number of split nodes (see 'Examples').
If there are no split nodes in the network, the execution of the function
will be stopped and an error message will be printed on the R console.
The model is updated until convergence using the
autojags
function of the R-package
R2jags with 2 updates and
number of iterations and thinning equal to n_iter
and n_thin
,
respectively.
run_nodesplit
uses the
mtc.nodesplit.comparisons
function of the R-package
gemtc
to obtain automatically the nodes to split based on the decision rule of
van Valkenhoef et al. (2016).
run_nodesplit
uses the option (1) in van Valkenhoef et al. (2016)
to parameterise multi-arm trials that contain the node-to-split.
In contrast,
mtc.nodesplit.comparisons
uses the option (3) in van Valkenhoef et al. (2016).
Option (1) keeps the baseline arm of the node-to-split in the corresponding
multi-arms. Option (3) excludes both arms of the node-to-split from the
corresponding multi-arm trials.
The output of run_nodesplit
is not end-user-ready.
The nodesplit_plot
function inherits the output of
run_nodesplit
as an S3 object and processes it further to provide an
end-user-ready output.
run_nodesplit
can be used only for a network of interventions.
In the case of two interventions, the execution of the function will
be stopped and an error message will be printed on the R console.
References
Dias S, Welton NJ, Caldwell DM, Ades AE. Checking consistency in mixed treatment comparison meta-analysis. Stat Med 2010;29(7-8):932–44. doi: 10.1002/sim.3767
Gelman A, Rubin DB. Inference from iterative simulation using multiple sequences. Stat Sci 1992;7(4):457–72. doi: 10.1214/ss/1177011136
Spineli LM, Kalyvas C, Papadimitropoulou K. Continuous(ly) missing outcome data in network meta-analysis: a one-stage pattern-mixture model approach. Stat Methods Med Res 2021;30(4):958–75. doi: 10.1177/0962280220983544
Spineli LM. An empirical comparison of Bayesian modelling strategies for missing binary outcome data in network meta-analysis. BMC Med Res Methodol 2019;19(1):86. doi: 10.1186/s12874-019-0731-y
van Valkenhoef G, Dias S, Ades AE, Welton NJ. Automated generation of node-splitting models for assessment of inconsistency in network meta-analysis. Res Synth Methods 2016;7(1):80–93. doi: 10.1002/jrsm.1167
Examples
data("nma.baker2009")
# Read results from 'run_model' (using the default arguments)
res <- readRDS(system.file('extdata/res_baker.rds', package = 'rnmamod'))
# \donttest{
# Run random-effects node-splitting approach
# Note: Ideally, set 'n_iter' to 10000 and 'n_burnin' to 1000
run_nodesplit(full = res,
n_chains = 3,
n_iter = 1000,
n_burnin = 100,
n_thin = 1)
#> JAGS generates initial values for the parameters.
#> 1 out of 8 split nodes
#> Compiling model graph
#> Resolving undeclared variables
#> Allocating nodes
#> Graph information:
#> Observed stochastic nodes: 79
#> Unobserved stochastic nodes: 141
#> Total graph size: 2525
#>
#> Initializing model
#>
#> Updating model for split node 1 until convergence
#> 2 out of 8 split nodes
#> Compiling model graph
#> Resolving undeclared variables
#> Allocating nodes
#> Graph information:
#> Observed stochastic nodes: 79
#> Unobserved stochastic nodes: 141
#> Total graph size: 2525
#>
#> Initializing model
#>
#> Updating model for split node 2 until convergence
#> 3 out of 8 split nodes
#> Compiling model graph
#> Resolving undeclared variables
#> Allocating nodes
#> Graph information:
#> Observed stochastic nodes: 79
#> Unobserved stochastic nodes: 141
#> Total graph size: 2525
#>
#> Initializing model
#>
#> Updating model for split node 3 until convergence
#> 4 out of 8 split nodes
#> Compiling model graph
#> Resolving undeclared variables
#> Allocating nodes
#> Graph information:
#> Observed stochastic nodes: 79
#> Unobserved stochastic nodes: 141
#> Total graph size: 2534
#>
#> Initializing model
#>
#> Updating model for split node 4 until convergence
#> 5 out of 8 split nodes
#> Compiling model graph
#> Resolving undeclared variables
#> Allocating nodes
#> Graph information:
#> Observed stochastic nodes: 79
#> Unobserved stochastic nodes: 141
#> Total graph size: 2534
#>
#> Initializing model
#>
#> Updating model for split node 5 until convergence
#> 6 out of 8 split nodes
#> Compiling model graph
#> Resolving undeclared variables
#> Allocating nodes
#> Graph information:
#> Observed stochastic nodes: 79
#> Unobserved stochastic nodes: 141
#> Total graph size: 2534
#>
#> Initializing model
#>
#> Updating model for split node 6 until convergence
#> 7 out of 8 split nodes
#> Compiling model graph
#> Resolving undeclared variables
#> Allocating nodes
#> Graph information:
#> Observed stochastic nodes: 79
#> Unobserved stochastic nodes: 141
#> Total graph size: 2525
#>
#> Initializing model
#>
#> Updating model for split node 7 until convergence
#> 8 out of 8 split nodes
#> Compiling model graph
#> Resolving undeclared variables
#> Allocating nodes
#> Graph information:
#> Observed stochastic nodes: 79
#> Unobserved stochastic nodes: 141
#> Total graph size: 2530
#>
#> Initializing model
#>
#> Updating model for split node 8 until convergence
#> $direct
#> treat1 treat2 mean sd 2.5% 97.5% Rhat n.eff
#> 1 6 1 -0.2707929 0.2549557 -0.7780221 0.20025925 1.238338 13
#> 2 7 1 -0.5179808 0.2506733 -0.9958658 -0.01131582 1.316350 10
#> 3 8 1 -0.3998339 0.1757369 -0.7773684 -0.08127426 1.271806 12
#> 4 5 4 -0.2375894 0.2075614 -0.6908568 0.10443424 1.098678 32
#> 5 7 4 -0.5936413 0.1956733 -0.9938691 -0.17200397 1.018038 3000
#> 6 7 5 -0.3937262 0.2373695 -0.8627485 0.08790818 1.014811 150
#> 7 8 6 -1.7039781 0.7011057 -3.2693399 -0.25362624 1.114296 23
#> 8 8 7 -0.8242161 0.3814833 -1.7040365 -0.11573861 1.204249 15
#>
#> $indirect
#> treat1 treat2 mean sd 2.5% 97.5% Rhat n.eff
#> 1 6 1 1.11026007 0.9190806 -0.3833529 3.00856598 1.258479 12
#> 2 7 1 -0.26294949 0.6385117 -1.8618131 0.84320463 1.072424 35
#> 3 8 1 -1.24924933 0.5069572 -2.1964217 -0.30132103 1.135330 23
#> 4 5 4 -0.78331244 0.3952917 -1.5973782 -0.03154726 1.042130 250
#> 5 7 4 -0.18179000 0.2054959 -0.5416137 0.22863273 1.094953 26
#> 6 7 5 -0.32968407 0.3084255 -0.8587023 0.34565193 1.064402 41
#> 7 8 6 -0.05779420 0.2204596 -0.5311060 0.31172441 1.149565 18
#> 8 8 7 -0.02421956 0.1954258 -0.4200045 0.34703278 1.021609 100
#>
#> $diff
#> treat1 treat2 mean sd 2.5% 97.5% Rhat n.eff
#> 1 6 1 -1.3810530 0.9548193 -3.4026045 0.24521676 1.329830 10
#> 2 7 1 -0.2550313 0.5676081 -1.2899651 1.09012145 1.021189 360
#> 3 8 1 0.8494155 0.5183950 -0.1038453 1.81825414 1.161116 18
#> 4 5 4 0.5457231 0.4265164 -0.3398236 1.34351352 1.063547 48
#> 5 7 4 -0.4118513 0.3115107 -1.0832393 0.12992099 1.040251 58
#> 6 7 5 -0.0640421 0.4388195 -1.0186043 0.74194669 1.058546 44
#> 7 8 6 -1.6461839 0.7241851 -3.2476687 -0.09766704 1.118867 22
#> 8 8 7 -0.7999965 0.4304338 -1.6750605 0.10448987 1.097171 28
#>
#> $tau
#> treat1 treat2 50% sd 2.5% 97.5% Rhat n.eff
#> 1 6 1 0.11843622 0.07246070 0.0232293275 0.2899744 1.029457 280
#> 2 7 1 0.13712032 0.07938292 0.0086724375 0.3179563 1.255815 16
#> 3 8 1 0.12675278 0.08366062 0.0185188396 0.3267356 1.063419 41
#> 4 5 4 0.11162511 0.09105702 0.0157145111 0.3313558 1.396730 9
#> 5 7 4 0.07409735 0.09205955 0.0006200626 0.3058351 1.757179 6
#> 6 7 5 0.14993678 0.09664899 0.0259108690 0.3922939 1.120660 24
#> 7 8 6 0.12051227 0.08353258 0.0140238021 0.3231185 1.414808 10
#> 8 8 7 0.13718509 0.10045183 0.0041884272 0.3656804 1.283662 16
#>
#> $model
#> [1] "RE"
#>
#> $model_assessment
#> treat1 treat2 deviance DIC pD
#> 1 6 1 53.07385 89.29568 36.22183
#> 2 7 1 54.60849 91.34896 36.74047
#> 3 8 1 53.42358 89.22839 35.80481
#> 4 5 4 53.98767 90.97600 36.98833
#> 5 7 4 54.59819 92.66484 38.06665
#> 6 7 5 54.18035 93.01465 38.83430
#> 7 8 6 52.80189 89.06487 36.26297
#> 8 8 7 53.27872 90.83417 37.55545
#>
#> $n_chains
#> [1] 3
#>
#> $n_iter
#> [1] 1000
#>
#> $n_burnin
#> [1] 100
#>
#> $n_thin
#> [1] 1
#>
#> attr(,"class")
#> [1] "run_nodesplit"
# }