【问题标题】:Plot an R function curve in rpy2在 rpy2 中绘制 R 函数曲线
【发布时间】:2016-09-26 20:43:46
【问题描述】:

我试图在 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 这篇文章: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() 中的术语 (x) 是最后一个环境表达式的特殊 R 名称,我假设我应该能够通过 python/rpy2 以某种方式访问​​它。

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

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

第二:我是否应该无法在 python 中构造我的函数invlogit(a + b*x) 并将其传递给 R 的曲线函数进行评估?

我正在使用 STAP 库读取 R 文件中的 invlogitfrom rpy2.robjects.packages import STAP

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

【问题讨论】:

    标签: python r curve rpy2


    【解决方案1】:

    只需传入一个实际的函数、调用或表达式,如sin,因为x 未在 Python 中分配。下面使用 R 文档中 curve 的示例: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 变量绘制逆 logit 曲线,ab,从模型系数派生,考虑将它们连接到 @987654334 @字符串参数:

    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))
    

    【讨论】:

    • 知道了,但为什么ro.r('curve((x))') 工作,但ro.r.curve(ro.r.x) 产生错误?如果我从 R 中执行 str(curve((x)),我会得到:List of 2 $ x: num [1:101] 0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 ... $ y: num [1:101] 0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 ...,但这在 rpy2 中会失败,除非以 ro.r.('str(curve((x))') 执行。根据 R 的文档,x是一个矢量化数值函数(请参阅curve)...我应该能够以 Python 方式从 rpy2 访问它,不是吗?
    • 更根本的是,有没有办法像ro.r.x一样在python中访问x
    • 您在第二条语句中将ro.r() 包装了两次,而x 不是变量。 curve() 中的术语 (x) 是最后一个环境表达式的特殊 R 名称。访问curve() 的另一种方法是导入图形:graphics = importr('graphics'); graphics.curve(...)。尽我所能尝试我无法传递函数并希望包含该示例。
    • 我有一个相当复杂的公式,我在 python 中使用来自传递给曲线函数的 GLM 的系数构建。我会玩弄它并发布结果。
    • 查看更新,将 Python 变量传递到曲线调用的字符串值中。顺便问一下,R. 使用的限定符是什么?这是伪代码吗?怎么可能同时携带.glm, .summary, .coeff, .curve, .plot的属性?一个神奇的物体!使用robjects,我收到AttributeError: 'module' object has no attribute 'curve'
    猜你喜欢
    • 2021-07-05
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多