2016-09-26 3 views
0

Я пытаюсь получить график простой кривой в rpy2.Запланируйте кривую функции R в 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 ала это сообщение: plotting function curve in R

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

И я получаю ожидаемый сигмовидной кривой.

Я питон/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)) 

Я пробовал много других тоже, кроме этого, все из которых являются ошеломляюще странно.

Во-первых, наивный вопрос: если термин (x) в кривой() является специальным обозначением R для последнего выражения среды, я предполагаю, что я должен получить доступ к нему каким-то образом через python/rpy2.

Я понимаю, что его представление в функции кривой является ListVector из 101 элемента. Я не понимаю, что это значит, потому что это «специальное обозначение R для последнего выражения среды». Может кто-нибудь прокомментировать?Если это объект в R, не должен ли я иметь доступ к нему через, по крайней мере, интерфейс низкого уровня?

Или мне действительно нужно создать x в качестве функции python для представления моих x, y кортежей в виде двух списков, а затем преобразовать их в ListVector для использования в функции для построения кривой.

Во-вторых: Должен ли я не построить мою функцию, invlogit(a + b*x) в python и передать ее для оценки в функции кривой R?

Я извлекаю invlogit из файла R, читая его в использовании библиотеки STAP: from rpy2.robjects.packages import STAP.

В-третьих: Я чем-то усложняю? Моя цель - воссоздать анализ, который я ранее делал в R, используя python/rpy2, чтобы работать по всем особенностям, прежде чем я попытаюсь сделать новый в python/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() 

RPy2 curve plot image 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 curve plot image 2


UPDATE

Специально для выпуска в ФПЕ, в построить кривой обратной логит с переменным Python, в и б, полученный из коэффициентов модели, рассмотрит конкатенацию их с параметром 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)) 
+0

Получил это, но почему 'ro.r ('curve ((x))')' работает, но 'ro.r.curve (ro.rx)' создает ошибку? Если я делаю 'str (кривая ((x))' из RI get: 'Список из 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' является векторизованной числовой функцией (см. [кривая] (http://stat.ethz.ch/R-manual/R-patched/library/graphics/html/curve.html)) ... Я должен иметь доступ к этому из rpy2 в Pythonish, не должен ли я? –

+0

Более фундаментально, есть ли способ доступа к 'x' в python, например' ro.rx'? –

+0

Вы обертываете 'ro.r () 'дважды в этом втором утверждении, а' x' не является переменной. Термин '(x)' в 'curve()' является специальным обозначением R. для последнего выражения среды. Другой способ доступа к 'curve()' - импорт графики: 'graphi cs = importr ('graphics'); graphics.curve (...) '. Попытайтесь, чтобы я не мог передать функцию и хотел включить этот пример. – Parfait

Смежные вопросы