簡體   English   中英

在rpy2中繪制R函數曲線

[英]Plot an R function curve in 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中的參數傳遞給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以便在函數中繪制其曲線。

第二:我是否應該無法在python中構造函數invlogit(a + b*x)並將其傳遞給R的曲線函數進行評估?

我抓住invlogit通過使用STAP圖書館閱讀它從R文件: from rpy2.robjects.packages import STAP

第三:我是否使事情復雜化了? 我的目標是在嘗試在python / rpy2中進行新的分析之前,重新創建以前使用R / python / rpy2在R中進行的分析以遍歷所有特性。

只需傳遞一個實際的函數,調用或表達式,例如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()

RPy2曲線圖圖像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曲線圖圖像2


更新

專門針對OP的問題,要使用從模型系數派生的Python變量ab繪制反logit曲線,請考慮將其連接到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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM