Как использовать оператор 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')