我正在进行序数逻辑回归,并按照此处的指南进行分析:R Data Analysis Examples: Ordinal Logistic Regression
我的数据框(咨询)如下:
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是序数排名得分,其值介于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 for scipy - 学习运行我的regreession ,但这是非常原始的)。
现在最欢迎任何建议。
修改
我尝试了各种组合@ Parfait的建议,并且fun
参数的限定在语法上是不正确的,根据PyCharm解释器(参见末尾带红色突出显示的图像): ...它没有无论限定词是什么,我总是得到一个错误
SyntaxError: keyword can't be an expression.
另一方面,没有限定符,没有语法错误:,但在使用函数TypeError: 'SignatureTranslatedAnonymousPackage' object is not callable
时我得到错误sf
:
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
我期待在加州大学洛杉矶分校网站上找到一张桌子。有趣。我将尝试在R中重新创建我的分析,只是为了它。我仍然想在python中完成它。
答案 0 :(得分:2)
考虑将with
电话括起来,并确保符合所有参数,包括 fun :
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&n的统计软件包&#39; as.formula
从字符串构建。请注意,由于命名冲突,还会进行另一次翻译:
stats = importr('stats', robject_translations={'format_perc': '_format_perc'})
formula = stats.as_formula('es_score ~ n + raingarden + consult_case')