Сила Пэтси не допускает отрицательных целых чисел, поэтому, если у нас есть ряд данных X
,
patsy.dmatrices('X + X**(-1)', X)
возвращает ошибку. Как бы я добавил обратное значение X к такой нелепой формуле?
Сила Пэтси не допускает отрицательных целых чисел, поэтому, если у нас есть ряд данных X
,
patsy.dmatrices('X + X**(-1)', X)
возвращает ошибку. Как бы я добавил обратное значение X к такой нелепой формуле?
Специальное патетическое значение операторов отключается внутри вызовов встроенных функций; поэтому, если вы пишете X + 1 / x
, то patsy интерпретирует это как специальные операторы patsy +
и /
, но если вы пишете что-то вроде X + sin(1 / X)
, то patsy продолжает интерпретировать +
как специальный оператор patsy, но все выражение sin(1 / X)
передается Python для оценки , и Python будет оценивать /
как обычное деление.
Так что все в порядке, если мы хотим вычислить sin(1 / X)
. Но мы этого не делаем (зачем?). Мы просто хотим простой 1 / X
. Итак, как мы можем это сделать?
Ну, мы можем пойти на хитрость: нам нужен вызов функции, чтобы обмануть синтаксический анализатор Пэтси, чтобы он проигнорировал /
и передал его Python, но ничто не говорит, что функция должна делать что-либо. Мы могли бы просто определить функцию идентификации:
def identity(value):
return value
а затем используйте это в такой формуле, как X + identity(1 / X)
.
И на самом деле, этот трюк настолько удобен, что patsy уже предопределил для вас функцию и предоставляет ее в виде ссылки встроенный с именем I(...)
. Как правило, вы можете думать о I(...)
как о своего рода операторе кавычек - это способ сказать: «Эй, patsy, пожалуйста, не пытайтесь интерпретировать что-либо в этом регионе, просто передайте это Python kthx».
Итак, чтобы ответить на ваш первоначальный вопрос: попробуйте написать dmatrix("X + I(1 / X)", data)
(Следующий вопрос: зачем этот странный хак с функцией I
и всем остальным? Ответ на этот вопрос заключается в том, что R сделал это 30 лет назад, и я не мог придумать ничего лучше, чем стоило бы нарушать совместимость.)
(1 / X)
тоже нельзя? - person Rob Foley   schedule 09.09.2015/
определено в patsy, будет вычислять1 + 1:X
. - person T.C. Proctor   schedule 10.09.2015