2015-05-01 5 views
8

folgende So das Beispiel aus dem Matching-Paket und insbesondere die GenMatch Beispiel Link to pdf hereexakte Anpassung und GenMatch in R

Nach dem Beispiel hier

library(Matching) 
data(lalonde) 
attach(lalonde) 

X = cbind(age, educ, black, hisp, married, nodegr, u74, u75, re75, re74) 

BalanceMat <- cbind(age, educ, black, hisp, married, nodegr, u74, u75, re75, re74, 
        I(re74*re75)) 

genout <- GenMatch(Tr=treat, X=X, BalanceMatrix=BalanceMat, estimand="ATE", M=1, 
        pop.size=16, max.generations=10, wait.generations=1) 

Y=re78/1000 

mout <- Match(Y=Y, Tr=treat, X=X, Weight.matrix=genout) 
summary(mout) 

Wir sehen, dass alle Behandlungsfälle mit abgestimmt sind Kontrollfälle. Nehmen wir an, wir wollen eine genaue Übereinstimmung im Ehestand (oder jede andere Variable). Aber wir wollen immer noch die zuvor erstellte GenMatch-Matrix verwenden.

zum Link Bezugnahme

Exact = ..... Wenn ein logischer Vektor bereitgestellt wird, wird ein logischer Wert sollte für jede covariate in X. bereitgestellt werden, um eine logische Vektor unter Verwendung erlaubt dem Benutzer, eine exakte Übereinstimmung angeben, für einige, aber keine anderen Variablen. Wenn keine genauen Übereinstimmungen gefunden werden, werden Beobachtungen gelöscht.

Deshalb ist folgendes richtig ??

mout2 <- Match(Y=Y, Tr=treat, X=X, exact=c(0,0,0,0,1,0,0,0,0,0), Weight.matrix=genout) 
summary(mout2) 

Ich würde sagen, dass nicht richtig gewesen ist, als ob Sie

vergleichen
summary(mout$weights) 
summary(mout2$weights) 

Sie die gleichen Werte erhalten

Antwort

5

ich sagen, dass ich diese Pakete und Funktionen haben nie benutzt beginnen soll zuvor basiert meine Antwort rein auf dem Spielen mit Ihrem Code und der Funktionsdokumentation.

Es scheint, dass es eine schlecht dokumentierte, unwarnte Präzedenz von Weight.matrix über exact in der Match() Funktion gibt. Es gibt einen Hinweis auf seiner Hilfeseite (?Match):

Weight.matrix: ...

Dieser Code ändert die implizierten Gewicht durch die Inverse von die Varianzen durch die erste Variable durch ein 1000 multipliziert wird, so dass es ist stark gewichtet. Um genaue Übereinstimmung zu erzwingen, sehen Sie bitte die genauen und Messschieberoptionen.

Wenn es sagt, Sie exact verwenden sollten genaue Abstimmung zu erzwingen (im Gegensatz zu den Gewicht manuell oder von GenMatch() berechnet geben), so scheint es mir, dass es sagt man das eine oder andere verwenden soll. Das Verhalten ist jedoch, dass exact ignoriert wird, wenn Sie ein Argument Weight.matrix bereitstellen. Entfernen Sie diese aus der Funktion, und Sie werden unterschiedliche Ergebnisse erhalten:

> mout2 <- Match(Y=Y, Tr=treat, X=X, exact=c(0,0,0,0,1,0,0,0,0,0)) 
> summary(mout2) 

Estimate... 1.7605 
AI SE...... 0.86408 
T-stat..... 2.0374 
p.val...... 0.041606 

ich nicht ins Detail, was die Auswirkungen dieser Veränderungen sind einfach gehen kann, weil ich mit der Theorie dahinter nicht vertraut bin.

überprüfte ich die Quelle des Match(), aber es gibt nichts nützlich es außer, dass sie eine Funktion RmatchLoop() genannt Anrufe, die ich nicht in der Lage war überall zu finden (ich vermute, es ist Paket internen und einige andere Voodoo sind notwendig, um zu sehen, es).

Darauf basierend, denke ich, dass Ihr Urteil sollte Wetter sein oder nicht, macht es Sinn, beide Argumente zu verwenden, und von dem, was ich lese, tut es nicht. Es gibt keinen Grund, jeder Kovariate unterschiedliche Gewichte zuzuweisen, wenn Sie nur mit einem von ihnen übereinstimmen möchten.


By the way, könnte Ihr Code einige Verbesserungen, wie zum Beispiel verwenden:

  1. Vermeiden attach verwenden, ist es gefährlich, wenn Sie Variablen zu verwenden, um mit dem gleichen Namen wie Ihre Datenspalten entscheiden.
  2. Statt cbind ing fast alle Spalten eines Datenrahmens, nur die, die Teilmenge-out Sie nicht wollen:

Code:

X <- lalonde[,!(colnames(lalonde)=="re78" | colnames(lalonde) == "treat")] 
#or 
X <- subset(lalonde, select=-c(re78, treat)) #Subset is shorter in this case, but usually not recommended 
#instead of 
X = cbind(age, educ, black, hisp, married, nodegr, u74, u75, re75, re74) 

Das gleiche kann für BalanceMat erfolgen. Ein weiterer Vorteil ist, dass Sie die Daten als Datenrahmen behalten.

  1. Auch für das exact Argument, wäre ein sauberer Weg:

Code:

exact = colnames(X)=="married" 

Auf diese Weise kann weniger auf jede Veränderung neigen in den Spalten Bestellungen etc.