In network meta-analysis we synthesize all relevant available evidence about health outcomes from competing treatments. That evidence might come from different study designs and in different formats: from non-randomized studies (NRS) or randomized controlled trials (RCT) as individual participant data (IPD) or as aggregate data (AD). We set up the package crossnma to synthesize all available evidence for a binary outcome with the odds ratio as effect measure.
This document demonstrates how to use crossnma to synthesize cross-design evidence and cross-format data via Bayesian network meta-analysis and meta-regression (NMA and NMR). All models are implemented in JAGS (Plummer 2003).
We describe the workflow within the package using a worked example from a network meta-analysis of studies for treatments in relapsing remitting multiple sclerosis (RRMS). The primary outcome is the occurrence of relapses in two years (binary outcome). In the analysis, the relative effect will be the odds ratio (OR). The aim is to compare the efficacy of four treatments using the data from 6 different studies in different formats and different designs.
We first introduce the model that synthesizes studies with individual-level (IPD) or/and aggregate data (AD) ignoring their design (unadjusted synthesis). Then, we present three possible models that account for the different study designs. In the table below we set the notation that will be used in the description of the four synthesis models.
Notation | Description | Argument in crossnma.model() |
---|---|---|
\(i=1, ..., np_j\) | participant id | |
\(j=1, ..., ns\) | study id | study |
\(k=1, ..., K\) | treatment index | trt |
\(ns_{IPD}, ns_{AD}, ns_{RCT}, ns_{NRS}\) | the number of studies. The index refers to the design or format of the study | |
\(y_{ijk}\) | binary outcome (0/1) | outcome |
\(p_{ijk}\) | probability of the event to occur | |
\(r_{jk}\) | the number of events per arm | outcome |
\(n_{jk}\) | the sample size per arm | n |
\(b\) | the study-specific reference | * |
\(u_{jb}\) | The treatment effect of the study-specific reference \(b\) when \(x_{ijk}=\bar{x}_{j}=0\) | |
\(\delta_{jbk}\) | log(OR) of treatment \(k\) relative to \(b\) | |
\(x_{ijk}\) | the covariate | cov1 , cov2 ,
cov3 |
\(\bar{x}_{j}\) | the mean covariate for study \(j\) | |
\(d_{Ak}\) | the basic parameters. Here, \(d_{AA}=0\) when A is set as the reference in the network | use reference to assign the reference
treatment |
\(z_j\) | study characteristics to estimate the bias probability \(\pi_j\) | bias.covariate |
\(w\) | common inflation factor of variance for the NRS estimates | the element var.infl in
run.nrs |
\(\zeta\) | common mean shift of the NRS estimates | the element mean.shift in
run.nrs |
*The study-specific reference \(b\) is assigned automatically to be the network reference for studies that have the network reference treatment. If not, it is assigned to the first alphabetically ordered treatment on the study.
We synthesize the evidence from RCT and NRS without acknowledging the differences between them. We combine the IPD data from RCT and NRS in one model and we do the same in another model with the AD information. Then, we combine the estimates from both parts as described in Section 2.5.
NMR model for IPD studies
\[ y_{ijk} \sim Bernoulli(p_{ijk}) \] \[\begin{equation} logit(p_{ijk}) = \begin{cases} u_{jb} +\beta_{0j} x_{ijk} & \text{if $k=b$}\\ u_{jb} +\delta_{jbk} + \beta_{0j}x_{ijk}+\beta^w_{1,jbk}x_{ijk} + (\beta^B_{1,jbk}-\beta^w_{1,jbk}) \bar{x}_{j} & \text{if $k\ne b$} \end{cases} \end{equation}\]
NMR model for AD studies \[ r_{jk} \sim Binomial(p_{.jk},n_{jk}) \] \[\begin{equation} logit(p_{.jk}) = \begin{cases} u_{jb} & \text{if $k=b$}\\ u_{jb} +\delta_{jbk} +\beta^B_{1,jbk} \bar{x}_{j} & \text{if $k\ne b$} \end{cases} \end{equation}\]
First, the (network) meta-regression with only NRS data estimates the
relative treatment effects with posterior distribution of mean \(\tilde{d}^{NRS}_{Ak}\) and variance \(V^{NRS}_{Ak}\) (use run.nrs
in
crossnma.model()
to control this process). The posteriors
of NRS results are then used as priors for the corresponding basic
parameters in the RCT model, \(d_{Ak} \sim
\mathcal{N}(\tilde{d}^{NRS}_{Ak},V^{NRS}_{Ak})\). We can adjust
for potential biases associated with NRS by either shifting the mean of
the prior distribution with a bias term \(\zeta\) or by dividing the prior variance
with a common inflation factor \(w,
0<w<1\) controls NRS contribution. The assigned priors
become \(d_{Ak} \sim
\mathcal{N}(\tilde{d}^{NRS}_{Ak}+\zeta,V^{NRS}_{Ak}/w)\).
We incorporate judgments about study risk of bias (RoB) in bias-adjusted model 1 and model 2. Each judgment about the risk of bias in a study is summarized by the index \(R_j\) which takes binary values 0 (no bias) or 1 (bias). In bias-adjusted model 1, we extend the method introduced by Dias et al. (2010) by adding a treatment-specific bias term \(\gamma_{2,jbk} R_j\) to the relative treatment effect on both the AD and IPD parts of the model. A multiplicative model can also be employed, where treatment effects are multiplied by \(\gamma_{1,jbk}^{R_j}\). We can add either multiplicative bias effects, additive bias effects, or both (in this case, \(\delta_{jbk}\) should be dropped from the additive part). The models in previous section are extended to adjust for bias as follows.
NMR model for IPD studies
\[\begin{equation} logit(p_{ijk}) = \begin{cases} u_{jb} +\beta_{0j} x_{ijk} & \text{if $k=b$}\\ u_{jb} +\overbrace{\delta_{jbk} \gamma_{1,jbk}^{R_j}}^{\text{multiplicative}}+\overbrace{\delta_{jbk}+\gamma_{2,jbk} R_j}^{\text{additive}}+ \beta_{0j}x_{ijk}+\beta^w_{1,jbk} x_{ijk}+ (\beta^B_{1,jbk}-\beta^w_{1,jbk}) \bar{x}_{j} & \text{if $k\ne b$} \end{cases} \end{equation}\]
NMR model for AD studies
\[\begin{equation} logit(p_{.jk}) = \begin{cases} u_{jb} & \text{if $k=b$}\\ u_{jb} +\overbrace{\delta_{jbk} \gamma_{1,jbk}^{R_j}}^{\text{multiplicative}}+\overbrace{\delta_{jbk}+\gamma_{2,jbk} R_j}^{\text{additive}}+ \beta^B_{1,jbk} \bar{x}_{j} & \text{if $k\ne b$} \end{cases} \end{equation}\]
The bias indicator \(R_j\) follows the following distribution
\[
R_j \sim Bernoulli(\pi_j)
\] The bias probabilities \(\pi_j\) are study-specific and can be
estimated in two different ways. They are either given informative beta
priors (\({Beta(a_1,a_2)}\)) that are
set according to the risk of bias for each study. \[
\pi_j \sim Beta(a_1, a_2)
\] The hyperparameters \(a_1\)
and \(a_2\) should be chosen in a way
that reflects the risk of bias for each study. The degree of skewness in
beta distribution can be controlled by the ratio \(a_1/a_2\) . When \(a_1/a_2\) equals 1 (or \(a_1=a_2\)), there is no skewness in the
beta distribution (the distribution is reduced to a uniform
distribution), which is appropriate for studies with unclear risk of
bias. When the ratio \(a_1/a_2\) is
closer to 1, the more the mean of probability of bias (expected value of
\(\pi_j=a_1/(a_1+a_2))\) gets closer to
1 and the study acquires ‘major’ bias adjustment. The default beta
priors are as follows: high bias RCT
pi.high.rct='dbeta(10,1)'
, low bias RCT
pi.low.rct='dbeta(1,10)'
, high bias NRS
pi.high.nrs='dbeta(30,1)'
and low bias NRS
pi.low.nrs='dbeta(1,30)'
. Alternatively, we can use the
study characteristics \(z_j\) to
estimate \(\pi_j\) through a logistic
transformation (internally coded).
We combine the multiplicative and the additive treatment-specific
bias effects across studies by assuming they are exchangeable \(\gamma_{1,jbk}\sim
\mathcal{N}(g_{1,bk},\tau_{1,\gamma}^2 )\),\(\gamma_{2,jbk}\sim
\mathcal{N}(g_{2,bk},\tau_{2,\gamma}^2 )\)) or common \(\gamma_{1,jbk}=g_{1,bk}\) and \(\gamma_{2,jbk}=g_{2,bk}\). Dias et al. (2010) proposed to model the mean
bias effect \((g_{1,bk}, g_{2,bk})\)
based on the treatments being compared.
\[\begin{equation}
g_{m,bk} =
\begin{cases}
g_m & \text{if $b$ is inactive treatment}\\
0 \text{ or } (-1)^{dir_{bk}} g_m^{act} & \text{if $b$ and $k$
are active treatments}
\end{cases}
\end{equation}\] where \(m={1,2}\). This approach assumes a common
mean bias for studies that compare active treatments with an inactive
treatment (placebo, standard or no treatment). For active vs active
comparisons, we could assume either a zero mean bias effect or a common
bias effect \(g_m^{act}\). The
direction of bias \(dir_{bk}\) in
studies that compare active treatments with each other should be defined
in the data. That is set to be either 0, meaning that bias favors \(b\) over \(k\), or 1 , meaning that \(k\) is favored to \(b\). In crossnma.model()
, the
bias direction is specified by providing the unfavoured treatment for
each study, unfav
. To select which mean bias effect should
be applied, the user can provide the bias.group
column as
data. Its values can be 0 (no bias adjustment), 1 (to assign for the
comparison mean bias effect \(g_m\)) or
2 (to set bias \(g_m^{act}\)).
Another parameterisation of the logistic model with additive bias effect is
NMR model for IPD studies
\[\begin{equation} logit(p_{ijk}) = \begin{cases} u_{jb} +\beta_{0j} x_{ijk} & \text{if $k=b$}\\ u_{jb} +(1-R_j)\delta_{jbk}+\delta_{jbk}^{bias}R_j+ \beta_{0j}x_{ijk}+\beta^w_{1,jbk} x_{ijk}+ (\beta^B_{1,jbk}-\beta^w_{1,jbk}) \bar{x}_{j} & \text{if $k\ne b$} \end{cases} \end{equation}\]
NMR model for AD studies
\[\begin{equation}
logit(p_{.jk}) =
\begin{cases}
u_{jb} & \text{if $k=b$}\\
u_{jb} +(1-R_j)\delta_{jbk}+\delta_{jbk}^{bias}R_j+
\beta^B_{1,jbk} \bar{x}_{j} & \text{if $k\ne b$}
\end{cases}
\end{equation}\] Then the bias-adjusted relative treatment effect
(\(\delta_{jbk}^{bias}=\delta_{jbk}+\gamma_{jbk}\))
can be assumed exchangeable across studies \(\delta_{jbk}^{bias} \sim
\mathcal{N}(g_{bk}+d_{Ak}-d_{Ab}, \tau^2 /q_j)\) or fixed as
\(\delta_{jbk}^{bias}=g_{bk} +
d_{Ak}-d_{Ab}\). In this parameterisation, instead of assigning
prior to the between-study heterogeneity in bias effect \(\tau_{\gamma}\), we model the RoB weight
\(q_j=\tau^2/(\tau^2+\tau_{\gamma}^2\))
for each study. This quantity \(0<q_j<1\) quantifies the proportion
of the between-study heterogeneity that is not explained by accounting
for risk of bias. The values of \(v\)
determine the extent studies at high risk of bias will be down-weighted
on average. Setting \(v=1\) gives \(E(q_j )=v/(v+1)=0.5\), which means that
high risk of bias studies will be penalized by 50% on average. In
crossnma.model()
, the user can assign the average
down-weight \(E(q_j )\) to the argument
down.wgt
.
Another way to incorporate the RoB of the study is by replacing \(\delta_{jbk}\) by a “bias-adjusted” relative treatment effect \(\theta_{jbk}\). Then \(\theta_{jbk}\) is modeled with a bimodal normal distribution as described in Section 2.5. For more details see Verde (2020).
NMR model for IPD studies
\[\begin{equation} logit(p_{ijk}) = \begin{cases} u_{jb} +\beta_{0j} x_{ijk} & \text{if $k=b$}\\ u_{jb} +\theta_{jbk} + \beta_{0j} x_{ijk}+\beta^w_{1,jbk} x_{ijk}+ (\beta^B_{1,jbk}-\beta^w_{1,jbk}) \bar{x}_{j} & \text{if $k\ne b$} \end{cases} \end{equation}\]
NMR model for AD studies
\[\begin{equation} logit(p_{jk}) = \begin{cases} u_{jb} & \text{if $k=b$}\\ u_{jb} +\theta_{jbk} +\beta^B_{1,jbk} \bar{x}_{j} & \text{if $k\ne b$} \end{cases} \end{equation}\]
where the bias-adjusted relative treatment effect (\(\theta_{jk}\)) are modeled via random-effects model with a mixture of two normal distributions. \[ \theta_{jbk} \sim (1-\pi_j) \mathcal{N}(d_{Ak}-d_{Ab}, \tau^2) + \pi_j \mathcal{N}(d_{Ak}-d_{Ab}+\gamma_{jbk}, \tau^2+\tau_\gamma^2) \]
Alternatively, we can summarize these relative effects assuming a common-effect model \[ \theta_{jbk}= d_{Ak}-d_{Ab}+\pi_j \gamma_{jbk} \]
The table below summarizes the different assumptions implemented in the package about combining the parameters in the models described above.
Parameter | Assumptions | Argument in crossnma.model() |
---|---|---|
Relative treatment effect (\(\delta_{jbk}\)) | Random-effects: \(\delta_{jbk}\sim \mathcal{N}(d_{Ak}-d_{Ab}, \tau^2)\) | trt.effect='random' |
Common-effect: \(\delta_{jbk}=d_{Ak}-d_{Ab}\) | trt.effect='common' |
|
Covariate effect (\(\beta_{0j}\)) | Independent effects: \(\beta_{0j} \sim \mathcal{N}(0, 10^2)\) | reg0.effect='independent' |
Random-effects: \(\beta_{0j} \sim \mathcal{N}(B_0, \tau^2_{0})\) | reg0.effect='random' |
|
Within-study covariate-treatment interaction (\(\beta_{1,jbk}^W\)) | Independent effects: \(\beta_{1,jbk}^W \sim \mathcal{N}(0, 10^2)\) | regw.effect='independent' |
Random-effects: \(\beta_{1,jbk}^W \sim \mathcal{N}(B_{1,Ak}^W-B_{1,Ab}^W, \tau^2_{W})\) | regw.effect='random' |
|
Common-effect: \(\beta_{1,jbk}^W = B_{1, Ak}^W-B_{1, Ab}^W\) | regw.effect='common' |
|
Between-study covariate-treatment interaction (\(\beta_{1,jbk}^B\)) | Independent effects: \(\beta_{1,jbk}^B \sim \mathcal{N}(0, 10^2)\) | regb.effect='independent' |
Random-effects: \(\beta_{1,jbk}^B \sim \mathcal{N}(B_{1, Ak}^B-B_{1, Ab}^B, \tau_B^2)\) | regb.effect='random' |
|
Common-effect: \(\beta_{1,jbk}^B = B_{1, Ak}^B-B_{1, Ab}^B\) | regb.effect='common' |
|
Bias effect (\(\gamma_{m,jbk}\)), \(m={1,2}\) | Random-effects: \(\gamma_{m,jbk} \sim \mathcal{N}(g_{m, bk}, \tau_{m,\gamma}^2)\) | bias.effect='random' |
Common-effect: \(\gamma_{m,jbk}=g_{m,bk}\) | bias.effect='common' |
|
Mean bias effect \(g_{m,bk}\) | The treatment \(k\) is active. \(g_{m,bk}=g_m\) (\(b\) inactive), \(g_{m,bk}=0\) (\(b\) active & no bias) \(g_{m,bk}=g_m^{act}\)(\(b\) active & bias) | unfav=0 , bias.group=1
unfav=1 , bias.group=0 unfav=1 ,
bias.group=2 |
Bias probability (\(\pi_j\)) | \(\pi_j \sim Beta(a_1,a_2)\) | pi.high.nrs , pi.low.nrs ,
pi.high.rct , pi.low.rct |
\(\pi_j = e+fz_j\) | bias.covariate |
The data we use are fictitious but have been developed to resample to
real RCTs with IPD and aggregate data included in Tramacere and Filippini (2015). The studies
provide either aggregate data stddata
(2 RCTs) or as
individual participant data ipddata
(3 RCTs and 1 cohort
study). Both datasets compare in total four drugs which are
anonymized.
The ipddata
contains 2950 rows, each row refers to a
participant in the study. We display the first few rows of the data
set:
head(ipddata)
#> id relapse treat design age sex rob unfavored bias.group year
#> 1 1 0 D rct 22 0 low 1 1 2002
#> 3 1 0 D rct 37 0 low 1 1 2002
#> 6 1 0 D rct 34 1 low 1 1 2002
#> 7 1 0 D rct 38 1 low 1 1 2002
#> 9 1 0 D rct 31 0 low 1 1 2002
#> 10 1 0 D rct 38 0 low 1 1 2002
For each participant, we have information for the
outcome
relapse (0=no, 1=yes), the treatment label
treat
, the age
(in years) and sex
(0 = Female, 1 = Male) of the participant. The following columns are set
on study-level (it is repeated for each participant in each study): the
id
, the design
of the study (needs to be
either rct or nrs), the risk of bias rob
on each study (can
be set as low, high or unclear), the year
of publication,
the bias.group
for the study comparison and the study
unfavoured treatment unfavored
.
The aggregate data has the standard format for meta-analysis with the exact same variable names
head(stddata)
#> id relapse n treat design age sex rob unfavored bias.group year
#> 1 1 19 25 A rct 34.3 0.2 high 0 1 2010
#> 2 1 11 25 C rct 34.3 0.3 high 1 1 2010
#> 3 2 97 126 A rct 30.0 0.4 high 0 1 2015
#> 4 2 89 125 C rct 30.0 0.5 high 1 1 2015
There are two steps to run the NMA/NMR model. The first step is to
create a JAGS model using crossnma.model()
which produces
the JAGS code and the data. In the second step, the output of that
function will be used in crossnma()
to run the analysis
through JAGS.
We start by providing the essential variables which - as stated
earlier - must have equal names in both data sets. Next, we give the
names of the datasets on participant-level (argument
prt.data
) and aggregate data (argument
std.data
). The reference
treatment needs to be
assigned (we set it to drug A). By choosing
trt.effect='random'
, we are assigning a normal distribution
to each relative treatment effect to allow the synthesis across studies,
see the table in Section 2.1. Finally, the different designs; RCT and
NRS are combined with the information taken at face-value as
method.bias = 'naive'
.
Optionally, we can specify a prior to the common heterogeneity of the
treatment effect across studies. We indicate that distribution in the
argument prior
as tau.trt='dunif(0,3)'
, see
below.
# jags model: code+data
<- crossnma.model(treat, id, relapse, n, design,
mod1 prt.data = ipddata, std.data = stddata,
reference = NULL, trt.effect = "random",
#---------- bias adjustment ----------
method.bias = "naive",
#---------- assign a prior ----------
prior = list(tau.trt='dunif(0,3)')
)#> Both designs are combined naively without acknowledging design differences
The network should be checked for its connectivity before running the analysis. This is a vital step as the model will run even if the network is not connected.
netgraph(mod1)
Next, we fit the NMA model using crossnma()
which
requires us to set the number of adaptations, iterations, thinning and
chains.
# run jags
<- crossnma(mod1,
jagsfit1 n.adapt = 500, n.iter = 5000, n.burnin = 2000,
thin = 1, n.chains = 2)
We summarize the estimated parameters in the following table.
::kable(summary(jagsfit1, exp = FALSE), digits = 3) knitr
Mean | SD | 2.5% | 50% | 97.5% | Rhat | n.eff | |
---|---|---|---|---|---|---|---|
d.A | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | NaN | 0 |
d.B | -0.921 | 0.496 | -2.022 | -0.878 | -0.025 | 1.001 | 3151 |
d.C | -0.187 | 0.448 | -1.130 | -0.165 | 0.658 | 1.001 | 3005 |
d.D | -1.119 | 0.620 | -2.419 | -1.090 | 0.071 | 1.000 | 3507 |
tau | 0.645 | 0.462 | 0.074 | 0.533 | 1.926 | 1.003 | 369 |
The estimated OR of B vs A can be obtained as exp(d.B) and similarly for exp(d.C) and exp(d.D) are the ORs of C and D relative to A, respectively. The value of tau refers to the estimates of the heterogeneity standard deviation in the relative treatment effects across studies.
We need also to assess the convergence of the MCMC chains either by checking the Gelman and Rubin statistic, Rhat (it should be approximately 1) in the table above or visually inspect the trace plot.
<- par(mar = rep(2, 4), mfrow = c(2, 3))
oldpar plot(jagsfit1)
In this part, we set argument cov1 = age
to run a NMR
model with one covariate. Again, datasets ipddata
and
stddata
must use the same variable name.
# jags model: code+data
<- crossnma.model(treat, id, relapse, n, design,
mod2 prt.data = ipddata, std.data = stddata,
reference = "A", trt.effect = "random",
#---------- bias adjustment ----------
method.bias = "naive",
#---------- meta-regression ----------
cov1 = age,
split.regcoef = FALSE
)#> Both designs are combined naively without acknowledging design differences
We could add two more covariates to the NMR model using arguments
cov2
and cov3
.
The MCMC is run under the same set up as in the network meta-analysis.
# run jags
<- crossnma(mod2,
jagsfit2 n.adapt = 500, n.iter = 5000, n.burnin = 2000,
thin = 1, n.chains = 2)
and the output table is presented below
::kable(summary(jagsfit2, exp = FALSE), digits = 3) knitr
Mean | SD | 2.5% | 50% | 97.5% | Rhat | n.eff | |
---|---|---|---|---|---|---|---|
b_1 | -0.006 | 0.074 | -0.092 | -0.006 | 0.081 | 1.213 | 3218 |
d.A | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | NaN | 0 |
d.B | -0.694 | 0.487 | -1.734 | -0.680 | 0.218 | 1.006 | 602 |
d.C | -0.168 | 0.483 | -1.169 | -0.150 | 0.776 | 1.013 | 425 |
d.D | -0.994 | 0.662 | -2.418 | -0.963 | 0.284 | 1.004 | 331 |
tau | 0.533 | 0.371 | 0.029 | 0.458 | 1.473 | 1.017 | 395 |
tau.b_1 | 0.048 | 0.115 | 0.001 | 0.018 | 0.267 | 1.251 | 200 |
Now, we additionally estimate b_1 which indicates the mean effect of age and tau.b_1 which refers to the heterogeneity standard deviation in the effect of age across studies. Here, we obtain a single estimate because we choose to not split the within- and between-study age coefficients \((\beta^w_{1,jbk} = \beta^B_{1,jbk}=\beta_{1,jbk})\) to improve the convergence of MCMC.
The league table summarizes the relative effect with the 95% credible interval of each treatment on the top compared to the treatment on the left. All estimates are computed for participant age 38. We can display the table in wide format
league(jagsfit2, exp = TRUE, cov1.value = 38)
#>
#> A 0.51 (0.18 to 1.24) 0.86 (0.31 to 2.17)
#> 1.97 (0.80 to 5.66) B 1.69 (0.57 to 5.36)
#> 1.16 (0.46 to 3.22) 0.59 (0.19 to 1.75) C
#> 2.62 (0.75 to 11.22) 1.33 (0.32 to 6.22) 2.23 (0.52 to 10.72)
#>
#> 0.38 (0.09 to 1.33)
#> 0.75 (0.16 to 3.17)
#> 0.45 (0.09 to 1.94)
#> D
or in long format
league(jagsfit2, exp = TRUE, cov1.value = 38, direction = "long")
#> Treatment Comparator median lci uci
#> 1 A A 1.0000000 1.00000000 1.000000
#> 2 B A 0.5066849 0.17660669 1.244079
#> 3 C A 0.8609526 0.31079131 2.173197
#> 4 D A 0.3816317 0.08913192 1.328199
#> 5 A B 1.9736131 0.80380774 5.662301
#> 6 B B 1.0000000 1.00000000 1.000000
#> 7 C B 1.6873405 0.57081189 5.363864
#> 8 D B 0.7503932 0.16087147 3.165229
#> 9 A C 1.1615041 0.46015165 3.217593
#> 10 B C 0.5926486 0.18643279 1.751891
#> 11 C C 1.0000000 1.00000000 1.000000
#> 12 D C 0.4477122 0.09330898 1.935859
#> 13 A D 2.6203274 0.75289946 11.219325
#> 14 B D 1.3326347 0.31593289 6.216143
#> 15 C D 2.2335777 0.51656668 10.717083
#> 16 D D 1.0000000 1.00000000 1.000000
To run NMA with a prior constructed from NRS, two additional
arguments are needed: we indicate using NRS as a prior by setting
method.bias='prior'
. That means that the model runs
internally NMA with only NRS data which are then used to construct
informative priors. This requires defining MCMC settings (the number of
adaptations, iterations, burn-ins, thinning and chains) in the argument
run.nrs
.
In this method, the prior for the basic parameters is set to a normal
distribution. For basic parameters not examined in the NRS, the code
sets a minimally informative prior d~dnorm(0, 1e-2)
. To
account for possible bias, the means of the distribution can be shifted
by mean.shift
and/or the variance can be inflated by
var.infl
to control the influence of NRS on the final
estimation. Both should be provided in run.nrs
.
# jags model: code+data
<- crossnma.model(treat, id, relapse, n, design,
mod3 prt.data = ipddata, std.data = stddata,
reference = "D", trt.effect = "random",
#---------- meta-regression ----------
cov1 = age,
split.regcoef = FALSE,
#---------- bias adjustment ----------
method.bias = "prior",
run.nrs =
list(trt.effect = "common",
var.infl = 0.6, mean.shift = 0,
n.adapt = 500, n.iter = 10000, n.burnin = 4000,
thin = 1, n.chains = 2)
)#> The data is analyzed assuming the studies have the same design
# run jags
<- crossnma(mod3,
jagsfit3 n.adapt = 500, n.iter = 5000, n.burnin = 2000,
thin = 1, n.chains = 2)
The heat plot summarizes the relative effect with the 95% credible interval of each treatment on the top compared to the treatment on the left. All estimates are computed for participant age 38.
heatplot(jagsfit3, exp = TRUE, cov1.value = 38,
size = 6, size.trt = 20, size.axis = 12)
In this part, the overall relative treatment effects are estimated from both NRS and RCT with adjustment to study-specific bias.
To fit the model, we set method.bias='adjust1'
and we
need to provide the bias variable bias=rob
in the datasets.
The direction of bias is determined by the column
unfav=unfavored
which indicates the unfavoured treatment.
The mean bias effect can be indicated by bias.group
, \(0\) (bias.group=0
), \(g\) (bias.group=1
) or \(g^{act}\) (bias.group=2
). By
default, the effect of bias is assumed to be additive
bias.type='add'
and equal across studies
bias.effect='common'
. We also use the year
of
study publication to estimate the study-probability of bias,
bias.covariate = year
.
# jags model: code+data
<- crossnma.model(treat, id, relapse, n, design,
mod4 prt.data = ipddata, std.data = stddata,
reference = "A", trt.effect = "random",
#---------- bias adjustment ----------
method.bias = 'adjust1',
bias.type = 'add',
bias.effect = 'common',
bias = rob,
unfav = unfavored,
bias.group = bias.group,
bias.covariate = year
)#> Bias effect is assumed common across studies
# run jags
<- crossnma(mod4,
jagsfit4 n.adapt = 500, n.iter = 5000, n.burnin = 2000,
thin = 1, n.chains = 2)
The results are presented below
::kable(summary(jagsfit4, exp = FALSE), digits = 3) knitr
Mean | SD | 2.5% | 50% | 97.5% | Rhat | n.eff | |
---|---|---|---|---|---|---|---|
d.A | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | NaN | 0 |
d.B | -0.816 | 0.434 | -1.744 | -0.796 | 0.070 | 1.103 | 2850 |
d.C | 0.088 | 0.499 | -0.861 | 0.071 | 1.134 | 1.764 | 1500 |
d.D | -1.062 | 0.551 | -2.257 | -1.041 | 0.041 | 1.018 | 3612 |
g | -0.495 | 7.242 | -16.147 | -1.042 | 16.865 | 1.297 | 3037 |
tau | 0.560 | 0.358 | 0.059 | 0.486 | 1.507 | 1.005 | 399 |
The parameter g
refers to the mean bias effect, common
for all studies.
The arguments for method.bias='adjust2'
are similar to
the ones used before in method.bias='adjust1'
.
# jags model: code+data
<- crossnma.model(treat, id, relapse, n, design,
mod5 prt.data = ipddata, std.data = stddata,
reference = "A", trt.effect = "random",
#---------- bias adjustment ----------
method.bias = 'adjust2',
bias.type = 'add',
bias = rob,
unfav = unfavored,
bias.group = bias.group,
)#> Bias effect is assumed common across studies
# run jags
<- crossnma(mod5,
jagsfit5 n.adapt = 500, n.iter = 5000, n.burnin = 2000,
thin = 1, n.chains = 2)
::kable(summary(jagsfit5, exp = FALSE), digits = 3) knitr
Mean | SD | 2.5% | 50% | 97.5% | Rhat | n.eff | |
---|---|---|---|---|---|---|---|
d.A | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | NaN | 0 |
d.B | -0.838 | 0.500 | -1.906 | -0.830 | 0.211 | 1.014 | 846 |
d.C | -0.256 | 0.472 | -1.296 | -0.236 | 0.654 | 1.001 | 913 |
d.D | -1.391 | 0.769 | -3.249 | -1.310 | -0.007 | 1.003 | 438 |
g | 0.560 | 0.930 | -1.180 | 0.487 | 2.733 | 1.009 | 193 |
tau | 0.686 | 0.440 | 0.094 | 0.588 | 1.734 | 1.009 | 162 |
par(oldpar)