R - Использование patsy.dmatrices () с сеткой - PullRequest
0 голосов
/ 25 июня 2018

У меня проблема с пространством имен при попытке использовать функцию 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'

Я думаю, что это связано с пространством имен (см. Проблемы с пространством имен при вызове patsy в функции ), которые могут быть исправлены с помощью аргумента eval_envfunction dmatrices() но я не смог понять, как это сделать.

Это довольно проблематично, когда мы хотим использовать в R пакет Python statsmodels, который использует пакет patsy для формул.

Спасибо за помощь,

1 Ответ

0 голосов
/ 26 июня 2018

Я не уверен, но я думаю, что ваше предположение о пространствах имен правильное, и это неудачное взаимодействие между патсом и сеткой.По умолчанию, patsy пытается заглянуть в область действия вызывающего, чтобы оценить любые нераспознанные функции / переменные в формуле (как это делают функции формулы R).Для этого необходимо использовать интроспекцию стека Python, чтобы взглянуть на область действия вызывающего.Но поскольку вызывающая сторона полностью находится на другом языке, это почти наверняка не сработает.

Можно изменить обычное поведение Пэтси при чтении пространства имен вызывающей стороны, используя аргумент eval_env для * 1004.*.( Docs .) Попробуйте это:

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

Идея состоит в том, что здесь мы создаем пустой объект EvalEnvironment и говорим patsy использовать его вместо попытки прочитать среду вызывающего..

Я не знаком с сеткой, поэтому вам может понадобиться настроить вышеприведенное для работы - в Python эквивалент будет:

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

В частности, если сетка не работаетконвертируйте c() в пустой список, тогда вы захотите найти что-нибудь подходящее.(Может попробовать patsy$EvalEnvironment(list())?)

...