2016-07-26 7 views
0

Я пытаюсь использовать rpy2 для вызова пакета R MatchIt. Мне трудно увидеть результат согласованных пар из $ match.matrix. Вот код R, который я пытаюсь выполнить в python.Ошибка вызова функции R из Python с rpy2

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

Вот мой питон код:

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"]) 

Этот блок работает:

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

, но этот кусок

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

возвращает ошибку:

ValueError: The first parameter must be a tuple. 

Выход

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

должен быть dataframe, который соответствует имена строк и значения ячеек обув $ match.matrix со значениями «re78» в Лалонда dataframe

+0

Где 'lalonde' или' Foo' получить? И какие они объекты?Ваш код не показывает свое назначение. – Parfait

+0

lalonde - это кадр данных, который используется в документации MatchIt. foo - выход функции matchit(). foo $ match.matrix является матрицей отношения n1 × где: - имена строк представляют собой названия единиц обработки (которые соответствуют строкам именам фрейма данных, указанным в данных). - каждый столбец хранит имя (имена) блока (ов) управления, согласованного с обработкой единицы этой строки. Например, когда значение отношения для ближайшего соседа или оптимальное согласование задано как 3, три столбца match.matrix представляют три блока управления, соответствующие одному блоку обработки). – clfrazier

+0

Необходимо сначала загрузить фрейм данных lalonde (см. Стр. 10 руководства по PDF). Попробуйте 'MatchIt.data (lalonde)'. Интересный Python не жаловался на этот неквалифицированный и неназначенный объект. – Parfait

ответ

2

Здесь lalonde определен в другом месте (но благодаря вопросу @ Parfait мы знаем, что это кадр данных). Теперь вам придется сломать ваш однострочный динамик, вызвав ошибку, чтобы точно определить точное место неприятностей (и мы не можем этого сделать для вас), что касается самодостаточных и воспроизводимых примеров, так это то, что они помогают нам помочь вам).

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

Является ли это нарушение с первым подмножеством lalonde?

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

Поскольку type(lalonde) является rpy2.robjects.vectors.DataFrame это кадр данных R/rpy2. Экстрагирование подмножество как можно было бы сделать это в R может быть достигнуто с .rx (как в г -стиль х х тяги - см http://rpy2.readthedocs.io/en/version_2.8.x/vector.html#extracting-r-style ).

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

Важно понимать, что происходит с этим вызовом. По умолчанию элементы для извлечения в каждом направлении структуры данных (здесь строки и столбцы кадра данных соответственно) должны быть R-векторами (вектором имен или вектором целых чисел индекса с одним смещением) или структурой данных Python, что преобразование механизм может трансформироваться в вектор R (имен или целых чисел). base.row_names вернет имена строк (и это вектор имен), но foo.rx2('match.matrix') может быть чем-то другим.

Здесь type(foo.rx2('match.matrix')) указывает, что это матрица. Использование матриц может быть использовано для чередования ячеек в массиве R, но в этом случае может быть только один параметр для извлечения ... и у нас теперь есть два (второй - "re78").

Поскольку первый столбец этой match.matrix содержит индексы (номера строк) в lalonde, следующее должно быть то, что вы хотите:

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

тип (lalonde) = rpy2.robjects.vectors.DataFrame – clfrazier

+0

@clfrazier: продолжение ответа соответственно – lgautier

+0

Большое спасибо. Этот кусок теперь запущен, однако при обновлении всей строки он все равно получает ошибку. Я обновил свой вопрос. – clfrazier