0

尝试将函数patsy.dmatrices()reticulateR 包一起使用时,我遇到了命名空间问题。

这是一个简单的可重现示例:

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'

我认为这与命名空间相关联(参见命名空间问题在函数中调用 patsy 时),这可以通过使用eval_env函数的参数来解决,dmatrices()但我无法弄清楚如何。

当我们想在 R 中使用 Pythonstatsmodels包时,这是非常有问题的,该patsy包使用公式包。

谢谢你的帮助,

4

1 回答 1

1

我不确定,但我认为您对命名空间的猜测是正确的,这是 patsy 和 reticulate 之间的不幸交互。默认情况下,patsy 会尝试查看调用者的范围以评估公式中任何无法识别的函数/变量(就像 R 公式函数一样)。这需要使用 Python 的堆栈自省来查看调用者的范围。但由于调用者完全使用不同的语言,这几乎可以肯定是行不通的。

eval_env可以使用dmatrices. (文档。)试试这个:

dmat = patsy$dmatrices(formula_null, data=dataset, NA_action="drop",
                       return_type="dataframe",
                       # New:
                       eval_env=patsy$EvalEnvironment(c())
                       )

我们的想法是在这里我们创建一个空EvalEnvironment对象,并告诉 patsy 使用它而不是尝试读取调用者的环境。

我对 reticulate 不熟悉,所以你可能需要调整上面的内容才能工作——在 Python 中相当于:

dmat = patsy.dmatrices(formula_null, data=dataset, NA_action="drop",
                       return_type="dataframe",
                       eval_env=patsy.EvalEnvironment([])

特别是,如果 reticulate 不转换c()为空列表,那么您将需要找到可以转换的东西。(也许试试patsy$EvalEnvironment(list())?)

于 2018-06-26T16:52:01.227 回答