Although `MBNMAdose`

is intended to be used for
dose-response Model-Based Network Meta-Analysis (MBNMA), it can also be
adapted to perform standard Network Meta-Analysis (NMA), and this allows
users to take advantage of some of the additional features of
`MBNMAdose`

, such as modelling class effects, for use in
standard NMA. As well as fitting class effect models,
`MBNMAdose`

also allows for nodes-splitting to check for
consistency in these models.

To illustrate how this can be done we will use a dataset of inhaled
medications for Chronic Obstructive Pulmonary Disease (COPD) from the
`netmeta`

package (*REF*):

```
library(netmeta)
#> Loading required package: meta
#> Loading 'meta' package (version 6.2-1).
#> Type 'help(meta)' for a brief overview.
#> Readers of 'Meta-Analysis with R (Use R!)' should install
#> older version of 'meta' package: https://tinyurl.com/dt4y5drs
#> Loading 'netmeta' package (version 2.8-0).
#> Type 'help("netmeta-package")' for a brief overview.
#> Readers of 'Meta-Analysis with R (Use R!)' should install
#> older version of 'netmeta' package: https://tinyurl.com/kyz6wjbb
data("Dong2013")
# Rename column names to match those used in MBNMAdose
Dong2013 <- Dong2013 %>%
rename(studyID = id, r = death, n = randomized)
```

`mbnma.run()`

The simplest use is in a network that includes a placebo treatment.
In this dataset we do not have any dose-response information, so there
is no value in performing a MBNMA. However, if we assume that every
active treatment in the network is a separate “agent” with a dose of 1,
and that the Placebo treatment has a dose of 0, then we can use the data
in `MBNMAdose`

, and by modelling a linear dose-response
function we estimate parameters that are identical to a standard NMA
model.

```
# Define agents and assign a dose of 1 to all agents
Dong2013 <- Dong2013 %>%
dplyr::rename(agent = treatment) %>%
dplyr::mutate(dose = dplyr::case_when(agent == "Placebo" ~ 0, agent != "Placebo" ~
1))
```

Note that if there is an intervention within the dataset that has
been administered at multiple doses, you can force the dataset to be
analysed either as a “split” network (in which different doses are
assumed to have independent effects) by assigning each of them a
separate `agent`

name (e.g. “warfarinlow”, “warfarinhigh”),
or as a “lumped” network (in which different doses are assumed to have
the same effect) by simply assigning both doses a dose of 1. Further
details of “lumping” and “splitting” and the implications of these
assumptions can be found in [@pedder2021cons].

Once we have reassigned the doses within the dataset we can create an
`"mbnma.network"`

object and create a network plot:

```
summary(network)
#> Description: Network
#> Number of studies: 41
#> Number of treatments: 6
#> Number of agents: 6
#> Median (min, max) doses per agent (incl placebo): 2 (2, 2)
#> Agent-level network is CONNECTED
#> Ttreatment-level network is CONNECTED
plot(network)
```

We can then use a linear dose-response MBNMA to analyse the data. The
coefficients for the linear slope of the dose-response function are
mathematically equivalent to the basic treatment effect parameters
estimated in a standard NMA. Note that the results are equivalent in
both models (allowing for Monte-Carlo error from the MCMC sampling). The
only difference is that the placebo parameter (`beta.1[1]`

)
that is equal to zero is not given in the output.

```
nma.linear <- mbnma.run(network, fun = dpoly(degree = 1), n.iter = 50000)
#> `likelihood` not given by user - set to `binomial` based on data provided
#> `link` not given by user - set to `logit` based on assigned value for `likelihood`
```

