2015-05-01 15 views
8

Così, seguendo l'esempio dal pacchetto Matching e, in particolare, l'esempio GenMatch Link to pdf herecorrispondenza esatta e GenMatch in R

Seguendo l'esempio qui

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) 

Vediamo che tutti i casi di trattamento sono abbinati a casi di controllo. Ora diciamo che vogliamo la corrispondenza esatta sullo stato sposato, (o qualsiasi altra variabile). Ma vogliamo ancora usare la matrice GenMatch creata prima.

riferimento al link

esatta = ..... Se viene fornito un vettore logica, dovrebbe essere fornito un valore valido per ogni covariata in X. Usando un vettore logica permette all'utente di specificare la corrispondenza esatta per alcune ma non altre variabili. Quando non vengono trovate corrispondenze esatte, le osservazioni vengono eliminate.

Pertanto è corretto quanto segue ??

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) 

direi che non è stato corretto, come se si confrontano

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

si ottiene lo stesso valori

risposta

5

dovrei iniziare dicendo che non ho mai usato questi pacchetti e funzioni prima, la mia risposta è puramente basata sulla riproduzione del codice e della documentazione delle funzioni.

Sembra che vi sia una precedenza scarsamente documentata di Weight.matrix su exact nella funzione Match(). C'è un accenno nella sua pagina di aiuto (?Match):

Weight.matrix: ...

Questo codice cambia i pesi implicite per l'inverso del varianze moltiplicando la prima variabile da un 1000 così che è altamente ponderata. Per applicare l'esatta corrispondenza vedere l'esatta e le opzioni di pinza.

Quando si dice che si dovrebbe usare exact per far rispettare la corrispondenza esatta (in contrapposizione a dare i pesi calcolati manualmente o da GenMatch()), mi sembra che sta dicendo che si dovrebbe utilizzare uno o l'altro. Il comportamento, tuttavia, è che exact sembra essere ignorato quando si fornisce un argomento a Weight.matrix. Rimuovere questo dalla funzione, e si otterrà risultati diversi:

> 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 

Non posso entrare nel dettaglio di ciò che le implicazioni di questo cambiamento sono semplicemente perché non sono familiarità con la teoria dietro di esso.

Ho controllato la fonte di Match(), ma non c'è nulla di utile lì oltre al fatto che chiama una funzione chiamata RmatchLoop(), che non ero in grado di trovare da nessuna parte (suppongo che sia interno al pacchetto e qualche altro voodoo sia necessario vedere esso).

Sulla base di questo, penso che il tuo giudizio dovrebbe essere meteorologico o non ha senso usare entrambi gli argomenti, e da quello che ho letto, non è così. Non c'è motivo di attribuire pesi diversi a ciascuna covariata se in realtà si desidera abbinarli a uno solo di essi.


Tra l'altro, il codice potrebbe utilizzare alcuni miglioramenti, come ad esempio:

  1. Evitare di utilizzare attach, è pericoloso se si decide di utilizzare le variabili con gli stessi nomi delle vostre colonne di dati.
  2. Invece di cbind ing quasi tutte le colonne di un dataframe, appena SUBSET-out quelli che non si desidera:

Codice:

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) 

La stessa cosa può essere fatto per BalanceMat. E un altro vantaggio è che mantieni i dati come un dataframe.

  1. Inoltre, per l'argomento exact, un modo più pulito potrebbe essere:

Codice:

exact = colnames(X)=="married" 

questo modo si è meno inclini a qualsiasi cambiamento negli ordini delle colonne, ecc.