Bookmark and Share

Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

st: Obtaining correct inference from within strata -att- estimation with -psmatch2-

From   Richard Herron <>
Subject   st: Obtaining correct inference from within strata -att- estimation with -psmatch2-
Date   Fri, 24 Feb 2012 12:48:38 -0500

I am using -psmatch2- (SSC) to match on propensity score and would
like to limit matches to the same strata. The example code in
-psmatch2-'s help file iterates over strata with a -foreach- loop and
-if- statements and returns -att- (average treatment of the treated)
for each strata, which the code stores for every observation in each
strata (I could also limit this to actually matched treatment and
control). Then the example code finds the mean -att- with -summarize-.
I would like to make inferences on the mean -att-, however there are
many observations, so standard errors are small and t-statistics
large. If I use one -att- observation per strata (similar to a
Fama-MacBeth regression), then I get completely different inferences.

Is there a better way to limit matches within strata? I have tried the
-mahalanobis- option using the whole data set, but the data are very
large and it takes quite a long time (more than overnight to perform
matching on distance in the whole data set).

Or is the correct answer to avoid these inference problems to _not_
aggregate my -att- over strata and evaluate them strata by strata?
Thanks! I provide an example below.

In my case the strata are fiscal years, but in the readily available
data the strata are industry codes.

* begin code

* ssc install psmatch2
webuse nlswork, clear
generate att = .
egen g = group(ind_code)
levels g, local(gr)
quietly foreach j of local gr {
        psmatch2 msp collgrad union tenure age race ///
            if (g == `j'), out(ln_wage)
        replace att = r(att) if  (g == `j')

* but -psmatch2- assigns same -att- to every matched observed in each
group -g- (here grouped on -ind_code-)
table g att

* so the standard errors are very small and the t-stats too large
summarize att
scalar t = `r(mean)' / (`r(sd)' / (`r(N)' - 1))
scalar list t

* is there a more sensible way to get the correct inference, while
still forcing matches only within a given strata?
* one thought is to collapse on -g-
collapse (mean) att, by(g)
summarize att
scalar t = `r(mean)' / (`r(sd)' / (`r(N)' - 1))
scalar list t

* here the inference flips from negative significant to positive
significant, but I haven't done any weighting by group

* end code
*   For searches and help try:

© Copyright 1996–2018 StataCorp LLC   |   Terms of use   |   Privacy   |   Contact us   |   Site index