Ошибка вызова функции R из Python с использованием rpy2 с библиотекой выживания - PullRequest
0 голосов
/ 16 мая 2018

При вызове функции из пакета выживания в R из Python с интерфейсом rpy2 я получаю следующую ошибку:

RRuntimeError: Ошибка в формуле [[2]]: нижний индекс вне границ

Любой указатель для решения проблемы, пожалуйста?

Спасибо

Код:

import pandas as pd
import rpy2.robjects.packages as rpackages
from rpy2.robjects.vectors import StrVector
from rpy2.robjects.packages import importr
import rpy2.robjects as ro
R = ro.r
from rpy2.robjects import pandas2ri

pandas2ri.activate()


## install the survival package
utils = rpackages.importr('utils')
utils.chooseCRANmirror(ind=1) # select the first mirror in the list
utils.install_packages(StrVector('survival'))


#Load the library and example data set
survival=importr('survival')
infert = R('infert')

## Linear model works fine
reslm=R.lm('case~spontaneous+induced',data=infert)

#Run the example clogit function, which fails
rescl=R.clogit('case~spontaneous+induced+strata(stratum)',data=infert)

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Сбой при включении функции strata() в формулу, потому что она не оценивается в правильной среде. В R формулы - это специальные языковые конструкции, поэтому они должны обрабатываться rpy2 отдельно.

Итак, для вашего примера это будет выглядеть так:

rescl = R.clogit(ro.Formula('case ~ spontaneous + induced + strata(stratum)'),
                 data = infert)

См. Документацию для rpy2.robjects.Formula для получения более подробной информации. В этой документации также обсуждаются плюсы и минусы этого подхода по сравнению с @ Gwang-jin-kim

0 голосов
/ 20 мая 2018

Попробовав, я обнаружил, что есть разница, предлагаете ли вы R-экземпляр rpy2 для выполнения полной строки R-кода или нет.

Таким образом, вы можете заставить свою функцию работать, задавая как можно больше кода R:

#Run the example clogit function, which fails
rescl=R.clogit('case~spontaneous+induced+strata(stratum)',data=infert)

#But give the R code to be executed as one complete string - this works:
rescl=R('clogit(case ~ spontaneous + induced + strata(stratum), data = infert)')

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

Например,

R('rescl.in.R <- clogit(case ~ spontaneous + induced + strata(stratum), data = infert)')

R('str(rescl.in.R)')

# or:
R('coef(rescl.in.R)')
## array([1.98587552, 1.40901163])

R('names(rescl.in.R)') 
## array(['coefficients', 'var', 'loglik', 'score', 'iter',
##        'linear.predictors', 'residuals', 'means', 'method', 'n', 'nevent',
##        'terms', 'assign', 'wald.test', 'y', 'formula', 'xlevels', 'call',
##        'userCall'], dtype='<U17')

Это очень помогает - по крайней мере, на этом первом этапе использования rpy2 (для меня тоже), чтобы ваш экземпляр r был открыт и пыталсяпараллельный код, который вы делаете, так как вывод в R гораздо более читабелен, и вы знаете и видите, что делаете и на что можете обратиться.В Python вывод лишен важной информации (например, имени и т. Д.), И, кроме того, он не очень печатный.

...