---
title: "Time Varying Mediation Function: Continuous Outcome and Two Treatment Groups"
author:
- name: Yajnaseni Chakraborti
email: yajnaseni.chakraborti@temple.edu
- name: Donna L. Coffman
email: dcoffman@temple.edu
- name: Harry Zobel
email: harryzobeljr@gmail.com
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{Time Varying Mediation Function: Continuous Outcome and Two Treatment Groups}
%\VignetteEngine{knitr::rmarkdown_notangle}
\usepackage[utf8]{inputenc}
---
```{r, include = FALSE}
is_check <- ("CheckExEnv" %in% search()) || any(c("_R_CHECK_TIMINGS_",
"_R_CHECK_LICENSE_") %in% names(Sys.getenv()))
knitr::opts_chunk$set(eval = !is_check)
```
```{r, include = FALSE}
Sys.sleep(100)
```
```{r setup, include = FALSE}
library(dplyr)
library(ggplot2)
library(locpol)
library(stats)
library(tvmediation)
```
## Introduction
The purpose of this vignette is to provide users with a step-by-step guide for performing and interpreting the results of a time varying mediation analysis with 2 treatment (exposure) groups and a continuous outcome. Please note, that this package has been built considering the structure of panel data, where each subject/participant has repeated responses (collected over time) for the outcome and mediator variables. However, we do not address dynamic treatment regimens in this package. Therefore, we assume the scenario where the treatment (exposure) is time-invariant (i.e., does not change over time). For more details, please refer to Cai et al., 2022.
### Data
For illustration, we rely on an example dataset, simulated based on the Wisconsin Smokers' Health Study 2 data (Baker et. al., 2016) which includes 1086 individuals assigned to one of three treatment conditions. One-third of participants received only a `nicotine patch`; another one-third received `varenicline`, and the final third of participants received a `combination nicotine replacement therapy (NRT)` which included nicotine patch + nicotine mini-lozenge. The outcome of interest is `cessation fatigue`; that is, how tired a participant felt of trying to quit smoking (7-point Likert scale). In addition, mediator variables were measured by asking participants if they felt a `negative mood in the last fifteen minutes`, and whether they `wanted to smoke in the last 15 minutes`, also recorded on a 7-point Likert scale. Both the outcome and mediator variables were assessed two times per day for the first two weeks post-quit day (rendering 30 time points of response since assessments start on day 0 post target quit day), and every other day (2x per day) for weeks 3 and 4 (rendering 14 time points of response).
A traditional approach to analyzing this type of data would be to use mediation analysis in which the effects are assumed to not vary as a function of time. First, a single (i.e., time-invariant) direct effect would be calculated by regressing the outcome on the treatment condition and mediator. Next, a time-invariant indirect effect would be computed by multiplying the effect of treatment condition on the mediator by the effect of the mediator on the outcome. However, this method potentially misses important information about the dynamic effect that a mediator may have over time. Specifically, we hypothesize that mood changes across and within days and thus, its mediating effect on one’s success of quitting smoking is likely to vary over time. We therefore propose a time varying mediation analysis which estimates the mediation effect as a function that varies over time.
The `tvma` function was developed for estimating the mediation effect of two treatment (exposure) groups. To illustrate the analysis, we have considered the scenario of `varenicline` vs. `not varenicline` i.e., the subjects taking `nicotine patch` or `combination NRT` were combined into a single group.
## Getting started
To use the time varying mediation analysis package in R, you must first install the package and load it. Before that, make sure you have `R version 4.0.3` or greater. There are two ways to install the package from the CRAN (Comprehensive R Archive Network) repository, by using `install.packages` or the `devtools` function.
```{r, eval = FALSE}
install.packages("tvmediation", dependencies = TRUE)
library(tvmediation)
```
The equivalent code using `devtools` is:
```{r, eval = FALSE}
devtools::install_cran("tvmediation", dependencies = TRUE)
library(tvmediation)
```
If you do not have `devtools` installed and loaded, you can do so using the following code:
```{r, eval = FALSE}
install.packages("devtools", dependencies = TRUE)
library(devtools)
```
Alternatively, if you want to install the package directly from the GitHub repository to access new or revised functions in development, use the following code:
```{r, eval = FALSE}
devtools::install_github("dcoffman/tvmediation", dependencies = TRUE)
library(tvmediation)
```
## Formatting your data before calling the `tvma` function
Once installed, you can type `?tvmediation` in the console to view the package documentation, as well as links to the important functions and data included in the package. The time-varying mediation analysis for continuous outcomes and two exposure groups, relies on two user functions, `tvma` and `LongToWide`, as well as a number of internal functions of the `tvmediation` package.
The `tvma` function has four required and five optional arguments.
1. `treatment` A binary vector indicating the treatment group
2. `t.seq` A numeric vector of the time sequence of the measures
3. `mediator` The matrix of mediator values in wide format
4. `outcome` The matrix of outcome values in wide format
The optional arguments are:
5. `t.est` The time sequence for estimation. This is by default equal to `t.seq`.
6. `plot` TRUE or FALSE for plotting the mediation effect. The default value is "FALSE".
7. `CI` "none" or "boot" method of deriving confidence intervals (CIs). The default value is "boot".
8. `replicates` Number of replicates for bootstrapping CIs. The default value is 1000.
9. `verbose` TRUE or FALSE for printing results to screen. The default value is "FALSE".
The dataset we will use for our illustration is named `smoker` and is included in the package.
To load the simulated dataset `smoker.rda`, type:
```{r}
data(smoker)
```
As discussed earlier, the `tvma` function only supports two treatment groups. A separate function `tvma_3trt` for three treatment groups is also available.
The `smoker` data is organized in **long format** with `SubjectID` repeating over multiple rows for each participant. The `tvma` function requires that the data be in **wide format** to estimate the time varying coefficients. The `tvmediation` package includes a useful function `LongToWide` to help users properly format their data for analysis.
`LongToWide` has three required arguments and a fourth optional argument.
1. `subject.id` specifies the column of subject identifiers.
2. `time.sequences` specifies the column of measurement times.
3. `outcome` specifies the column for the variable (either the outcome or the mediator) that will be transposed.
4. `verbose` is an optional argument that if "TRUE" prints the output of `LongToWide` to the console. The default value is "FALSE".
The output of `LongToWide` is a matrix of data in wide format where columns represent the subjects and rows represent the time sequence. Thus, each cell contains the j-th subject's response at the i-th time point.
The `tvma` function requires two matrices, one for the mediator, and one for the outcome. Thus, we use the `LongToWide` function twice as illustrated below:
```{r}
mediator <- LongToWide(smoker$SubjectID, smoker$timeseq, smoker$NegMoodLst15min)
outcome <- LongToWide(smoker$SubjectID, smoker$timeseq, smoker$cessFatig)
```
```{r}
class(mediator)
mediator[1:16, 1:10]
```
```{r}
class(outcome)
outcome[1:16, 1:10]
```
If your data are already in wide format, there is no need to use the `LongToWide` function and you can simply subset your dataset. However, `mediator` and `outcome` must be of class `matrix`; hence make sure you convert the class of the subsetted `mediator` and `outcome` objects to `matrix` before proceeding. This can be done using the R function `as.matrix`.
The `tvma` function requires two more variables that we have not yet created:
1. `treatment` A binary numeric vector indicating the treatment group
2. `t.seq` A numeric vector of the time sequence of the measures
We can create these variables as follows. Because `treatment` is time-invariant, we need only one instance of each subject's response for `varenicline`. We then convert it to a numeric value and subtract 1 to yield a vector of zeros and ones, as shown below.
```{r}
# Step 1: Since each subject has multiple rows of data, extract the unique response of each subject to receiving varenicline. The data is still in dataframe format.
trt1 <- unique(smoker[ , c("SubjectID","varenicline")])
trt1[1:10,]
# Step 2: `2` is assigned to those subjects who received varenicline and `1` to the rest. The data is now in vector format.
trt2 <- as.numeric(trt1[ , 2])
trt2[1:10]
# Step 3: subtract 1 from these numeric responses to procure a vector of zeros and ones
treatment <- trt2 -1
treatment[1:10]
```
This steps can alternatively be collated into a single step and written as follows:
```{r}
treatment <- as.numeric(unique(smoker[ , c("SubjectID","varenicline")])[, 2])-1
treatment[1:10]
```
As discussed earlier, the goal in this example is estimating the time varying effect of `varenicline` compared to `not varenicline` on `cessation fatigue`, as mediated via `negative mood in the last fifteen minutes`. We could also look at the effect of `varenicline` vs. `nicotine patch only` or `combination NRT` vs. `varenicline` with an additional step of excluding the subjects belonging to the treatment group that is not of interest, and then following the steps described above. Please refer to the vignette for the `tvmb` function for an illustration of the steps involved when considering `varenicline` vs. `nicotine patch only` or `combination NRT` vs. `varenicline` or `combination NRT` vs. `nicotine patch only`.
To generate `t.seq` we found the unique instance of each time point and then sorted from smallest to largest. There are 44 unique time points in the dataset where `0` after the decimal indicates the morning measurement and `5` after the decimal indicates the evening measurement recorded for that day.
```{r}
t.seq <- sort(unique(smoker$timeseq))
t.seq
```
We are now ready to perform the time varying mediation analysis.
## Calling the `tvma` function
As discussed earlier, the `tvma` function has four required and five optional arguments.
1. `treatment` A binary vector indicating the treatment group
2. `t.seq` A numeric vector of the time sequence of the measures
3. `mediator` The matrix of mediator values in wide format
4. `outcome` The matrix of outcome values in wide format
The optional arguments are:
5. `t.est` The time sequence for estimation. This is by default equal to `t.seq`.
6. `plot` TRUE or FALSE for plotting the mediation effect. The default value is "FALSE".
7. `CI` "none" or "boot" method of deriving CIs. The default value is "boot".
8. `replicates` Number of replicates for bootstrapping CIs. The default value is 1000.
9. `verbose` TRUE or FALSE for printing results to screen. The default value is "FALSE".
We will call the function with the optional arguments `plot=TRUE` and `replicates = 250`. We decreased the number of bootstrap replicates so that this vignette compiles faster but we suggest using at least 500 replicates in an actual analysis. The remaining optional arguments are left to their respective default values.
```{r include=FALSE}
rm(smoker)
```
```{r, fig.width = 7, fig.height = 5, results='hide', fig.keep='all'}
results <- tvma(treatment, t.seq, mediator, outcome,
plot = TRUE, replicates = 250)
```
## Results
The `tvma` function returns a list of results that include:
1. `hat.alpha` estimated time-varying treatment effect on the mediator
2. `CI.lower.alpha` CI lower limit for `hat.alpha`
3. `CI.upper.alpha` CI upper limit for `hat.alpha`
4. `hat.gamma` estimated time-varying direct effect of the treatment on the outcome
5. `CI.lower.gamma` CI lower limit for `hat.gamma`
6. `CI.upper.gamma` CI upper limit for `hat.gamma`
7. `hat.beta` estimated time-varying effect of the mediator on the outcome
8. `CI.lower.beta` CI lower limit for `hat.beta`
9. `CI.upper.beta` CI upper limit for `hat.beta`
10. `hat.tau` estimated time-varying total treatment effect on the outcome
11. `CI.lower.tau` CI lower limit for `hat.tau`
12. `CI.upper.tau` CI upper limit for `hat.tau`
13. `est.M` the time-varying mediation effect of treatment on the outcome
Optional returns based on argument `CI = "boot"` include:
14. `boot.se.m` estimated standard error for the time-varying mediation effect, `est.M`
15. `CI.lower` CI lower limit for the time-varying mediation effect, `est.M`
16. `CI.upper` CI upper limit for the time-varying mediation effect, `est.M`
The above estimates are compiled in a single dataframe which can be accessed using `nameOfStoredResultsObj$Estimates`. For example, the following line of code displays the estimates for the first 6 time-points.
```{r}
head(results$Estimates)
```
At each time point of interest, `t.est`, which in this case is equal to `t.seq`, the time-varying effects of the treatment on the mediator, the treatment on the outcome (adjusted and not adjusted for mediator), and the mediator on the outcome are estimated along with the respective 95% CIs. The CIs are computed via a non-parametric bootstrap method (Efron and Tibshirani, 1986), drawing samples of size 1086 from the original sample with replacement, estimating the sample mean and then applying the percentile method to compute the 95% CIs. Note that the CIs for the `alpha`, `gamma`, `beta` and `tau` coefficients `(hat.alpha, hat.gamma, hat.beta, hat.tau)` are computed regardless of the value of `CI` argument in the function. `est.M` is the estimated mediation effect of `varenicline` compared to the other two treatment groups, that varies over `t.est`. For `CI = "boot"` (which is the default option unless the user chooses otherwise) the standard error of the estimated mediation effect and 95% CI is estimated via a similar bootstrapping technique described earlier for the other coefficients.
If `plot = TRUE`, the results will also include the following figures:
17. `Alpha_CI` plot for `hat.alpha` with 95% CIs across `timeseq`
18. `Gamma_CI` plot for `hat.gamma` with 95% CIs across `timeseq`
19. `Tau_CI` plot for `hat.tau` with 95% CIs across `timeseq`
20. `Beta_CI` plot for `hat.beta` with 95% CIs across `timeseq`
21. `MedEff` plot for `est.M` across `timeseq`
22. `MedEff_CI` plot for `est.M` with 95% CIs across `timeseq`
We recommend using the plots to interpret the estimates as it may be difficult to derive meaning from the numerical values alone. To display the plots, use `nameOfStoredResultsObj$` followed by the name of the plot to access the required plot accordingly. For example:
```{r, fig.width = 10, fig.height = 5}
results$Alpha_CI
```
In the above plot, the effect of `varenicline` on subjects' feeling of `negative mood in the last fifteen minutes` is negative compared to the other two treatment groups and mostly stable with a slight decreasing trend over time.
```{r, fig.width = 10, fig.height = 5}
results$Gamma_CI
```
The above plot shows the time-varying direct effect of `varenicline` on the outcome `cessation fatigue` that is positive in the `varenicline` group compared to the other two treatment groups. That is, those assigned to `varenicline` have greater `cessation fatigue` than the other two treatment groups. The estimated 95% CI does not cover 0 over time, indicating that the effect is statistically significant.
```{r, fig.width = 10, fig.height = 5}
results$Beta_CI
```
In the above plot, the effect of subjects' `negative mood in the last fifteen minutes` on the outcome `cessation fatigue` is increases initially, albeit with a slight decrease around day 6-7 (end of week 1), and then decreases beginning around day 20-21 (end of week 3). The effect is positive such that an increase in negative mood is related to an increase in cessation fatigue.
```{r, fig.width = 10, fig.height = 5}
results$Tau_CI
```
The above plot shows the time-varying total effect of `varenicline` on the outcome `cessation fatigue`. The estimated 95% CI covers 0 (no effect) throughout the time period and thus, the effect is not statistically significant.
```{r, fig.width = 10, fig.height = 5}
results$MedEff
results$MedEff_CI
```
In the above plot, the effect of `varenicline` on `cessation fatigue` that is mediated by `negative mood in the last fifteen minutes` is negative compared to the patch only or combination NRT group. That is, `varenicline` reduces cessation fatigue due to a decrease in negative mood. This effect decreases (i.e., becomes stronger) during the first week and then stabilizes after day 6. Beyond week 2 the effect begins to decrease again, and then increases somewhat after week 3. Given that the CIs do not include zero, we can conclude that this effect is significant.
As discussed earlier, `tvma` accepts additional input arguments that allow the user to modify the analyses. For example, specifying `t.est` can be specified to select only certain time points at which to make the estimations. The following code will produce estimates at time points 0.2, 0.4, 0.6, and 0.8 using 250 bootstrap replicates.
```{r, fig.width = 6, fig.height = 4, results = 'hide', fig.keep = 'all'}
results_new <- tvma(treatment, t.seq, mediator, outcome,
t.est = c(0.2, 0.4, 0.6, 0.8), replicates = 250)
```
```{r}
results_new
```
The `tvma` function computes bootstrap confidence intervals by default. Therefore, if the user decides to not bootstrap CIs for the mediation effect by specifying `CI = "none"`, but by mistake also specifies `replicates = 250`, the function will not display an error, but will simply execute without computing the CIs for mediation effect. Note that the CIs for the effects of the treatment on the mediator and the mediator on the outcome, and for the direct and total effects are computed even if the user passes the argument `CI = "none"`.
## Summary
The `tvmediation` package provides a set of functions for estimating mediation effects that vary over time for both binary and continuous time-varying outcomes. Currently, the package only allows for a time-invariant treatment. The mediator and outcome are assumed to be time-varying, such as intensive longitudinal measurements obtained via Ecological Momentary Assessment or via wearable and mobile devices. The development of this tool has widespread application for use in human behavior research, clinical trials, addiction research, and others by allowing specification of mediation effects that vary as a function of time.
## References
1. Cai X, Coffman DL, Piper ME, Li R. Estimation and inference for the mediation effect in a time-varying mediation model. BMC Med Res Methodol. 2022;22(1):1-12.
2. Baker TB, Piper ME, Stein JH, et al. Effects of Nicotine Patch vs Varenicline vs Combination Nicotine Replacement Therapy on Smoking Cessation at 26 Weeks: A Randomized Clinical Trial. JAMA. 2016;315(4):371.
3. B. Efron, R. Tibshirani. Bootstrap Methods for Standard Errors, Confidence Intervals, and Other Measures of Statistical Accuracy. Statistical Science. 1986;1(1):54-75.
---