Study-level covariates can be included in the model to adjust treatment effects following an approach for meta-regression outlined in NICE Technical Support Document 3 (Dias et al. 2011). This can be used to explore and account for potential effect modification.
Following the definition in NICE Technical Support Document 3, network meta-regression can be expressed as an interaction on the treatment effect in arms \(\geq2\):
\[\theta_{i,k}=\mu_i+(f(x,\beta_{a_{i,k}})-f(x,\beta_{a_{i,1}})) + (\psi_{1,a_{i,k}}-\psi_{1,a_{i,1}})\]
where \(\theta_{i,k}\) is the linear predictor, \(\mu_{i}\) is the baseline effect on arm 1, \(f(x,\beta_{a_{i,k}})\) is the dose-response function at dose \(x\) with dose-response parameters \(\beta_{a_{i,k}}\) for agent \(a\) in arm \(k\) of study \(i\). \(\psi_{1,a_{i,k}}\) is then the effect modifying interaction between the agent in arm \(k\) and the network reference agent (typically Placebo in a dose-response analysis).
To improve estimation:
# Using the SSRI dataset
ssri.reg <- ssri
# For a continuous covariate
ssri.reg <- ssri.reg %>%
dplyr::mutate(x.weeks = weeks - mean(weeks, na.rm = TRUE))
# For a categorical covariate
table(ssri$weeks) # Using 8 weeks as the reference
ssri.reg <- ssri.reg %>%
dplyr::mutate(r.weeks = factor(weeks, levels = c(8, 4, 5, 6, 9, 10)))
# Create network object
ssrinet <- mbnma.network(ssri.reg)
#> Values for `agent` with dose = 0 have been recoded to `Placebo`
#> agent is being recoded to enforce sequential numbering
For performing network meta-regression, different assumptions can be made regarding how the effect modification may be shared across agents:
The least constraining assumption available in MBNMAdose
is to assume that the effect modifier acts on each agent independently,
and separate \(\psi_{1,a_{i,k}}\) are
therefore estimated for each agent in the network.
A slightly stronger assumption is to assume that agents within the same class share the same interaction effect, though classes must be specified within the dataset for this.
# Regress for continuous weeks Separate effect modification for each agent vs
# Placebo
ssrimod.a <- mbnma.run(ssrinet, fun = dfpoly(degree = 2), regress = ~x.weeks, regress.effect = "agent")
summary(ssrimod.a)
#> ========================================
#> Dose-response MBNMA
#> ========================================
#>
#> Likelihood: binomial
#> Link function: logit
#> Dose-response function: fpoly
#>
#> 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%|
#> |:------------|:---------|-------:|-------:|-------:|
#> |citalopram |beta.1[2] | -0.0918| -0.3633| 0.1763|
#> |escitalopram |beta.1[3] | 0.1262| -0.1332| 0.4094|
#> |fluoxetine |beta.1[4] | 0.2672| 0.0315| 0.5076|
#> |paroxetine |beta.1[5] | -0.1297| -0.4268| 0.1498|
#> |sertraline |beta.1[6] | 1.2632| -7.9794| 10.5994|
#>
#>
#> beta.2 dose-response parameter results
#>
#> Pooling: relative effects for each agent
#>
#> |Agent |Parameter | Median| 2.5%| 97.5%|
#> |:------------|:---------|-------:|-------:|------:|
#> |citalopram |beta.2[2] | 0.0670| -0.0048| 0.1416|
#> |escitalopram |beta.2[3] | -0.0072| -0.0941| 0.0762|
#> |fluoxetine |beta.2[4] | -0.0643| -0.1341| 0.0020|
#> |paroxetine |beta.2[5] | 0.0885| -0.0001| 0.1804|
#> |sertraline |beta.2[6] | -0.1762| -1.1908| 0.8275|
#>
#>
#> power.1 dose-response parameter results
#>
#> Assigned a numeric value: 0
#>
#> power.2 dose-response parameter results
#>
#> Assigned a numeric value: 0
#>
#> Meta-regression
#>
#> Covariates interacting with study-level relative effects: x.weeks
#> Common (identical) covariate-by-agent effects
#>
#>
#> |Agent |Parameter | Median| 2.5%| 97.5%|
#> |:------------|:------------|-------:|--------:|-------:|
#> |citalopram |B.x.weeks[2] | -0.1572| -0.3351| 0.0174|
#> |escitalopram |B.x.weeks[3] | 0.1607| -0.0198| 0.3581|
#> |fluoxetine |B.x.weeks[4] | -0.0273| -0.1719| 0.1150|
#> |paroxetine |B.x.weeks[5] | 0.0834| -0.0226| 0.1905|
#> |sertraline |B.x.weeks[6] | 1.3607| -18.3176| 21.0890|
#>
#>
#> Model Fit Statistics
#> Effective number of parameters:
#> pD calculated using the Kullback-Leibler divergence = 75.3
#>
#> Deviance = 890.5
#> Residual deviance = 190.8
#> Deviance Information Criterion (DIC) = 965.9
Within the output, a separate parameter (named
B.x.weeks[]
) has been estimated for each agent that
corresponds to the effect of an additional week of study follow-up on
the relative effect of the agent versus Placebo. Note that due to the
inclusion of weeks as a continuous covariate, we are assuming a linear
effect modification due to study follow-up.
Alternatively, the effect modification for different agents versus the network reference agent can be assumed to be exchangeable/shared across the network about a common mean, \(\hat{\psi}\), with a between-agent standard deviation of \(\tau_\psi\):
\[\psi_{1,a_{i,k}} \sim N(\hat{\psi}, \tau^2_\psi)\]
# Regress for continuous weeks Random effect modification across all agents vs
# Placebo
ssrimod.r <- mbnma.run(ssrinet, fun = dfpoly(degree = 2), regress = ~x.weeks, regress.effect = "random")
summary(ssrimod.r)
#> ========================================
#> Dose-response MBNMA
#> ========================================
#>
#> Likelihood: binomial
#> Link function: logit
#> Dose-response function: fpoly
#>
#> 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%|
#> |:------------|:---------|-------:|-------:|------:|
#> |citalopram |beta.1[2] | -0.0502| -0.3791| 0.2425|
#> |escitalopram |beta.1[3] | 0.2399| -0.1198| 0.6250|
#> |fluoxetine |beta.1[4] | 0.2686| 0.0319| 0.5141|
#> |paroxetine |beta.1[5] | -0.0813| -0.4011| 0.2301|
#> |sertraline |beta.1[6] | 0.6194| -0.0233| 1.1547|
#>
#>
#> beta.2 dose-response parameter results
#>
#> Pooling: relative effects for each agent
#>
#> |Agent |Parameter | Median| 2.5%| 97.5%|
#> |:------------|:---------|-------:|-------:|------:|
#> |citalopram |beta.2[2] | 0.0570| -0.0255| 0.1489|
#> |escitalopram |beta.2[3] | -0.0331| -0.1658| 0.0832|
#> |fluoxetine |beta.2[4] | -0.0647| -0.1362| 0.0044|
#> |paroxetine |beta.2[5] | 0.0779| -0.0210| 0.1805|
#> |sertraline |beta.2[6] | -0.1051| -0.2175| 0.0245|
#>
#>
#> power.1 dose-response parameter results
#>
#> Assigned a numeric value: 0
#>
#> power.2 dose-response parameter results
#>
#> Assigned a numeric value: 0
#>
#> Meta-regression
#>
#> Covariates interacting with study-level relative effects: x.weeks
#> Random (exchangeable) covariate-by-treatment effects
#>
#>
#> |Regression effect |Parameter | Median| 2.5%| 97.5%|
#> |:-----------------|:---------|------:|-------:|------:|
#> |Random effect |B.x.weeks | 0.0213| -0.0712| 0.1294|
#>
#>
#> Standard deviation for random covariate-by-treatment effects
#>
#> |Parameter | Median| 2.5%| 97.5%|
#> |:------------|------:|------:|------:|
#> |sd.B.x.weeks | 0.0616| 0.0027| 0.2417|
#>
#>
#> Model Fit Statistics
#> Effective number of parameters:
#> pD calculated using the Kullback-Leibler divergence = 79.5
#>
#> Deviance = 890.9
#> Residual deviance = 191.2
#> Deviance Information Criterion (DIC) = 970.3
In this case only a single regression paramter is estimated
(B.x.weeks
), which corresponds to the mean effect of an
additional week of study follow-up on the relative effect of an active
agent versus Placebo. A parameter is also estimated for the
between-agent standard deviation, sd.B.x.weeks
.
This is the strongest assumption for network meta-regression, and it implies that effect modification is common (equal) for all agents versus the network reference agent:
\[\psi_{1,a_{i,k}} =\hat{\psi}\]
# Regress for categorical weeks Common effect modification across all agents vs
# Placebo
ssrimod.c <- mbnma.run(ssrinet, fun = dfpoly(degree = 2), regress = ~r.weeks, regress.effect = "common")
summary(ssrimod.c)
#> ========================================
#> Dose-response MBNMA
#> ========================================
#>
#> Likelihood: binomial
#> Link function: logit
#> Dose-response function: fpoly
#>
#> 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%|
#> |:------------|:---------|-------:|-------:|------:|
#> |citalopram |beta.1[2] | -0.0682| -0.3508| 0.1992|
#> |escitalopram |beta.1[3] | 0.2450| 0.0129| 0.4716|
#> |fluoxetine |beta.1[4] | 0.2183| -0.0236| 0.4572|
#> |paroxetine |beta.1[5] | -0.1087| -0.3983| 0.1884|
#> |sertraline |beta.1[6] | 0.5880| 0.1184| 1.0726|
#>
#>
#> beta.2 dose-response parameter results
#>
#> Pooling: relative effects for each agent
#>
#> |Agent |Parameter | Median| 2.5%| 97.5%|
#> |:------------|:---------|-------:|-------:|-------:|
#> |citalopram |beta.2[2] | 0.0601| -0.0139| 0.1345|
#> |escitalopram |beta.2[3] | -0.0284| -0.1083| 0.0518|
#> |fluoxetine |beta.2[4] | -0.0549| -0.1224| 0.0136|
#> |paroxetine |beta.2[5] | 0.0850| -0.0093| 0.1755|
#> |sertraline |beta.2[6] | -0.1023| -0.1977| -0.0062|
#>
#>
#> power.1 dose-response parameter results
#>
#> Assigned a numeric value: 0
#>
#> power.2 dose-response parameter results
#>
#> Assigned a numeric value: 0
#>
#> Meta-regression
#>
#> Covariates interacting with study-level relative effects: r.weeks4, r.weeks5, r.weeks6, r.weeks9, r.weeks10
#> Common (identical) covariate-by-treatment effects
#>
#>
#> |Regression effect |Parameter | Median| 2.5%| 97.5%|
#> |:-----------------|:-----------|-------:|-------:|-------:|
#> |Common effect |B.r.weeks10 | 0.1472| -0.2413| 0.5462|
#> |Common effect |B.r.weeks4 | -0.7333| -1.4404| -0.0384|
#> |Common effect |B.r.weeks5 | 0.8231| -0.1713| 1.8956|
#> |Common effect |B.r.weeks6 | 0.0565| -0.1352| 0.2437|
#> |Common effect |B.r.weeks9 | 0.4230| -0.3840| 1.3071|
#>
#>
#> Model Fit Statistics
#> Effective number of parameters:
#> pD calculated using the Kullback-Leibler divergence = 75.5
#>
#> Deviance = 891.3
#> Residual deviance = 191.6
#> Deviance Information Criterion (DIC) = 966.7
In this case we have performed the network meta-regression on study follow-up (weeks) as a categorical covariate. Therefore, although only a single parameter is estimated for each effect modifying term, there is a separate term for each category of week and a linear relationship for effect modification is no longer assumed.
Although this is beyond the capability of MBNMAdose
, one
could envision a more complex model in which the interaction effect also
varied by a dose-response relationship, rather than assuming an effect
by agent/class or across the whole network. This would in principle
contain fewer parameters than a fully independent interaction model (in
which a separate regression covariate is estimated for each treatment in
the dataset).
Note that adjusting for aggregated patient-level covariates
(e.g. mean age, % males, etc.) whilst using a non-identity link function
can introduce aggregation bias. This is a form of ecological bias that
biases treatment effects towards the null and is typically more severe
where treatment effects are strong and where the link function is highly
non-linear (Dias et al. 2011). This can be
resolved by performing a patient-level regression, but Individual
Participant Data are required for this and such an analysis is outside
the scope of MBNMAdose
.
Models fitted with meta-regression can also be used to make
predictions for a specified set of covariate values. This includes when
estimating relative effects using get.relative()
. An
additional argument regress.vals
can be used to provide a
named vector of covariate values at which to make predictions.
# For a continuous covariate, make predictions at 5 weeks follow-up
pred <- predict(ssrimod.a, regress.vals = c(x.weeks = 5))
plot(pred)
Predictions are very uncertain for Sertraline, as studies only investigated this agent at 6 weeks follow-up and therefore the agent-specific effect modification is very poorly estimated.
# For a categorical covariate, make predictions at 10 weeks follow-up
regress.p <- c(r.weeks10 = 1, r.weeks4 = 0, r.weeks5 = 0, r.weeks6 = 0, r.weeks9 = 0)
pred <- predict(ssrimod.c, regress.vals = regress.p)
plot(pred)
Note that categorical covariates are modelled as multiple binary dummy covariates, and so a value for each of these must be included.