Как использовать оператор R 'с' в rpy2

Я делаю порядковую логистическую регрессию и следую приведенному здесь руководству для анализа: R Примеры анализа данных: Порядковая логистическая регрессия

Мой фрейм данных (посоветуйтесь) выглядит так:

           n  raingarden  es_score  consult_case
garden_id                                       
27436      7           0         3             0
27437      1           0         0             1
27439      1           1         1             1
37253      1           0         3             0
37256      3           0         0             0

Я нахожусь в той части, где мне нужно создать график, чтобы проверить предположение пропорциональных шансов, с командой в R следующим образом:

(s <- with(dat, summary(es_score ~ n + raingarden + consult_case, fun=sf)))

(es_score - порядковый ранжированный счет со значениями от 0 до 4; n - целое число; raingarden и consult_case, двоичные значения 0 или 1)

У меня есть функция sf:

sf <- function(y) {
     c('Y>=1' = qlogis(mean(y >= 1)),
       'Y>=2' = qlogis(mean(y >= 2)),
       'Y>=3' = qlogis(mean(y >= 3)))
}

в файле utils.r, к которому я обращаюсь следующим образом:

from rpy2.robjects.packages import STAP
with open('/file_path/utils.r', 'r') as f:
    string = f.read()
sf = STAP(string, "sf")

И хочу сделать что-то вроде:

R = ro.r
R.with(work_case_control, R.summary(formula, fun=sf))

Основная проблема заключается в том, что R withоператор рассматривается как ключевое слово python, так что даже если я получу к нему доступ с ro.r.with он все еще распознается как ключевое слово python. (В качестве примечания: я пытался использовать R apply метод, но получил ошибку, TypeError: 'SignatureTranslatedAnonymousPackage' object is not callable... Я предполагаю, что это относится к моей функции sf?)

Я также попытался использовать методы присваивания R в rpy2 следующим образом:

R('sf = function(y) { c(\'Y>=1\' = qlogis(mean(y >= 1)), \'Y>=2\' = qlogis(mean(y >= 2)), \'Y>=3\' = qlogis(mean(y >= 3)))}')

R('s <- with({0}, summary(es_score~raingarden + consult_case, fun=sf)'.format(consult))

но столкнулись с проблемами, когда имена столбцов в dataframe как-то вызывали ошибку: RRuntimeError: Error in (function (file = "", n = NULL, text = NULL, prompt = "?", keep.source = getOption("keep.source"), : <text>:1:19: unexpected symbol 1: s <- with( n raingarden

Я, конечно, мог бы делать все это в R, но у меня есть очень сложный ETL-скрипт на python, и поэтому я бы предпочел, чтобы все оставалось на python с использованием rpy2 (я пробовал это использовать mord для scipy-learn, чтобы запустить мою повторную работу, но довольно примитивно).

Любые предложения будут приветствоваться прямо сейчас.

РЕДАКТИРОВАТЬ

Я пробовал различные комбинации @ предложений Парфе, и квалифицировал fun аргумент синтаксически неверен, согласно интерпретатору PyCharm (см. изображение с красной подсветкой в ​​конце): с квалифицированным веселым ключевым словом... неважно, что это за квалификатор, я всегда получаю сообщение об ошибке SyntaxError: keyword can't be an expression.

С другой стороны, без квалификатора нет синтаксической ошибки: безоговорочное забавное ключевое слово но я получаю ошибку TypeError: 'SignatureTranslatedAnonymousPackage' object is not callable при использовании функции sf как получено:

from rpy2.robjects.packages import STAP with open('/Users/gregsilverman/development/python/rest_api/rest_api/scripts/utils.r', 'r') as f: string = f.read() sf = STAP(string, "sf")

Имея это в виду, я создал пакет в R с функцией sf, импортировал его и пробовал различные комбинации, но единственная ошибка не вызвала: print(base._with(consult_case_control, R.summary(formula, fun=gms.sf))) (gms - это ссылка на пакет в R I made).

Вывод, однако, не имеет смысла:

Length Class Mode 3 formula call

Я ожидаю, что таблица будет на сайте UCLA. Интересно. Я собираюсь попытаться воссоздать свой анализ в R, просто ради этого. Я все еще хотел бы завершить это в Python, хотя.

1 ответ

Решение

Подумайте над тем, чтобы заключить в скобки with позвоните и обязательно уточните все аргументы, включая веселье:

ro.r['with'](work_case_control, ro.r.summary(formula, ro.r.summary.fun=sf))

Или же импортируйте базовый пакет R. И чтобы избежать конфликта с именованным методом Python with() перевести название R:

from rpy2.robjects.packages import importr

base = importr('base', robject_translations={'with': '_with'})

base._with(work_case_control, ro.r.summary(formula, ro.r.summary.fun=sf))

И обязательно правильно создайте свою формулу. Рассмотрите возможность использования пакетов статистики R' as.formula строить из строки. Обратите внимание, что другой перевод сделан из-за конфликта имен:

stats = importr('stats', robject_translations={'format_perc': '_format_perc'})

formula = stats.as_formula('es_score ~ n + raingarden + consult_case')
Другие вопросы по тегам