A question on how to deal with inverse probability of treatment weighted-Cox regression analysis. Basically, I am evaluating how to use IPTW in the context of survival (and specifically, Cox regression) analysis in observational study, in which the evaluation of exposure/treatment can be biased by imbalance in several baseline characteristics/covariates between the two groups.
I've runned a simulated model based on the first answer to this question: https://stackoverflow.com/questions/50590909/cox-regression-with-inverse-propensity-treatment-weighting using simulated data from the MatchIt
package.
Assumptions to ease the discussion on this example:
- The only covariates that are imbalanced between the two groups are those that I've inserted in the propensity score model, and
- There is no interaction between the treatment and the covariates, and
- There are no other relevant* confounder affecting the outcomes
*I recognize this can be disturbing, but just take this as meaning that "the contribution of other confounder on the risk of outcomes and/or the effect of treatment is negiglible).
Here is the reproducible code.
library(ipw)
library(survival)
library(MatchIt)
#Create simulated column for outcome and time to event
set.seed(14)
lalonde$status <- sample(c(0,1), length(lalonde$treat), replace=TRUE)
set.seed(15)
lalonde$time <- sample(1:365, length(lalonde$treat), replace=TRUE)
#Estimating propensity score
ps_model <- glm(treat~age+educ+race+married, family = binomial, data = lalonde)
summary(ps_model)
#Extract propensity score
pscore <- ps_model$fitted.values
lalonde$pscore <- predict(ps_model, type = "response")
#estimate weight for each patient
weights <- ipwpoint(exposure=treat, family="binomial", link="logit", numerator = ~1,
denominator =~age+educ+race+married, data=lalonde, trunc=0.05)
cox1 <- coxph(Surv(time, status)~as.factor(treat), weights = weights$weights.trunc, data = lalonde)
summary(cox1)
And here is the result:
Call:
coxph(formula = Surv(time, status) ~ as.factor(treat), data = lalonde,
weights = weights$weights.trunc)
n= 614, number of events= 309
coef exp(coef) se(coef) robust se z Pr(>|z|)
as.factor(treat)1 0.1914 1.2109 0.1342 0.1539 1.244 0.214
exp(coef) exp(-coef) lower .95 upper .95
as.factor(treat)1 1.211 0.8258 0.8956 1.637
Concordance= 0.521 (se = 0.016 )
Likelihood ratio test= 1.97 on 1 df, p=0.2
Wald test = 1.55 on 1 df, p=0.2
Score (logrank) test = 2.04 on 1 df, p=0.2, Robust = 1.54 p=0.2
(Note: the likelihood ratio and score tests assume independence of
observations within a cluster, the Wald and robust score tests do not).
Now the question is: should I need to adjust the cox model for the variables that I used to generate the Propensity Score, or not?