Skip to contents

A marginal structural model is only as good as the outcome model behind it, and the failure it hides is systematic: if Q is misspecified in a way that correlates with treatment, the residuals carry treatment signal the model should have absorbed. The diagnostic regresses the standardized residuals on the treatment, r = (y - Q) / sd(y - Q), r ~ b0 + b1 A, so b1 near zero with a small t-statistic is the pass condition.

Usage

Ocmtmd(y, A, H, Q = NULL)

Arguments

y

Observed outcome.

A

Binary treatment, 0/1.

H

Covariate history, no intercept column; one is added.

Q

Fitted values of the outcome model; if NULL, the outcome is regressed on [1, A, H] by least squares.

Value

List with estimate, b0, b1, t_stat, resid_sd, mean_resid_treated, mean_resid_control, alpha_crump, n_kept, min_ps, max_ps, n.

Details

The second failure mode is the design rather than the model: without overlap there is no data at some treatment levels and any weight is an extrapolation. Crump et al. give the subsample worth analysing, alpha <= e(x) <= 1 - alpha, with alpha the smallest value satisfying \(1 / (alpha (1 - alpha)) <= 2 E[1 / (e (1 - e)); alpha <= e <= 1 - alpha]\), solved here by a deterministic ascending scan over the observed propensities. The propensity is fitted by logistic regression of A on H.

References

Crump, R. K., Hotz, V. J., Imbens, G. W. & Mitnik, O. A. (2009). Dealing with limited overlap in estimation of average treatment effects. Biometrika, 96(1), 187-199. doi:10.1093/biomet/asn055 Robins, J. M., Hernan, M. A. & Brumback, B. (2000). Marginal structural models and causal inference in epidemiology. Epidemiology, 11(5), 550-560.

Examples

set.seed(7)
n <- 400
H <- matrix(rnorm(n * 2), n, 2)
A <- rbinom(n, 1, plogis(H[, 1]))
y <- 1 + A + H[, 1] + rnorm(n)
Ocmtmd(y, A, H)$t_stat
#> [1] -2.600936e-14