我正在尝试使绘图在rpy2中成为一条简单曲线。
curve((x))
R中的行为符合预期,但我无法在rpy2中实现。
当我依次发出以下命令时:
import rpy2.robjects as ro
R = ro.r
R.curve(R.x)
我得到的错误是AttributeError: 'R' object has no attribute 'x'
...
如何x
在python中作为向量化功能访问?(我可以发出命令ro.r('curve((x))')
,并且可以按预期工作,但是我需要能够将参数从python传递到curve函数)。
更笼统地说,我如何在rpy2中绘制函数曲线?这篇文章:在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形曲线。
我是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]
然后尝试通过传递这些参数来运行curve函数,但无济于事,尝试使用以下结构:
R.curve(invlogit(a + b*R.x))
除此以外,我还尝试了许多其他方法,所有这些方法都令人尴尬地怪异。
首先,是一个幼稚的问题:如果curve()中的(x)项是最后一个环境表达式的特殊R名称,那么我想我应该能够通过python / rpy2以某种方式访问它。
我知道它在曲线函数中的表示形式是101个元素的ListVector。我不理解它的含义,尽管它“是最后一个环境表达的特殊R名称”。有人可以详细说明一下吗?如果这是R中的对象,我是否至少不能通过低级接口访问它?
或者,实际上我是否必须创建x
为python函数,以将我的x,y元组表示为两个列表,然后将它们转换为ListVector以便在函数中绘制其曲线。
第二:我是否应该无法invlogit(a + b*x)
在python中构造函数并将其传递给R的曲线函数进行评估?
我抓住invlogit
从R档在使用STAP图书馆阅读它:from rpy2.robjects.packages import STAP
。
第三:我是否使事情复杂化了?我的目标是在尝试在python / rpy2中进行新的分析之前,重新创建以前使用R / python / rpy2在R中进行的分析以处理所有特性。
简单地传递在实际的功能,呼叫,或类似的表达sin
如x
在Python没有被分配。下面使用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()
另外,您可以(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
更新
专门针对OP的问题,要使用从模型系数得出的Python变量a和b绘制logit逆曲线,请考虑将其连接到robjects.r()
string参数:
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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句