```
print(nma.linear)
#> Inference for Bugs model at "C:\Users\hp17602\AppData\Local\Temp\Rtmp6JHL3v\file2de03c5964e5", fit using jags,
#> 3 chains, each with 50000 iterations (first 25000 discarded), n.thin = 25
#> n.sims = 3000 iterations saved
#> mu.vect sd.vect 2.5% 25% 50% 75% 97.5% Rhat n.eff
#> beta.1[2] 0.029 0.081 -0.134 -0.022 0.031 0.083 0.182 1.003 770
#> beta.1[3] -0.071 0.079 -0.227 -0.125 -0.070 -0.017 0.084 1.002 1700
#> beta.1[4] -0.226 0.089 -0.398 -0.287 -0.227 -0.164 -0.055 1.001 2600
#> beta.1[5] -0.082 0.065 -0.210 -0.125 -0.083 -0.038 0.047 1.004 560
#> beta.1[6] 0.417 0.187 0.062 0.288 0.415 0.541 0.793 1.001 3000
#> totresdev 151.967 1262.923 92.371 102.937 109.021 115.938 133.253 1.001 3000
#> deviance 457.667 1262.923 398.070 408.637 414.720 421.638 438.953 1.001 3000
#>
#> For each parameter, n.eff is a crude measure of effective sample size,
#> and Rhat is the potential scale reduction factor (at convergence, Rhat=1).
#>
#> DIC info (using the rule, pD = var(deviance)/2)
#> pD = 45.7 and DIC = 460.4
#> DIC is an estimate of expected predictive error (lower deviance is better).
```

```
print(nma)
#> $jagsresult
#> Inference for Bugs model at "C:\Users\hp17602\AppData\Local\Temp\Rtmp6JHL3v\file2de05e8919bf", fit using jags,
#> 3 chains, each with 50000 iterations (first 25000 discarded), n.thin = 25
#> n.sims = 3000 iterations saved
#> mu.vect sd.vect 2.5% 25% 50% 75% 97.5% Rhat n.eff
#> d[1] 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 1
#> d[2] 0.031 0.083 -0.134 -0.024 0.031 0.086 0.191 1.002 1500
#> d[3] -0.072 0.079 -0.227 -0.126 -0.071 -0.018 0.081 1.001 3000
#> d[4] -0.223 0.087 -0.388 -0.283 -0.223 -0.165 -0.053 1.001 3000
#> d[5] -0.087 0.066 -0.216 -0.131 -0.086 -0.042 0.039 1.005 430
#> d[6] 0.422 0.190 0.055 0.294 0.420 0.550 0.793 1.001 2200
#> totresdev 150.606 1260.226 91.888 101.503 107.988 115.035 130.106 1.002 1800
#> deviance 456.306 1260.226 397.588 407.203 413.688 420.735 435.805 1.001 3000
#>
#> For each parameter, n.eff is a crude measure of effective sample size,
#> and Rhat is the potential scale reduction factor (at convergence, Rhat=1).
#>
#> DIC info (using the rule, pD = var(deviance)/2)
#> pD = 46.6 and DIC = 460.3
#> DIC is an estimate of expected predictive error (lower deviance is better).
#>
#> $trt.labs
#> [1] "Placebo_0" "ICS_1" "LABA_1" "LABA-ICS_1" "TIO-HH_1"
#> [6] "TIO-SMI_1"
#>
#> $UME
#> [1] FALSE
#>
#> attr(,"class")
#> [1] "nma"
```

We can also show the equivalence of results using
`get.relative()`

to compare relative effects from both
models:

Without a placebo, estimation is very similar, but requires renaming
and recoding the network reference intervention to
`"Placebo"`

. This is not strictly necessary, as
`MBNMAdose`

can handle dose-response datasets that do not
include placebo (or dose=0), but it will ensure that parameter estimates
are equivalent between the NMA and MBNMA models and will make it easier
to estimate relative effects. We illustrate this with the Surgical Site
Infection dataset.

```
# Ensure that Suture-absorbable is the network reference
ssi <- ssi_closure %>%
dplyr::mutate(agent = factor(trt, levels = c("Suture-absorbable", unique(ssi_closure$trt)[-1])))
# Set dose=0 for network reference and dose=1 for all other interventions
ssi.plac <- ssi %>%
dplyr::mutate(dose = dplyr::case_when(trt == "Suture-absorbable" ~ 0, TRUE ~
1))
network.plac <- mbnma.network(ssi.plac)
#> Values for `agent` with dose = 0 have been recoded to `Placebo`
#> agent is being recoded to enforce sequential numbering
#> Values for `class` with dose = 0 have been recoded to `Placebo`
#> class is being recoded to enforce sequential numbering
plot(network.plac)
```

