1
$\begingroup$

I have couple of questions. To give short background, I am trying to estimate ATET based on stratified matching. First I used logit model to estimated propensity score of being treated by covariables.

m_ps <- glm(train ~ age + agesq + re74 + re75 + nodegree + black + hisp,
        family = binomial(link="logit"), data = training)

It returned:

summary(m_ps)

Call:
glm(formula = train ~ age + agesq + re74 + re75 + nodegree + 
    black + hisp, family = binomial(link = "logit"), data = training)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-1.447  -0.986  -0.938   1.314   1.687  

Coefficients:
                Estimate   Std. Error z value Pr(>|z|)   
(Intercept)  0.242071771  1.289204253    0.19   0.8511   
age          0.007623644  0.084283306    0.09   0.9279   
agesq       -0.000000516  0.001382059    0.00   0.9997   
re74        -0.030814939  0.025852631   -1.19   0.2333   
re75         0.063935389  0.042606822    1.50   0.1335   
nodegree    -0.708616484  0.243880013   -2.91   0.0037 **
black       -0.222076429  0.364532789   -0.61   0.5424   
hisp        -0.801474756  0.504345088   -1.59   0.1120   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 604.20  on 444  degrees of freedom
Residual deviance: 588.46  on 437  degrees of freedom
AIC: 604.5

Number of Fisher Scoring iterations: 4

Then I assigned propensity to each observation:

prs_df <- data.frame(pr_score = predict(m_ps, type = "response"),
                     train = m_ps$model$train)
head(prs_df)

1   0.3996     1
2   0.2496     1
3   0.5617     1
4   0.3815     1
5   0.3923     1
6   0.3726     1

My question is how can I estimate ATET based on stratified matching on propensity score (I am thinking of rounding propensity score to first digit as a stratification). And how can I check the covariate balance to check if the transformation of x to the propensity score retained all necessary information? And how can I Check the common support assumption using the propensity score itself?

My he outcome variable re78, real earnings in 1978. the covariate vector xi that contains real earnings in 1974, real earnings in 1975, age, age squared, whether completed high school (variable name: nodegree), and race dummies (one for black, one for Hispanic). I want to estimate effect of training on re78.

Thank you.

$\endgroup$
0
$\begingroup$

Typically, people do stratification on quantiles of the propensity score (e.g., the top 10%, then next 10%, etc.). Researchers should choose the number of strata based on which produces the best balance. Here is some R code to do the stratification for estimating the ATET:

nstrata <- 6
strata <- findInterval(prs_df$pr_score, 
                                 quantile(prs_df$pr_score[training$train==1], 
                                          (0:nstrata)/nstrata), all.inside = T)

You can also use the MatchIt package as so:

m.out <- matchit(train ~ age + agesq + re74 + re75 + nodegree + 
    black + hisp, data = training, method = "subclass",
    subclass = 6, distance = prs_df$pr_score)

and the subclasses will be in the m.out object.

To assess balance on subclassified data, use the cobalt package as so:

If you did subclassification manually (i.e., using the first code block), do the following:

bal.tab(train ~ age + agesq + re74 + re75 + nodegree + 
    black + hisp, subclass = strata, data = training,
        method = "subclassification", disp.subclass = TRUE)

If you used MatchIt for the subclassification, do the following:

bal.tab(m.out, disp.subclass = TRUE)

The output is the standardized means differences (for continuous variables) and differences in proportion (for binary variables) in each subclass, followed by a summary averaging over the subclasses. If your mean differences are low, that's evidence you have achieved balance.

For common support, you can see using bal.tab() how many units are in each subclass. If there are too few of either treatment or control, you may not have common support. You can graphically examine common support using bal.plot() in cobalt:

bal.plot(prs_df, treat = training$train, var.name = "pr_score")

All this is described in the documentation for cobalt.

$\endgroup$
  • $\begingroup$ Thank you very much. But how can I get ATET based on stratified matching as well? $\endgroup$ – user5372470 Feb 25 '17 at 11:32

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.