【问题标题】:R - Using patsy.dmatrices() with reticulateR - 使用带有网状结构的 patsy.dmatrices()
【发布时间】:2018-06-25 19:45:58
【问题描述】:

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

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

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),这可能通过使用函数dmatrices() 的eval_env 参数来修复,但我无法弄清楚如何。

当我们想在 R 中使用 Python statsmodels 包时,这是非常有问题的,它使用 patsy 包来计算公式。

感谢您的帮助,

【问题讨论】:

    标签: r patsy reticulate


    【解决方案1】:

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

    可以使用dmatrices 的eval_env 参数来覆盖patsy 读取调用者命名空间的正常行为。 (Docs.) 试试这个:

    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())?)

    【讨论】:

    • 谢谢你,这是一个完整的救生员!
    猜你喜欢
    • 2020-05-30
    • 1970-01-01
    • 2021-02-01
    • 2019-06-01
    • 2019-12-25
    • 2020-09-01
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    相关资源
    最近更新 更多