Python 在rpy2中绘制R函数曲线
我试图在rpy2中绘制一条简单的曲线 R中的曲线((x))的行为符合预期,但我无法在rpy2中实现这一点 当我按顺序发出以下命令时: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
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))