| weightitMSM | R Documentation |
weightitMSM() allows for the easy generation of balancing
weights for marginal structural models for time-varying treatments using a
variety of available methods for binary, continuous, and multi-category
treatments, as well as censoring. Some of these methods exist in other packages, which weightit()
calls; these packages must be installed to use the desired method.
weightitMSM(
formula.list,
data = NULL,
method = "glm",
stabilize = FALSE,
by = NULL,
s.weights = NULL,
num.formula = NULL,
missing = NULL,
verbose = FALSE,
include.obj = FALSE,
keep.mparts = TRUE,
is.MSM.method,
weightit.force = FALSE,
...
)
formula.list |
a list of formulas corresponding to each time point with
the time-specific treatment variable on the left hand side and
pre-treatment covariates to be balanced on the right hand side. The
formulas must be in temporal order, and must contain all covariates to be
balanced at that time point (i.e., treatments and covariates featured in
early formulas should appear in later ones). Interactions and functions of
covariates are allowed. As in |
data |
an optional data set in the form of a data frame that contains
the variables in the formulas in |
method |
a string of length 1 containing the name of the method that
will be used to estimate weights. See |
stabilize |
|
by |
a string containing the name of the variable in |
s.weights |
an optional vector of sampling weights or the name of a variable in
|
num.formula |
an optional one-sided formula with the stabilization
factors (other than the previous treatments) on the right hand side, which
adds, for each time point, the stabilization factors to a model saturated
with previous treatments. See Cole & Hernán (2008) for a discussion of how
to specify this model; including stabilization factors can change the
estimand without proper adjustment, and should be done with caution. Can
also be a list of one-sided formulas, one for each entry of |
missing |
|
verbose |
|
include.obj |
|
keep.mparts |
|
is.MSM.method |
|
weightit.force |
|
... |
other arguments that control aspects of fitting that are not covered by the above arguments. See Details at |
In general, weightitMSM() works by separating the estimation of weights
into separate procedures for each time period based on the formulas provided.
For each formula, weightitMSM() simply applies weightit() to that formula,
collects the weights for each time period, and multiplies them together to
arrive at longitudinal balancing weights.
Each formula should contain all the covariates to be balanced on. For
example, the formula corresponding to the second time period should contain
all the baseline covariates, the treatment variable at the first time period,
and the time-varying covariates that took on values after the first treatment
and before the second. Currently only "wide" data sets are supported, where each
unit is represented by exactly one row that contains its covariate and
treatment history encoded in separate variables. You can use reshape() or
other functions to transform your data into this format; see example below.
Censoring can be modeled by including entries in formula.list whose left side
is wrapped in .cens(), placed in temporal order among the treatment
models. For example,
weightitMSM(list(A_1 ~ X1_0 + X2_0,
A_2 ~ X1_1 + X2_1 + A_1,
.cens(C_2) ~ X1_1 + X2_1 + A_1 + A_2,
A_3 ~ X1_2 + X2_2 + A_2),
data = d, method = "glm")
models censoring occurring after the second treatment. Each censoring indicator
must be 0 for units still under observation and 1 for units censored at that time
point. See .cens() for details of what the resulting weights
estimate.
Every model, treatment or censoring, is fit only among the units still under
observation when it is reached, and the resulting weights are multiplied together
across time points as usual. A unit censored at any time point therefore has a
final weight of exactly 0. Because such units drop out, missing values are
permitted in the treatments and covariates that follow their censoring; missing
values among units still under observation remain an error. at.risk in the
output has one column per time point recording which units were under
observation when that model was fit.
Censoring time points are stabilized in exactly the same way as treatment time
points: with stabilize = TRUE, the numerator of a censoring weight is a model
for that censoring indicator given the preceding treatments (or a marginal model
when no treatment precedes it), and num.formula adds stabilization factors to
it as it does for a treatment. When num.formula is supplied as a list, it must
have one entry per entry of formula.list, censoring entries included. The
numerator of a censoring weight is itself a censoring model, so the stabilized
weight is P(C = 0 | \cdot) / P(C = 0 | X) for the units still under
observation and remains exactly 0 for those censored.
The right side of a censoring formula may be empty, as in .cens(C_2) ~ 1, which
requests a marginal censoring model that assumes censoring at that time point is
independent of the covariates; its contribution to the product is 1/P(C = 0)
for the units still under observation and 0 for those censored there. Everything
else is unaffected: the risk sets, the missing values permitted after censoring,
stabilize, by, and M-estimation all work as they do for a
covariate-dependent censoring model, and empty and non-empty censoring formulas
can be mixed freely. Each time point is fit separately, so only the empty ones
take the intercept-only shortcut described in Empty model formulas in Details at
weightit(); when is.MSM.method = TRUE there is no shortcut to take, because a
single set of weights is estimated for all time points at once, and a time point
with no covariates instead contributes only its intercept balance condition.
A weightitMSM object with the following elements:
weights |
The estimated weights, one for each unit. |
treat.list |
A list of the values of the time-varying treatment variables. |
covs.list |
A list of the covariates used in the fitting at each time point. Only includes the raw covariates, which may have been altered in the fitting process. |
estimand |
"ATE", currently the only estimand for MSMs with binary or multi-category treatments. |
method |
The weight estimation method specified. |
s.weights |
The provided sampling weights. |
by |
A data.frame containing the |
stabilization |
The stabilization factors, if any. |
When censoring is modeled (i.e., when any entry of formula.list has its left
side wrapped in .cens()), treat.list and covs.list describe the treatment
models only, while formula.list is kept exactly as supplied, markers included,
so that update() round-trips. The following additional components describe the
censoring models:
cens.list |
A list of the values of the censoring indicators, one entry per
censoring time point. Each is 0 for units still under observation and 1 for units
censored at that time point, and |
cens.covs.list |
A list of the covariates used to fit each censoring model.
As with |
cens.formula.list |
A list of the censoring model formulas, with the
|
cens.time |
The positions of the censoring models within |
at.risk |
A logical matrix with one row per unit and one column per entry of
|
Censored units have a final weight of exactly 0, so weights is 0 for any unit
censored at any time point.
When keep.mparts is TRUE (the default) and the chosen method is
compatible with M-estimation, the components related to M-estimation for use
in glm_weightit() are stored in the "Mparts.list" attribute. When by is
specified, the per-stratum components are combined into "Mparts.list" so
that the standard errors produced by glm_weightit() are asymptotically
equivalent to those from estimating the weights from models in which the by
variable is fully interacted with all the covariates at every time point. (For
method = "cbps", this requires is.MSM.method = FALSE, i.e., estimating a
separate model at each time point, as M-estimation is not supported for the
single-model MSM version of CBPS.)
Cole, S. R., & Hernán, M. A. (2008). Constructing Inverse Probability Weights for Marginal Structural Models. American Journal of Epidemiology, 168(6), 656–664. \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1093/aje/kwn164")}
weightit() for information on the allowable methods
summary.weightitMSM() for summarizing the weights
data("msmdata")
(W1 <- weightitMSM(list(A_1 ~ X1_0 + X2_0,
A_2 ~ X1_1 + X2_1 +
A_1 + X1_0 + X2_0,
A_3 ~ X1_2 + X2_2 +
A_2 + X1_1 + X2_1 +
A_1 + X1_0 + X2_0),
data = msmdata,
method = "glm"))
summary(W1)
cobalt::bal.tab(W1)
# Using stabilization factors
W2 <- weightitMSM(list(A_1 ~ X1_0 + X2_0,
A_2 ~ X1_1 + X2_1 +
A_1 + X1_0 + X2_0,
A_3 ~ X1_2 + X2_2 +
A_2 + X1_1 + X2_1 +
A_1 + X1_0 + X2_0),
data = msmdata,
method = "glm",
stabilize = TRUE,
num.formula = list(~ 1,
~ A_1,
~ A_1 + A_2))
# Same as above but with fully saturated stabilization factors
# (i.e., making the last entry in 'num.formula' A_1*A_2)
W3 <- weightitMSM(list(A_1 ~ X1_0 + X2_0,
A_2 ~ X1_1 + X2_1 +
A_1 + X1_0 + X2_0,
A_3 ~ X1_2 + X2_2 +
A_2 + X1_1 + X2_1 +
A_1 + X1_0 + X2_0),
data = msmdata,
method = "glm",
stabilize = TRUE)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.