在rpy2中绘制R函数曲线

时间:2016-09-26 20:43:47

标签: python r curve rpy2

我试图让情节在rpy2中成为一条简单的曲线。

R中的

curve((x))表现得如预期,但我不能在rpy2中实现它。

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

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

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

的错误

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

更一般地说,如何在rpy2 ala中绘制函数曲线:plotting function curve in R

编辑1

某些背景信息:

我试图绘制逆logit的曲线:

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形曲线。

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

据我所知,它在曲线函数中的表示是一个包含101个元素的ListVector。我不遵循它的意思,虽然它是最后一个环境表达的特殊R指定。"有人可以详细说明吗?如果这是R中的对象,我是否应该无法通过至少低级接口访问它?

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

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

我通过使用STAP库读取invlogit来获取from rpy2.robjects.packages import STAPuser.Region = new region{ regionName= usersGetModel.Region };

第三:我过度复杂吗?我的目标是在我尝试在python / rpy2中使用新的特性之前,使用python / rpy2重新创建我之前在R中完成的分析,以完成所有的特性。

1 个答案:

答案 0 :(得分: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

更新

特别针对OP的问题,使用从模型系数派生的Python变量 a b 绘制逆logit曲线,考虑将它们连接到{{ 1}}字符串参数:

robjects.r()