```
# Run linear MBNMA model
nma.linear <- mbnma.run(network.plac, fun = dpoly(degree = 1), n.iter = 50000)
#> `likelihood` not given by user - set to `binomial` based on data provided
#> `link` not given by user - set to `logit` based on assigned value for `likelihood`
```

```
summary(nma.linear)
#> ========================================
#> Dose-response MBNMA
#> ========================================
#>
#> Likelihood: binomial
#> Link function: logit
#> Dose-response function: poly
#>
#> Pooling method
#>
#> Method: Common (fixed) effects estimated for relative effects
#>
#>
#> beta.1 dose-response parameter results
#>
#> Pooling: relative effects for each agent
#>
#> |Agent |Parameter | Median| 2.5%| 97.5%|
#> |:-----------------------------------|:----------|-------:|-------:|-------:|
#> |Clips |beta.1[2] | -0.1092| -1.0325| 0.7644|
#> |Suture--monofilament |beta.1[3] | 0.0409| -0.7835| 0.8547|
#> |Staples |beta.1[4] | 0.0508| -0.4981| 0.6225|
#> |Suture |beta.1[5] | -0.0678| -0.7499| 0.6335|
#> |Tissue adhesive gel-low viscosity |beta.1[6] | 0.6546| -0.0432| 1.4223|
#> |Tape/film |beta.1[7] | -0.3141| -1.0268| 0.3796|
#> |Preference of physician |beta.1[8] | -0.2256| -1.4483| 0.9373|
#> |Tissue adhesive gel-high viscosity |beta.1[9] | -0.1890| -1.7639| 1.4849|
#> |Suture-non-absorbable |beta.1[10] | -0.0991| -0.3837| 0.1807|
#> |Suture-antimicrobial |beta.1[11] | -0.2738| -0.4222| -0.1171|
#> |Suture-non-absorbable-monofilament |beta.1[12] | -0.6457| -1.2773| -0.0087|
#> |Suture-absorbable-monofilament |beta.1[13] | -0.5112| -1.1598| 0.1447|
#> |Tissue adhesive gel |beta.1[14] | 1.0033| -1.7288| 4.7404|
#> |Suture-absorbable-multifilament |beta.1[15] | -0.7633| -1.4043| -0.0957|
#> |Suture-non-absorbable-multifilament |beta.1[16] | -1.0425| -1.9982| -0.0851|
#>
#>
#> Model Fit Statistics
#> Effective number of parameters:
#> pD calculated using the Kullback-Leibler divergence = 110.3
#>
#> Deviance = 1016.3
#> Residual deviance = 287.4
#> Deviance Information Criterion (DIC) = 1126.6
```

The linear dose-response coefficients can then be interpreted as the
relative effect for each intervention versus the network reference
(`"Suture-absorbable"`

).

`mbnma.run()`

for standard NMA
modelsNow that we have shown how to specify a standard NMA model within the
MBNMA framework in `mbnma.run()`

, we can now use
`MBNMAdose`

to implement some more interesting models, such
as class effect models and node-splits to assess consistency.

A class effects model can be implemented using the
`class.effect`

argument in `mbnma.run()`

,
introducing either a `"common"`

or 2 class effect on the
single linear dose-response parameter, `beta.1`

:

```
# Random class effect model
nma.class <- mbnma.run(network.plac, fun = dpoly(degree = 1), class.effect = list(beta.1 = "random"),
n.iter = 50000)
```

A `"common"`

class effect assumes that all treatments
within a class have the same effect, whilst a `"random"`

class effect assumes that treatment-level effects are randomly
distributed around a mean class effect with a standard deviation (SD)
that is estimated within the model.

Common and random class effect models can be compared using model fit
statistics (e.g. Deviance Information Criterion) to identify which is
the most parsimonious model. Note that within `MBNMAdose`

when a random class effect is fitted this makes the assumption that all
classes share the same within-class SD. This may not necessarily be
valid, but relaxing this cannot currently be done in
`MBNMAdose`

and it requires specific JAGS code to be
written.