As you may have noticed, propensity score methods are an iterative process: we check variable balance, model propensity scores, perform weighting, then check balance again. If imbalance still exists, we can change the propensity score model. A main assumption of propensity score weighting is that we’ve modeled the propensity scores correctly — a poor model could lead to biased estimates of the treatment effect!
Let’s update our propensity score model from the student sleep data to see if imbalances between groups can be reduced further.
The initial propensity score model only included the
stress variable as a predictor of meditation, but what happens if we add the
graduate variable as a second predictor? We need to update the formula in the
# import library library(WeightIt) # update weightit object iptw_sleep_update <- weightit( #new formula formula = meditate ~ stress + graduate, data = sleep_data, estimand = "ATT", method = "ps" )
We re-check balance again to see if the new propensity score model produces a better balance between groups.
# import library library(cobalt) # create Love plot of updated model love.plot( x = iptw_sleep_update, #updated model, binary = "std", #show SMD thresholds = c(m = 0.1), #guidelines colors = c("#E69F00", "#009E73") #fill colors )
Success! Both plots show that this new propensity score model produces improved balance. The SMDs now fall between -0.1 and 0.1.
Note that it can take multiple tries to find a good propensity score model. If we needed to further refine our model, we might add more complex terms to the equation, such as polynomial terms or interactions.
formula argument of the
weightit model to add the
heart_attack variable to the propensity score model as a predictor of low ejection fraction. Then uncomment and run the code to assign the output to
Create a new Love plot showing the standardized mean differences and thresholds of ±0.1 using the updated
weightit model. Save your plot as
love_update and inspect the plot. Did your new model improve the balance?