Python 在rpy2中绘制R函数曲线

Python 在rpy2中绘制R函数曲线,python,r,curve,rpy2,Python,R,Curve,Rpy2,我试图在rpy2中绘制一条简单的曲线 R中的曲线((x))的行为符合预期,但我无法在rpy2中实现这一点 当我按顺序发出以下命令时: import rpy2.robjects as ro R = ro.r R.curve(R.x) 我得到的错误是,AttributeError:'R'对象没有属性“x” 如何在python中访问x作为矢量化函数?(我可以发布ro.r('curve((x)))并按预期工作,但我需要能够将参数从python传递给curve函数) 更一般地说,我如何在本文的rpy2

我试图在rpy2中绘制一条简单的曲线

R中的曲线((x))的行为符合预期,但我无法在rpy2中实现这一点

当我按顺序发出以下命令时:

import rpy2.robjects as ro
R = ro.r
R.curve(R.x) 
我得到的错误是,
AttributeError:'R'对象没有属性“x”

如何在python中访问
x
作为矢量化函数?(我可以发布
ro.r('curve((x)))
并按预期工作,但我需要能够将参数从python传递给curve函数)

更一般地说,我如何在本文的rpy2中绘制函数曲线:

编辑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形曲线

I python/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()中的术语(x)是最后一个环境表达式的特殊R表示,我假设我应该能够通过python/rpy2以某种方式访问它

我知道它在曲线函数中的表示是101个元素的ListVector。我不明白它的意思,尽管它“是最后一个环境表达的一个特殊的R名称。”有人能详细说明一下吗?如果这是R中的一个对象,我是否应该至少通过低级接口不能访问它

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

第二:我应该不能在python中构造我的函数,
invlogit(a+b*x)
,并将其传递给R的曲线函数进行求值吗

我使用STAP库从R文件中读取
invlogit
:从rpy2.robjects.packages导入STAP


第三:我把事情复杂化了吗?我的目标是在尝试在python/rpy2中进行新的分析之前,重新创建我以前在R中使用python/rpy2进行的分析,以解决所有的特性。

只需传入一个实际的函数、调用或表达式,如
sin
,因为
x
在python中没有赋值。下面使用R文档中的示例:
曲线(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()

或者,您可以定义
(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 

明白了,但是为什么
ro.r('curve((x)))
起作用,但是
ro.r.curve(ro.r.x)
会产生错误?如果我从R中做一个
str(curve((x))
,我会得到:
列表2$x:num[1:101]0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09…$y:num[1:101]0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08…
,但在rpy2中,除非作为ro.R执行('str(curve((x)),否则会失败).根据R的文档,
x
是一个矢量化数字函数(请参阅)…我应该能够以Pythonish的方式从rpy2访问这个函数,不是吗?更重要的是,在python中是否有类似于
ro.R.x
的方式访问
x
?您正在包装
ro.R()
在第二条语句中两次,并且
x
不是一个变量。
curve()
中的术语
(x)
是最后一个环境表达式的特殊R名称。访问
curve()
的另一种方法是导入图形:
graphics=importr('graphics');graphics.curve(…)
。尽我所能,我无法传递函数,希望包含该示例。我在python中使用GLM中的系数构建了一个相当复杂的公式,该公式将传递给曲线函数。我将使用它并发布结果。请参阅更新,将python变量传递到曲线调用的字符串值中。由y、 使用的
R.
限定符是什么?这是伪代码吗?它怎么能同时携带
.glm、.summary、.coeff、.curve、.plot的属性?一个神奇的对象!使用
robjects
,我收到
AttributeError:“module”对象没有属性“curve”
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))