2016-09-26 173 views
0

我想在rpy2中绘制一条简单的曲线。在rpy2中绘制R函数曲线

curve((x)) R的行为与预期的一样,但我无法在rpy2中实现。

当我发出的顺序如下命令:

import rpy2.robjects as ro 
R = ro.r 
R.curve(R.x) 

我得到AttributeError: 'R' object has no attribute 'x' ...

如何访问x为蟒蛇内矢量化功能的错误? (我可以发出ro.r('curve((x))'),它按预期工作,但我需要能够将参数从python传递到曲线函数)。

更一般地,我怎么在rpy2绘制函数曲线阿拉这个帖子:plotting function curve in R

编辑1

一些背景:

我试图绘制的曲线反逻辑:

invlogit = function(x){ + exp(x)/(1 + exp(x)) } 

线性函数:

invlogit(coef(mod1)[1] + coef(mod1)[2]*x 

其中coef(mod1)是我运行的GLM的系数。

在R,我能做到以下几点:

plot(outcome~survrate, data = d, ylab = "P(outcome = 1 | 
survrate)", xlab = "SURVRATE: Probability of Survival after 5 
Years", xaxp = c(0, 95, 19)) 

curve(invlogit(coef(mod1)[1] + coef(mod1)[2]*x), add = TRUE) 

我得到预期的S形曲线。

我蟒蛇/ rpy2,我得到我的模型和系数:

formula = 'outcome~survrate' 
mod1 = R.glm(formula=R(formula), data=r_analytical_set, family=R('binomial(link="logit")')) 
s = R.summary(mod1) 
print(mod1) 
print(R.summary(mod1)) 

设置的情节

formula = Formula('outcome~survrate') 
formula.getenvironment()['outcome'] = data.rx2('outcome') 
formula.getenvironment()['survrate'] = data.rx2('survrate') 
R.plot(formula, data=data, ylab = 'P(outcome = 1 | outcome)', xlab = 'SURVRATE: Probability of Survival after 5 
Years", xaxp = c(0, 95, 19)) 

到目前为止好...

然后,我让我的系数来自型号:

a = R.coef(mod1)[0] 
b = R.coef(mod1)[1] 

然后试图通过传递这些参数来运行曲线的功能,都无济于事,想这样的构造如

R.curve(invlogit(a + b*R.x)) 

我已经试过许多人太除此之外,所有这一切都是尴尬怪异。首先,天真的问题:如果curve()中的term(x)是最后一个环境表达式的特殊R指定,我假设我应该能够通过python/rpy2以某种方式访问​​它。

我知道它在曲线函数中的表示是101个元素的ListVector。我并没有遵循它的意思,但它“是用于最后环境表达的特殊R指定”。有人可以详细说明吗?如果这是R中的一个对象,我是否应该无法通过至少低级别的接口访问它?

或者,我实际上是否必须创建x作为python函数来将我的x,y元组表示为两个列表,然后将它们转换为ListVector以便在该函数中使用以绘制其曲线。

第二:我不能在python中构造我的函数invlogit(a + b*x)并将它传递给R的曲线函数进行评估吗?

我使用STAP库读取它,从R文件抓取invlogitfrom rpy2.robjects.packages import STAP

第三:我是否在复杂的事情?我的目标是在我尝试在python/rpy2中做一个新的分析之前,重新创建一个我以前在R中使用python/rpy2来完成所有特性的分析。

回答

1

只需传入实际的函数,调用或表达式,如sin,因为x未在Python中分配。以下使用curve的R文档中的示例:curve(sin, -2*pi, 2*pi)。此外,因为你输出的图形使用grDevices(内置R中包)保存图像文件:

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

grdevices = importr('grDevices') 

grdevices.png(file="Rpy2Curve.png", width=512, height=512) 
p = ro.r('curve(sin, -2*pi, 2*pi)')  
grdevices.dev_off() 

RPy2 curve plot image 1

或者,您也可以定义(x)就像你的链接显示:

grdevices.png(file="Rpy2Curve.png", width=512, height=512) 
ro.r('''eq <- function(x) {x*x}''') 
p = ro.r('curve(eq,1,1000)')   # OUTPUTS TO FILE 
grdevices.dev_off() 

p = ro.r('curve(eq,1,1000)')   # OUTPUTS TO SCREEN 

RPy2 curve plot image 2


UPDATE

具体业务方案的问题,绘制与Python的变量逆分对数曲线,一个b,从模型系数得出,认为它们串联到robjects.r()字符串参数:

import rpy2.robjects as ro 
ro.r('invlogit <- function(x){ + exp(x)/(1 + exp(x)) }') 

p = ro.r('curve(invlogit({0} + {1}*x), add = TRUE)'.format(a,b)) 
+0

明白了,但为什么'ro.r('curve((x))')'工作,但是'ro.r.curve(ro.rx)'产生错误?如果我从RI得到'str(curve((x))'得到:'2 $ x:num [1:101]的列表0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 ... $ y:num [1:101] 0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 ...',但是除非以ro.r。('str(曲线((x))')执行,否则这将失败rpy2。 根据R的文档,'x'是一个矢量数值函数(参见[曲线](http://stat.ethz.ch/R-manual/R-patched/library/graphics/html/curve.html))...我应该能够以Python的方式访问rpy2,我应该怎么做? –

+0

更重要的是,有没有一种方法可以像'ro.rx'一样在python中访问'x'? –

+0

您正在封装'ro.r )''在第二个语句中有两次,'x'不是一个变量,'curve()'中的术语'(x)'是最后环境表达式的一个特殊的R指定,另一种访问'curve()导入图形:'graphi cs = importr('graphics'); graphics.curve(...)'。尝试我可能无法传递函数并希望包含该示例。 – Parfait