2016-07-26 23 views
0

Ich versuche rpy2 zu verwenden, um das R-Paket MatchIt aufzurufen. Ich habe Schwierigkeiten, das Ergebnis der übereinstimmenden Paare aus der $ match.matrix zu sehen. Hier ist der R-Code, den ich in Python ausführen möchte.Problem beim Aufrufen der R-Funktion von Python mit rpy2

matched <- cbind(lalonde[row.names(foo$match.matrix),"re78"],lalonde[foo$match.matrix,"re78"]) 

Hier ist mein Python-Code:

import readline 
import rpy2.robjects 
from rpy2.robjects.packages import importr 
from rpy2.robjects import pandas2ri 
from rpy2 import robjects as ro 

import numpy as np 
from scipy.stats import ttest_ind 
import pandas as pd 
from pandas import Series,DataFrame 

pandas2ri.activate() 
R = ro.r 
MatchIt = importr('MatchIt') 
base = importr('base') 

df = R('lalonde') 
lalonde = pandas2ri.py2ri(df) 
formula = 'treat ~ age + educ + black + hispan + married + nodegree + re74 + re75' 

foo = MatchIt.matchit(formula = R(formula), 
           data = lalonde, 
           method = R('"nearest"'), 
           ratio = 1) 

matched = \ 
base.cbind(lalonde.rx[base.row_names(foo.rx2('match.matrix')),"re78"], 
     lalonde.rx[foo.rx2('match.matrix'),"re78"]) 

Dieser Brocken läuft:

:

lalonde.rx(base.row_names(foo.rx2('match.matrix')), 
     "re78") 

aber dieser Brocken

lalonde.rx[foo.rx2('match.matrix'),"re78"]. 

einen Fehler von zurückgibt

ValueError: The first parameter must be a tuple. 

Die Ausgabe von

cbind(lalonde[row.names(foo$match.matrix),"re78"], lalonde[foo$match.matrix,"re78"]) 

soll ein Datenrahmen sein, der die Zeilennamen und Zellenwerte von $ foo match.matrix mit den Werten von „re78“ in dem lalonde Datenrahmen

+0

Wo kommt 'lalonde' oder 'foo' ableiten? Und welche Art von Objekten sind sie?Ihr Code zeigt nicht ihre Zuordnung – Parfait

+0

lalonde ist ein Datenrahmen, der in der MatchIt-Dokumentation verwendet wird. foo ist die Ausgabe der Funktion matchit(). foo $ match.matrix ist eine: n1 × Verhältnismatrix, wobei: - die Zeilennamen die Namen der Behandlungseinheiten darstellen (die mit der Zeile den Namen des in Daten angegebenen Datenrahmens übereinstimmen). - In jeder Spalte werden die Namen der Kontrolleinheit (en) gespeichert, die der Behandlungseinheit dieser Zeile entsprechen. Wenn zum Beispiel die Verhältniseingabe für den nächsten Nachbarn oder optimale Übereinstimmung mit 3 angegeben ist, repräsentieren die drei Spalten der Übereinstimmungsmatrix die drei Steuereinheiten, die auf eine Behandlungseinheit abgestimmt sind). – clfrazier

+0

Sie müssen zuerst den 'lalonde'-Datenrahmen laden (siehe Seite 10 des PDF-Handbuchs). Versuchen Sie 'MatchIt.data (lalonde)'. Interessanter Python hat sich über dieses unqualifizierte und nicht zugewiesene Objekt nicht beklagen. – Parfait

Antwort

2

Hier paßt lalonde ist an anderer Stelle definiert (aber dank @ Parfaits Frage wissen wir, dass dies ein Datenrahmen ist). Jetzt müssen Sie Ihr One-Liner brechen und den Fehler auslösen, um den genauen Ort des Problems zu lokalisieren (und wir können das nicht für Sie tun - die Sache mit in sich geschlossenen und reproduzierbaren Beispielen ist, dass sie uns helfen, Ihnen zu helfen).

matched = \ 
base.cbind(lalonde[base.row_names(foo.rx2('match.matrix')),"re78"], 
      lalonde[foo.rx2('match.matrix'),"re78"]) 

Ist das Brechen mit der ersten Teilmenge von lalonde?

lalonde[base.row_names(foo.rx2('match.matrix')),"re78"] 

Da type(lalonde)rpy2.robjects.vectors.DataFrame ist dies ein Rahmen R/rpy2 Daten sind. Das Extrahieren einer Untermenge, wie sie in R durchgeführt wird, kann mit .rx (wie in r-style e x Traktion - siehe http://rpy2.readthedocs.io/en/version_2.8.x/vector.html#extracting-r-style ) erreicht werden.

lalonde.rx(base.row_names(foo.rx2('match.matrix')), 
      "re78") 

Es ist wichtig zu verstehen, was mit diesem Anruf geschieht. Standardmäßig müssen die Elemente, die in jeder Richtung der Datenstruktur (hier Zeilen und Spalten des Datenrahmens) extrahiert werden, R Vektoren (Vektor von Namen oder Vektor von Ein-Byte-Index-Ganzzahlen) oder eine Python-Datenstruktur, die die Konvertierung ist Mechanismus kann in einen R-Vektor (von Namen oder ganzen Zahlen) übersetzt werden. base.row_names wird die Zeilennamen zurückgeben (und das ist ein Vektor von Namen), aber foo.rx2('match.matrix') könnte etwas anderes sein.

Hier zeigt type(foo.rx2('match.matrix')) an, dass dies eine Matrix ist. Die Verwendung von Matrizen kann verwendet werden, um Zellen in einem R-Array auszuwählen, aber in diesem Fall kann es nur einen Parameter für die Extraktion geben ... und wir haben zur Zeit zwei (der zweite ist "re78").

Da die erste Spalte dieser match.matrix die Indizes enthält (Zeilennummern) in lalonde sollte die folgende sein, was Sie wollen:

matched = \ 
base.cbind(lalonde.rx[base.row_names(foo.rx2('match.matrix')),"re78"], 
      lalonde.rx[foo.rx2('match.matrix').rx(True, 1),"re78"]) 
+0

type (lalonde) = rpy2.robjects.vectors.DataFrame – clfrazier

+0

@clfrazier: Fortsetzung der Antwort entsprechend – lgautier

+0

Vielen Dank. Dieser Chunk läuft jetzt, aber beim Aktualisieren der gesamten Zeile wird immer noch ein Fehler angezeigt. Ich habe meine Frage aktualisiert. – clfrazier