尝试在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
程序包用于公式。
感谢您的帮助,
答案 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()
?)