% setwd("d:/dev/twang/{t/doc") % Sweave("twang.rnw"); system("texify twang.tex"); system("c:\\MiKTeX\\miktex\\bin\\yap.exe twang.dvi",wait=FALSE) \SweaveOpts{prefix.string=twang} \documentclass{article} \bibliographystyle{plain} \usepackage[active]{srcltx} \usepackage{url} \addtolength{\topmargin}{-0.5in} \addtolength{\textheight}{0.75in} \addtolength{\oddsidemargin}{-0.5in} \addtolength{\textwidth}{1in} \newcommand{\EV}{\mathrm{E}} \newcommand{\Var}{\mathrm{Var}} \newcommand{\aRule}{\begin{center} \rule{5in}{1mm} \end{center}} %% Tracking changes and notes code added by Dan Mc 6-30-2014 %% \usepackage[normalem]{ulem} % for "tracked changes" \usepackage{color} % for "tracked changes" \newcommand{\note}[1]{{\color{blue} #1}} \newcommand{\dele}[1]{\textcolor{red}{\sout{#1}}} % delet in an equation \newcommand{\ins}[1]{\textcolor{blue}{\bf #1}} % insert \title{Propensity scores for repeated treatments:\\A tutorial for the \texttt{iptw} function in the \texttt{twang} package} \author{Lane Burgette, Beth Ann Griffin and Dan McCaffrey \footnote{The development of this software and tutorial was funded by National Institute of Drug Abuse grants number 1R01DA015697 (PI: McCaffrey) and 1R01DA034065 (PIs: Griffin/McCaffrey).} \\RAND Corporation} %\VignetteIndexEntry{Propensity scores for time-varying treatments: A tutorial for the iptw function} %\VignetteDepends{gbm,survey,xtable} %\VignetteKeywords{propensity score, nonresponse weighting} %\VignettePackage{twang} \newcommand{\mathgbf}[1]{{\mbox{\boldmath$#1$\unboldmath}}} \begin{document} \SweaveOpts{concordance=TRUE} \maketitle \section{Introduction} While standard propensity score methods attempt to answer the question of how expected outcomes change if a group of individuals received one treatment instead of another, researchers are often interested in understanding how {\em sequences} of treatments impact outcomes of interest. In this case, time-varying confounders may be impacted by prior treatments. Consequently, simply controlling for the time-varying confounders in standard regression models can yield biased results. Instead, it is possible to perform weighted regressions that account for time-varying confounders via {\em marginal structural models} (MSMs; Robins et al., 2000). In this method, observations are weighted by the inverse of the estimated probability of receiving the observed sequence of treatments the individual actually received, referred to as an {\em inverse probability of treatment weight} (IPTW). It has been proposed to use nonparametric models to estimate IPTWs (Griffin et al., 2014). Accordingly, we refer to the function in \texttt{twang} that performs this weighting as \texttt{iptw}, for inverse probability of treatment weighting. For binary treatments, the \texttt{iptw} methods and syntax build directly on the \texttt{ps} functionality; users are encouraged to study that tutorial before using \texttt{iptw}. For treatment regimes with more than two categories, the \texttt{iptw} methods build on the \texttt{mnps} methods and software. For more background on marginal structural models, see e.g., Robins et al.\ (2000) and Cole and Hern\'an (2008). \section{An IPTW example} <>= options(width=80) @ For the sake of illustration, we simulated data to demonstrate the functionality of the \texttt{iptw} command. For time-varying treatment data, one can either imagine a ``wide'' dataset, with one row per subject, or a ``long'' dataset with one row for each subject/time point combination. Our artificial data include time-invariant characteristics \texttt{gender}, and \texttt{age} at time of study enrollment. Conceptually, we have a substance use index that is measured four times: at baseline, after the first treatment period, after the second treatment period, and after the third treatment period, which concludes the study and is the outcome of interest. In the ``wide'' version of the dataset called \texttt{iptwExWide}, we have the \texttt{outcome}, baseline and intermediate measures, \texttt{use0}, \texttt{use1}, and \texttt{use2}. The treatment indicators are, in chronological order, \texttt{tx1}, \texttt{tx2}, and \texttt{tx3}. Our goal is to estimate the average effect of each additional dose of treatment on substance use measured at the end of the study (which is recorded in \texttt{outcome}). The ``long'' format data have a somewhat different form, and are included in the data object \texttt{iptwExLong}. For the long format, the outcomes are split from the covariates, and are available as \texttt{iptwExLong\$outcome}. Similarly, the covariates and treatment indicators are available in \texttt{covariates}, which includes data elements \texttt{gender}, \texttt{age}, \texttt{use}, and \texttt{tx}; these include the same information as the wide version. Additionally, the long version contains elements \texttt{ID} (an individual-level identifier) and \texttt{time}, which corresponds to the study period. One of the benefits of GBM for applied researchers is the automatic handling of missing data. For MSMs, however, this does not extend to partially observed treatment histories. We assume throughout that missingness exists only in the covariates. \subsection{Fitting the model} To begin, we will work with the ``wide'' version of the data, which are available after loading the twang package: <<>>= library(twang) data(iptwExWide) @ Next, we can fit the model using the \texttt{iptw} function. Unlike for the standard \texttt{ps} function, we are only able to use a single stop.method at a time. The treatment assignment models are specified as a list of formulas, starting at the earliest time period. For coding parsimony, terms that should appear in all of the formulas can be specified once via a one-sided formula using the \texttt{timeInvariant} argument. Similarly, including treatment indicators from previous models is achieved by setting \texttt{priorTreatment = TRUE}. Finally, if all terms included at period $t$ should be included in the period $t+1$ model (as is typically the case in MSM models), setting \texttt{cumulative = TRUE} automatically includes all elements on the right-hand side of previous models. Thus, the model <>= iptw.Ex <- iptw(list(tx1 ~ use0 + gender + age, tx2 ~ use1 + use0 + tx1 + gender + age, tx3 ~ use2 + use1 + use0 + tx2 + tx1 + gender + age), timeInvariant ~ gender + age, data = iptwExWide, cumulative = FALSE, priorTreatment = FALSE, verbose = FALSE, stop.method = "es.max", n.trees = 5000) @ can be specified more simply as: <<>>= iptw.Ex <- iptw(list(tx1 ~ use0, tx2 ~ use1, tx3 ~ use2), timeInvariant ~ gender + age, data = iptwExWide, cumulative = TRUE, priorTreatment = TRUE, verbose = FALSE, stop.method = "es.max", n.trees = 5000) @ After having fit the \texttt{iptw} object, the diagnostic checks are similar to those specified for \texttt{ps} objects. First, we check to make sure that the GBM models were allowed to run long enough (i.e., \texttt{n.trees} is sufficiently large). \begin{center} <>= plot(iptw.Ex, plots = 1) @ \end{center} Next, we can get a quick sense of the balance at each timepoint via <<>>= summary(iptw.Ex) @ Further detail regarding the model at, e.g., the third time period is available using <<>>= bal.table(iptw.Ex, timePeriods = 3) @ Next, we can examine propensity score overlap at each time point: \begin{center} <>= plot(iptw.Ex, plots = 2) @ \end{center} These figures can focus on the results from particular time periods using the \texttt{timePeriods} argument: \begin{center} <>= plot(iptw.Ex, plots = 2, timePeriods = 2:3) @ \end{center} Next, we can check balance as measured by standardized mean differences between the treated and control samples at each of the time points by specifying \texttt{plots = 3}. As with other TWANG figures, we can specify \texttt{color = FALSE} to produce black and white figures. \begin{center} <>= plot(iptw.Ex, plots = 3, color = FALSE) @ \end{center} Finally, we can compare the differences between the treated and control samples using $t$-test and KS $p$-values by specifying \texttt{plots = 4} and \texttt{plots = 5}, respectively. \begin{center} <>= plot(iptw.Ex, plots = 4) @ \end{center} \begin{center} <>= plot(iptw.Ex, plots = 5) @ \end{center} Further, \texttt{iptw} can accommodate treatments with more than two levels (McCaffrey et al., 2013). An example can be explored in the following call, though we do not discuss it further in this vignette. See the \texttt{mnps} vignette for more information on the diagnostic plots. <>= data(mnIptwExWide) mniptw.Ex <- iptw(list(tx1 ~ use0, tx2 ~ use1, tx3 ~ use2), timeInvariant ~ gender + age, data = mnIptwExWide, cumulative = TRUE, priorTreatment = TRUE, verbose = FALSE, stop.method = "es.max", n.trees = 5000) @ \section{Estimating treatment effects} After having estimated the relevant propensity scores, the final step is translating them into analytic weights and estimating treatment effects. Twang provides several functions to facilitate this process. For this analysis, we assume an additive treatment model, where the mean change in outcomes depends on the number of periods of treatment. Because the weights often have substantial variation, the weights are commonly {\em stabilized} where the standard inverse probability of treatment weights are multiplied by the estimated probability of receiving the treatment that each individual received, conditioning only on previous periods' treatment indicators. To begin, we calculate {\em unstablilized} weights. These are computed as the inverse probability of treatment weight, and are available as <<>>= unstabWt1 <- get.weights.unstab(iptw.Ex) @ We can estimate the treatment effect using these unstabilized weights as follows. the number of periods of treatment for each individual <<>>= library(survey) nTx <- with(iptwExWide, tx1 + tx2 + tx3) outDatUnstab <- data.frame(outcome = iptwExWide$outcome, nTx, wt = unstabWt1$es.max.ATE) sv1unstab <- svydesign(~1, weights = ~wt, data = outDatUnstab) @ We can then calculate the point estimate and 95\% confidence interval using the unstabilized weights as <<>>= fitUnstab <- svyglm(outcome ~ nTx, sv1unstab) coef(fitUnstab) confint(fitUnstab) @ To calculate the stabilized weights, we additionally calculate a stabilizing factor that depends on on the marginal probabilities of treatment. This can be done via <<>>= fitList <- list(glm(tx1 ~ 1, family = binomial, data = iptwExWide), glm(tx2 ~ tx1, family = binomial, data = iptwExWide), glm(tx3 ~ tx1 + tx2, family = binomial, data = iptwExWide)) numWt <- get.weights.num(iptw.Ex, fitList) stabWt1 <- unstabWt1 * numWt outDatStab <- data.frame(outcome = iptwExWide$outcome, nTx, wt = stabWt1$es.max.ATE) sv1stab <- svydesign(~1, weights = ~wt, data = outDatStab) @ As before, we can then estimate the treatment effect and associated confidence interval <<>>= fitStab <- svyglm(outcome ~ nTx, sv1stab) coef(fitStab) confint(fitStab) @ Since these are simulated data, we know that the true treatment effect is -0.1. We can see that both of the propensity score-weighted estimates cover the true treatment effect. For comparison, we examine the unadjusted effect estimate, which we see does not include the true value: <<>>= confint(lm(iptwExWide$outcome ~ nTx)) @ \section{Conclusion} Frequently, researchers are interested in treatments that may vary period-by-period. Twang's \texttt{iptw} function provides a nonparametric method for calculating inverse probability of treatment weights for marginal structural models. The function can accommodate treatments with two or more levels. The diagnostic figures and tables build on of the \texttt{mnps} and \texttt{ps} commands, with additional features to help manage the numerous possible comparisons. \section{References} Cole, S.R.\ and Hern\'an (2008). ``Constructing inverse probability weights for marginal structural models.'' {\em American Journal of Epidemiology}, 168(6), 656-664. Griffin, B.A., R.\ Ramchand, D.\ Almirall, M.E.\ Slaughter, L.F.\ Burgette, and D.F.\ McCaffrey (2014). ``Estimating the causal effects of cumulative treatment episodes for adolescents using marginal structural models and inverse probability of treatment weighting. {\em Drug and Alcohol Dependence}, 136(1), 69--78. McCaffrey, D.F., B.A.\ Griffin, D.\ Almirall, M.E.\ Slaughter, R.\ Ramchand, and L.F.\ Burgette (2013). ``A tutorial on propensity score estimation for multiple treatments using generalized boosted models.'' {\em Statistics in Medicine}, 32(19): 3388-3414. Robins, J.M., M.\'A. Hern\'an, and B.\ Brumback (2000). ``Marginal structural models and causal inference in epidemiology.'' {\em Epidemiology}, 11(5), 550--560. \end{document}