Python rpy2:提取变量中的模型公式无效(tmp,simplify=TRUE)
我试图使用Python中的rpy2接口使用R“NADA”包。最终目标是对左删失环境数据进行生存分析。对于其他函数,Python和R之间的交互似乎是正确的,我能够在R中执行测试函数,但是在通过rpy2尝试相同的操作时,我遇到了一个错误 这是我用Python编写的代码。这完全是虚构的数据Python rpy2:提取变量中的模型公式无效(tmp,simplify=TRUE),python,r,python-3.x,rpy2,Python,R,Python 3.x,Rpy2,我试图使用Python中的rpy2接口使用R“NADA”包。最终目标是对左删失环境数据进行生存分析。对于其他函数,Python和R之间的交互似乎是正确的,我能够在R中执行测试函数,但是在通过rpy2尝试相同的操作时,我遇到了一个错误 这是我用Python编写的代码。这完全是虚构的数据 from rpy2.robjects import FloatVector, BoolVector, FactorVector from rpy2.robjects.packages import importr
from rpy2.robjects import FloatVector, BoolVector, FactorVector
from rpy2.robjects.packages import importr
nada = importr('NADA')
obs = FloatVector([1.0,2.0,3.0,5.0,56.0,1.0,4.0])
nds = BoolVector([False, True, True, True, True, False, True])
groups = FactorVector([1,0,1,0,1,1,0])
nada.cendiff(obs, nds, groups)
这是我收到的错误消息:
Traceback (most recent call last):
File "C:/Users/XXXXXXX/rpy2_test.py", line 9, in <module>
nada.cendiff(obs, nds, groups)
File "C:\Program Files\Python35\lib\site-packages\rpy2\robjects\functions.py", line 178, in __call__
return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)
File "C:\Program Files\Python35\lib\site-packages\rpy2\robjects\functions.py", line 106, in __call__
res = super(Function, self).__call__(*new_args, **new_kwargs)
rpy2.rinterface.RRuntimeError: Error in terms.formula(tmp, simplify = TRUE) :
invalid model formula in ExtractVars
我尝试在列出的rpy2错误行中添加一些打印行,并怀疑在将它们发送到函数时,rpy2删除因子向量中的级别可能存在问题。然而,我在一个新的领域,这可能只是一个红鲱鱼
如果有人能提供一些见解或其他选择,我将不胜感激。我有很多用Python编写的数据处理代码,完全使用R并不是一个好的选择,但R有更多的分析选项,所以我希望rpy2能做到这一点。当我对rpy2和/或其转换规则之一有疑问时 如果你做了一些意想不到的事情,那么检查起来就相对容易了。 例如:
from rpy2.robjects.vectors import FactorVector
from rpy2.robjects import r, globalenv
# factor with rpy2
groups = FactorVector([1,0,1,0,1,1,0])
# bind it to symbol in R's GlobalEnv
globalenv['groups_rpy2'] = groups
# it is the same as building the factor in R ?
r("""
...: groups <- factor(c(1,0,1,0,1,1,0))
...: print(identical(groups, groups_rpy2))
...: """)
[1]
TRUE
# apparently so
及
解决这个问题的一种方法是将对象绑定到R命名空间/环境中的符号,并在该命名空间中计算调用。这可以在任何R环境中完成,但如果使用“GlobalEnv”(在这种情况下,请记住GlobalEnv的内容会一直存在,直到嵌入式R关闭):
(参见中的
as_symbol
的其他用法)@Parfait感谢您的留言!我在多次测试中改变了长度,看看这是否是一个问题,但它没有改变任何东西。我一定在这里复制并粘贴了不同的版本。它似乎是survival
包中例程的前端。因此,在R中,您可能会访问Python环境中未加载的依赖项。简单的导入可能不起作用,因为Python中加载的两个对象是单独的全局对象(即,源代码不知道您给它的命名对象)。您可能需要从原始的survival
重新创建cendiff
调用,挖掘包的代码!你是对的,cendiff基本上是生存包中survdiff的前端。它将截尾从左截尾反转为右截尾,因此可以应用统计公式并考虑一些其他变量。我试着浏览了一些源代码,并确定了其中的一些部分(如翻转),但还没有确定它如何处理分组。我在NADA包中测试了Kendall Tau功能,并且使用逻辑和数字向量(rpy2中的BoolVector和FloatVector)工作得很好。我怀疑这个问题与rpy2如何将FactorVectors传递到R包有关。非常感谢!它与一些快速剪切和粘贴效果很好。明天我将努力清理我的代码并更好地理解它。我也很欣赏熊猫的联系。在你发表文章之前,我一直试图通过使用pandas数据框和带有rmagic的iPython控制台来解决这个问题,但我不相信一旦我开始循环生成的SQL查询,这会起作用。我相信你链接的globalenv填补了缺失的一部分,没有iPython的复杂性。
from rpy2.robjects.vectors import FactorVector
from rpy2.robjects import r, globalenv
# factor with rpy2
groups = FactorVector([1,0,1,0,1,1,0])
# bind it to symbol in R's GlobalEnv
globalenv['groups_rpy2'] = groups
# it is the same as building the factor in R ?
r("""
...: groups <- factor(c(1,0,1,0,1,1,0))
...: print(identical(groups, groups_rpy2))
...: """)
[1]
TRUE
# apparently so
setMethod("cendiff",
signature(obs="numeric", censored="logical", groups="factor"),
cencen.vectors.groups)
cencen.vectors.groups =
function(obs, censored, groups, ...)
{
cl = match.call()
f = substitute(Cen(a, b)~g, list(a=cl[[2]], b=cl[[3]], g=cl[[4]]))
f = as.formula(f)
environment(f) = parent.frame()
callGeneric(f, ...)
}
from rpy2.robjects.packages import importr
base = importr('base')
# bind to R symbols
globalenv["obs"] = obs
globalenv["nds"] = nds
globalenv["groups"] = groups
# make the call
nada.cendiff(base.as_symbol('obs'),
base.as_symbol('nds'),
base.as_symbol('groups'))