R-将patsy.dmatrices()与网状结构一起使用

时间:2018-06-25 19:45:58

标签: r patsy reticulate

尝试在patsy.dmatrices() R包中使用函数reticulate时遇到命名空间问题。

这是一个简单的可复制示例:

patsy <- import("patsy")
# Data
dataset <- data.frame(Y=rnorm(1000,2.5,1))
# Null model
formula_null <- "I(Y-1) ~ 1"
dmat = patsy$dmatrices(formula_null, data=dataset, NA_action="drop",
                                         return_type="dataframe")

我收到以下错误:

Error in py_call_impl(callable, dots$args, dots$keywords) : 
AttributeError: 'NoneType' object has no attribute 'f_locals'

我认为这与名称空间相关(参见Namespace issues when calling patsy within a function),可以使用功能eval_env的{​​{1}}自变量来解决此问题,但我无法弄清楚

当我们要在R中使用Python dmatrices()程序包时,这是很成问题的,该程序包将statsmodels程序包用于公式。

感谢您的帮助,

1 个答案:

答案 0 :(得分:0)

我不确定,但是我认为您对名称空间的猜测是正确的,这是patsy和网状结构之间的不幸交互。默认情况下,patsy尝试查看调用者的作用域以评估公式中所有无法识别的函数/变量(就像R公式函数一样)。这需要使用Python的堆栈自检来窥视调用方的作用域。但是由于呼叫者使用的是完全不同的语言,因此几乎可以肯定这是行不通的。

可以使用eval_env的{​​{1}}参数来覆盖patsy读取调用者名称空间的正常行为。 (Docs。)试试这个:

dmatrices

这个想法是,在这里我们创建一个空的dmat = patsy$dmatrices(formula_null, data=dataset, NA_action="drop", return_type="dataframe", # New: eval_env=patsy$EvalEnvironment(c()) ) 对象,并告诉patsy使用该对象,而不是尝试读取调用者的环境。

我对网状结构不熟悉,因此您可能需要调整以上内容才能工作-在Python中,等效项是:

EvalEnvironment

尤其是,如果网状结构不会将dmat = patsy.dmatrices(formula_null, data=dataset, NA_action="drop", return_type="dataframe", eval_env=patsy.EvalEnvironment([]) 转换为空列表,那么您将想找到可以做的事情。 (也许尝试c()?)