2017-02-09 97 views
0

我做一個有序Logistic迴歸,並在此之後的指南分析:R Data Analysis Examples: Ordinal Logistic Regression如何rpy2「與」操作使用R

我的數據框(諮詢)看起來像:

  n raingarden es_score consult_case 
garden_id          
27436  7   0   3    0 
27437  1   0   0    1 
27439  1   1   1    1 
37253  1   0   3    0 
37256  3   0   0    0 

我在哪裏需要創建圖表來測試比例優勢假設的一部分,與在R中的命令如下:

(s <- with(dat, summary(es_score ~ n + raingarden + consult_case, fun=sf))) 

(es_score是一個序排列得分與值s在0 - 4之間; n是整數; raingarden和consult_case,或0的二進制值1)

我有SF功能:

sf <- function(y) { 
    c('Y>=1' = qlogis(mean(y >= 1)), 
     'Y>=2' = qlogis(mean(y >= 2)), 
     'Y>=3' = qlogis(mean(y >= 3))) 
} 

在utils.r文件,我訪問如下:

from rpy2.robjects.packages import STAP 
with open('/file_path/utils.r', 'r') as f: 
    string = f.read() 
sf = STAP(string, "sf") 

而想要沿着這樣的方向行事:

R = ro.r 
R.with(work_case_control, R.summary(formula, fun=sf)) 

主要問題是R with運營商被視爲一個python關鍵字,所以即使我用ro.r.with訪問它,它仍然被認爲是一個python關鍵字。 (作爲一個方面說明:我試圖使用的r apply方法來代替,卻得到了一個錯誤,TypeError: 'SignatureTranslatedAnonymousPackage' object is not callable ...我認爲這是指我的功能sf?)

我也使用rpy2將R分配方法如下嘗試:

R('sf = function(y) { c(\'Y>=1\' = qlogis(mean(y >= 1)), \'Y>=2\' = qlogis(mean(y >= 2)), \'Y>=3\' = qlogis(mean(y >= 3)))}') 

R('s <- with({0}, summary(es_score~raingarden + consult_case, fun=sf)'.format(consult)) 

但跑進在數據幀列名以某種方式導致錯誤的問題:RRuntimeError: Error in (function (file = "", n = NULL, text = NULL, prompt = "?", keep.source = getOption("keep.source"), : <text>:1:19: unexpected symbol 1: s <- with( n raingarden

我當然可以做到這一切在R,但我有一個Python非常複雜的ETL腳本,因此會傾向於使用rpy2將所有內容保存在python中(我嘗試過使用mord進行scipy-learn來運行我的調用,但它非常原始)。

任何建議現在是最受歡迎的。

編輯

我嘗試了各種組合@芭菲的建議,出線fun說法是語法不正確,因爲每PyCharm解釋(見圖片與最終紅色高亮顯示):with qualified fun keyword ...它不使用功能時unqualified fun keyword,但我得到的錯誤TypeError: 'SignatureTranslatedAnonymousPackage' object is not callable:不管預選賽是什麼,或者,我總是得到一個錯誤 是SyntaxError: keyword can't be an expression.

在另一方面,沒有資格,也沒有語法錯誤0作爲獲得:

from rpy2.robjects.packages import STAP with open('/Users/gregsilverman/development/python/rest_api/rest_api/scripts/utils.r', 'r') as f: string = f.read() sf = STAP(string, "sf")

考慮到這一點,我中的R創建的包與所述功能sf,進口它,並嘗試了各種連擊與唯一的一個不產生錯誤,是:print(base._with(consult_case_control, R.summary(formula, fun=gms.sf)))(GMS是在RI中對該軟件包的引用)。

輸出,雖然沒有任何意義:

Length Class Mode 3 formula call

我期待一個表ALA在加州大學洛杉磯分校的網站之一。有趣。我將嘗試在R中重新創建我的分析,僅僅是爲了它。我仍然想在Python中完成它。

回答

2

考慮包圍的with電話,一定要符合所有參數,包括樂趣

ro.r['with'](work_case_control, ro.r.summary(formula, ro.r.summary.fun=sf)) 

另外,進口的r基本包。並避免與Python的命名方法with()翻譯將R名稱衝突:

from rpy2.robjects.packages import importr 

base = importr('base', robject_translations={'with': '_with'}) 

base._with(work_case_control, ro.r.summary(formula, ro.r.summary.fun=sf)) 

而且一定要正確地創建您的公式。考慮使用R的統計軟件包'as.formula從字符串構建。由於命名衝突,請注意另一個翻譯:

stats = importr('stats', robject_translations={'format_perc': '_format_perc'}) 

formula = stats.as_formula('es_score ~ n + raingarden + consult_case') 
+0

感謝您提供這些提示。我認爲必須有一種方法來使用這樣的關鍵字,儘管我更喜歡其他解決方案。我確實嘗試了這些,並且在合格的'fun'參數中出現錯誤:'SyntaxError:keyword不能是表達式。' 這可能需要一些實驗,所以我會玩弄這個。 –

+0

*摘要*包是什麼?如果使用基本R,則嘗試使用基本對象而不是「ro.r」來限定函數和* fun * arg。 – Parfait

+0

我不認爲'樂趣'需要一個限定符。在PyCharm中,任何限定符都會拋出突出顯示的紅色語法錯誤,而沒有限定符顏色'fun'語法正確爲紫色(我將在此處附加圖像,但不能在註釋中)。因此,我相信這個語句應該是這樣的:'base._with(work_case_control,R.summary(formula,fun = sf))'...我相信我現在得到的錯誤:'NotImplementedError:Conversion' py2ri'沒有爲類型'''的對象定義,指的是我在R中實現'sf'函數。 –