2016-07-26 3 views
0

R 패키지 2를 호출하여 R 패키지 MatchIt을 호출하려고합니다. $ match.matrix에서 일치하는 쌍의 결과를 보는 데 어려움을 겪고 있습니다. 다음은 Python으로 실행하려고하는 R 코드입니다.rpy2로 파이썬에서 R 함수를 호출 할 때 문제가 발생했습니다.

,691 :

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

가의 오류를 반환

lalonde.rx(base.row_names(foo.rx2('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"]) 

이 덩어리가 실행 : 여기

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

내 파이썬 코드 363,210
ValueError: The first parameter must be a tuple. 

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

의 출력

+0

'파생 foo' : 그 match.matrix의 첫 번째 열에는 lalonde에 인덱스 (행 번호)를 포함하기 때문에

, 당신이 원하는 무엇을해야 다음? 그리고 그들은 어떤 유형의 물건입니까?귀하의 코드에는 할당이 표시되지 않습니다 – Parfait

+0

lalonde는 MatchIt 문서에서 사용되는 데이터 프레임입니다. foo는 matchit() 함수의 출력입니다. foo $ match.matrix는 다음과 같습니다. n1 × 비율 행렬 - 행 이름은 처리 단위의 이름을 나타냅니다 (데이터에 지정된 데이터 프레임의 행 이름과 일치). - 각 열에는 해당 행 단위의 치료 단위와 일치하는 제어 단위의 이름이 저장됩니다. 예를 들어, 가장 가까운 이웃에 대한 비율 입력 또는 최적 일치가 3으로 지정되면 match.matrix의 세 열은 을 나타내며 세 개의 컨트롤 단위는 하나의 처리 단위와 일치합니다. – clfrazier

+0

'lalonde' 데이터 프레임을 먼저로드해야합니다 (PDF 매뉴얼 10 페이지 참조). 'MatchIt.data (lalonde)'를 사용해보십시오. 재미있는 파이썬은이 비 한정적이고 할당되지 않은 객체에 대해 불평하지 않았습니다. – Parfait

답변

2

여기 lalonde dataframe에서 "re78"의 값을 갖는 푸 $의 match.matrix의 행 명과 셀 값과 일치하는 dataframe되어야 lalonde은 다른 곳에 정의되어 있습니다 (하지만이 질문은 @ Parfait의 질문 덕분에 데이터 프레임임을 알 수 있습니다). 이제 문제의 정확한 위치를 정확히 찾아내는 한 줄짜리 오류를 찾아 내야합니다. (그리고 우리는 당신을 위해 그렇게 할 수 없습니다. 자급 자족하고 재현 할 수있는 예제에 대한 것은 그들이 우리에게 도움을주고 있다는 것입니다).

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

lalonde의 첫 번째 부분 집합이 파괴인가? type(lalonde) 이후

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

이이 R/RPY2 데이터 프레임 rpy2.robjects.vectors.DataFrame이다. 하나의 서브 세트를 추출하는 것은 .rx (r- 스타일 e x 견인 - 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"입니다).

`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

관련 문제