在 rpy2 中绘制 R 函数曲线
Plot an R function curve in rpy2
我试图在 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 传递到曲线函数)。
更一般地说,我如何在 rpy2 ala 中绘制函数曲线 post: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 I 的系数 运行。
在 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() 中的术语 (x) 是最后一个环境表达式的特殊 R 名称,我假设我应该能够通过 python/rpy2 以某种方式访问它。
据我所知,它在曲线函数中的表示是一个包含 101 个元素的 ListVector。我不明白它的意思 "is a special R designation for last environment expression." 有人可以详细说明一下吗?如果这是 R 中的一个对象,我是否应该不能通过至少低级接口访问它?
或者,我是否真的必须创建 x
作为 python 函数来将我的 x、y 元组表示为两个列表,然后将它们转换为 ListVector 以用于绘制函数它的曲线。
其次:难道我不能在 python 中构建我的函数 invlogit(a + b*x)
并将其传递给 R 的曲线函数进行评估吗?
我正在使用 STAP 库从 R 文件中读取 invlogit
:from rpy2.robjects.packages import STAP
。
第三:我是不是把事情复杂化了?我的目标是在我尝试在 python/rpy2.
中进行新的分析之前,使用 python/rpy2 重新创建我之前在 R 中完成的分析以解决所有问题
只需传入实际的函数、调用或表达式,如 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()
或者,您可以像 link 显示的那样定义 (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,从模型系数导出,考虑将它们连接到 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))
我试图在 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 传递到曲线函数)。
更一般地说,我如何在 rpy2 ala 中绘制函数曲线 post: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 I 的系数 运行。
在 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() 中的术语 (x) 是最后一个环境表达式的特殊 R 名称,我假设我应该能够通过 python/rpy2 以某种方式访问它。
据我所知,它在曲线函数中的表示是一个包含 101 个元素的 ListVector。我不明白它的意思 "is a special R designation for last environment expression." 有人可以详细说明一下吗?如果这是 R 中的一个对象,我是否应该不能通过至少低级接口访问它?
或者,我是否真的必须创建 x
作为 python 函数来将我的 x、y 元组表示为两个列表,然后将它们转换为 ListVector 以用于绘制函数它的曲线。
其次:难道我不能在 python 中构建我的函数 invlogit(a + b*x)
并将其传递给 R 的曲线函数进行评估吗?
我正在使用 STAP 库从 R 文件中读取 invlogit
:from rpy2.robjects.packages import STAP
。
第三:我是不是把事情复杂化了?我的目标是在我尝试在 python/rpy2.
中进行新的分析之前,使用 python/rpy2 重新创建我之前在 R 中完成的分析以解决所有问题只需传入实际的函数、调用或表达式,如 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()
或者,您可以像 link 显示的那样定义 (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,从模型系数导出,考虑将它们连接到 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))