6
$\begingroup$

I have a dataset with 1300 observations and 30 variables. One of the variables has 10% missing data, another has 5% and a third has 3%. Seeing Propensity score matching after multiple imputation I created an averaged propensity score based on the imputed data from MICE. Also based on the work by Mitra et al .

Now I need to

  1. do the matching procedure - preferably I´d like to use MatchIt, but it does not allow the propensity score to be pre-generated which is needed because of the averaging in the prior step. I can do it in Matching - However, I´m not very familiar with it. Does anyone know if a pre-generated propensity score can be used in MatchIt?
  2. I need to supply some proof that the matched groups are similar with regards to the covariates used in the generated propensity score. However, how can this be done is uncertain since the generated propensity score is based on multiple imputed datasets? Would it be OK just to average the imputed values and generated an 'averaged' imputed dataset and use this for the balance check?
$\endgroup$
  • $\begingroup$ You might use inverse probability of treatment weighting rather than matching, and recognize both inverse probability of treatment and imputation set as clustering features. $\endgroup$ – Joe_74 Jun 30 '16 at 0:48
  • $\begingroup$ Do you have an example of this approach? $\endgroup$ – Misha Jun 30 '16 at 13:43
  • 1
    $\begingroup$ I have no direct example at hand, but you can refer to the ipw package, and look at Seaman et al (smm.sagepub.com/content/22/3/278.abstract). $\endgroup$ – Joe_74 Jun 30 '16 at 13:57
5
$\begingroup$

My understanding is that you should generate individual propensity score models for each data set, then match, then estimate outcomes, then combine the estimates into one.

1) Match() in Matching accepts a user's own propensity score (include it as the X parameter in the call to Match(). matchit() in MatchIt does the same. I also recommend you try propensity score weighting; the package twang allows users to enter their own propensity scores/weights and then assess balance. The twang vignette explains how to do this and estimate a treatment effect.

2) Typically for balance assessment reporting, you assess balance on each dataset individually and then report maximum imbalance for each covariate across the imputed data sets. Do not average your imputed data sets. If across the imputed datasets the maximum imbalance of each covariates is within an acceptable range (e.g., ASMD <.1), that should be good enough evidence that you have achieved balance and can move forward.

$\endgroup$
  • $\begingroup$ Thanks for the input. However, I do believe the simulation studies have advised to generate the prop models for each imputed dataset, then average the prop score before subsequent matching. I'll have a look at twang. Thanks for the idea of doing balance assessment on each imputed dataset. I'll stick to that and report the maximum ASMD for each covariate. $\endgroup$ – Misha Jul 2 '16 at 7:36
  • $\begingroup$ Yes, I just meant that you shouldn't average the covariate values across the imputed datasets. It seems that averaging the PS values is fine. If the outcome is not imputed, then you only need one set of PS to match and compare the groups. $\endgroup$ – Noah Jul 2 '16 at 23:05
  • $\begingroup$ With regards to 2) - Then I´ll match the individual imputed datasets before reporting the max ASMD among the datasets in the balance assessment. 'If the outcome is not imputed, then you only need one set of PS to match and compare the groups' - The observations that are missing would be discarded and left out of the PS and then I wouldn't have to impute in the first place. $\endgroup$ – Misha Jul 17 '16 at 14:23
  • $\begingroup$ I just meant that each individual only needs one propensity score, not that you would only retain some individuals. We're on the same page, I was just confirming your method. By the way, I looked into MatchIt more and you can enter your own PS into the distance argument. For balance checking, I recommend using the new cobalt package, which allows you to compare balance across several PS packages. $\endgroup$ – Noah Jul 18 '16 at 5:25
  • $\begingroup$ I also recently found some relevant research: Cham & West (2016), a review of PS methods with missing data, and Hughes, et al. (2010), which uses imputation in a PS example. $\endgroup$ – Noah Jul 18 '16 at 5:28
4
$\begingroup$

As I previously stated, instead of doing propensity matching it can be reasonable to use inverse probability of treatment weighting after missing data imputation.

Suitable Stata examples follow:

clear all
webuse mheart5 
*dataset

replace smokes = . in 20/70
*creates missing values for smokes variable in observations 20 to 70

mi set mlong 
mi register imputed age bmi smokes
set seed 29390
mi impute mvn age bmi smokes = attack hsgrad female, add(10)
*missing data imputation creating 10 imputed datasets

replace smokes=round(smokes,1)
replace smokes = 1 if smokes >=1 
replace smokes = 0 if smokes <=0 
*rounding to transform smokes variables into a binary one

set seed 54321
generate randomvar = runiform()
gsort randomvar
*random sorting of the data

psmatch2 smokes age bmi female hsgrad, noreplace logit 
gen iptw = 1/(1-_pscore) if smokes == 0
replace iptw = 1/(_pscore) if smokes == 1
*generation of inverse probability of treatment weighting

mi estimate: glm attack smokes [pweight = iptw], family(binomial) link(identity) vce(robust)
*inverse probability of treatment weighting analysis for dichotomous endpoint after multiple imputation

*---

clear all
webuse stan3
*dataset

replace age = . in 20/70
replace transplant = . in 40/90
*creates missing values for age variable in observations 20 to 70 and transplant variable in observations 40 to 90

mi set mlong 
mi register imputed age transplant
set seed 54321
mi impute mvn age transplant = year died stime surgery wait posttran, add(10)
*missing data imputation creating 10 imputed datasets

replace transplant=round(transplant,1)
replace transplant = 1 if transplant >=1 
replace transplant = 0 if transplant <=0 
*rounding to transform transplant variable into a binary one

set seed 54321
generate randomvar = runiform()
gsort randomvar
*random sorting of the data

psmatch2 surgery year age transplant wait posttran, noreplace logit 
gen iptw = 1/(1-_pscore) if surgery == 0
replace iptw = 1/(_pscore) if surgery == 1
*generation of inverse probability of treatment weighting

mi stset stime [pweight = iptw], failure(died) scale(1)
mi estimate: stcox surgery
*inverse probability of treatment weighting analysis for censored endpoint after multiple imputation 

mi estimate: glm stime surgery [pweight = iptw], family(gaussian) link(identity) vce(robust)
*inverse probability of treatment weighting analysis for continuous endpoint after multiple imputation 
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.