[英]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()
另外,您可以定義(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()
字符串參數:
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.