Full matching tries to use as many observations as possible, and so if you
just do diff-in-means you will get a poor estimate (this is close to not
doing any adjustment). I think that it is an open research question as to
how to do model-based adjustment after full matching, and so I don't want
to make any strong suggestion here. One way to do it however is to use
either fixed or random effect type models so that the strata created by
full matching can be incorporated into the model. But, others may have
better ideas.
Kosuke
--
Department of Politics
Princeton University
http://imai.princeton.edu
On Wed, 9 Sep 2009, Peter Steiner wrote:
Hi,
after briefly outlining my problem with the full-matching option in Zelig and
MatchIt to Imai, I post it in more detail and with the LaLonde data.
Unfortunately, I was not able to figure out how to correctly implement
full-matching with Zelig using all your documentation.
Moreover, the help in R seems to be sometimes inconsistent (the help file for
match.data() differs for the MatchIt and Zelig Package; one suggests that
weights are allowed (MatchIt) the other does not show an option for weights
(Zelig))
However, I'm interested in estimating ATE using full matching. A
straightforward way seems to be the following:
m.out <- matchit(treat ~ age + educ + black + hispan +
nodegree + married + re74 + re75, data = lalonde,
method = 'full', discard = 'both')
z.out1 <- zelig(re78 ~ age + educ + black + hispan + nodegree +
married + re74 + re75, data = match.data(m.out, "control"),
model = 'ls')
z.out0 <- zelig(re78 ~ age + educ + black + hispan + nodegree +
married + re74 + re75, data = match.data(m.out, "treat"),
model = 'ls')
x.out1 <- setx(z.out1, data = match.data(m.out, "treat"), cond = T)
x.out0 <- setx(z.out0, data = match.data(m.out, "control"), cond = T)
s.out1 <- sim(z.out1, x = x.out1)
s.out0 <- sim(z.out0, x = x.out0)
ate.all <- c(s.out1$qi$att.ev, -s.out0$qi$att.ev)
c(mean(ate.all), sd(ate.all))
This results in an ATE of 1335.5, which seems at least plausible. But here is
my problem. Using only full-matching without additional covariance adjustment
by setting
z.out1 <- zelig(re78 ~ 1, data = match.data(m.out, "control"),
model = 'ls')
z.out0 <- zelig(re78 ~ 1, data = match.data(m.out, "treat"),
model = 'ls')
results in an ATE of 86.88, indicating a very poor performance of full
matching. (Using Ben Hansen's R package alone, full matching would reduce
almost all bias.) So I tried to use the weights generated by the matchit()
command. Using weights in match.data(..., weights = 'weights') doesn't
change
the estimates very much. And whenever I include weights in zelig() the sim()
command produces an Error.
So my question is, what is the correct way to perform full-matching in Zelig?
I have another question, concerning nearest neighbor matching (1:1 matching,
for instance). What does ATE exactly estimate in Zelig? ATE of the original
(unmatched) sample or ATE of the matched sample only (note that the covariate
distribution of the original and matched sample usually differ considerably).
I assume the latter.
Thanks a lot,
Peter
-
Zelig Mailing List, served by Harvard-MIT Data Center
Send messages: zelig(a)lists.gking.harvard.edu
[un]subscribe Options:
http://lists.gking.harvard.edu/?info=zelig
Zelig program information:
http://gking.harvard.edu/zelig/