library(MBNMAdose) #devtools::load_all() library(rmarkdown) library(knitr) library(dplyr) knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 7, fig.height = 5, include=TRUE, tidy.opts=list(width.cutoff=80), tidy=TRUE )
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 [@TSD3]. 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)
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)
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)
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)
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 [@TSD3]. 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.
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.