Взаимные отношения в patsy

Сила Пэтси не допускает отрицательных целых чисел, поэтому, если у нас есть ряд данных X,

patsy.dmatrices('X + X**(-1)', X)

возвращает ошибку. Как бы я добавил обратное значение X к такой нелепой формуле?


person T.C. Proctor    schedule 09.09.2015    source источник
comment
(1 / X) тоже нельзя?   -  person Rob Foley    schedule 09.09.2015
comment
Нет, 1 зарезервировано для констант.   -  person T.C. Proctor    schedule 10.09.2015
comment
Кроме того, то, как / определено в patsy, будет вычислять 1 + 1:X.   -  person T.C. Proctor    schedule 10.09.2015
comment
Что нелепо для I + I * X, где I — постоянный вектор.   -  person T.C. Proctor    schedule 10.09.2015


Ответы (1)


Специальное патетическое значение операторов отключается внутри вызовов встроенных функций; поэтому, если вы пишете 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 лет назад, и я не мог придумать ничего лучше, чем стоило бы нарушать совместимость.)

person Nathaniel J. Smith    schedule 11.04.2016
comment
Я знаю, что задал неясный вопрос, когда спустя 6 месяцев наконец получил ответ от парня, написавшего программу, о которой я спрашиваю. - person T.C. Proctor; 11.04.2016
comment
Мне интересно, как patsy справится с такими вещами, как $I(X%in%c("A", "B", "D"))$, что очень прямолинейно в R - person xappppp; 12.06.2018
comment
Благодарю вас! Поскольку я люблю R и мне приходится использовать python, я очень рад этому.. :) тем не менее, это выражение I() можно было бы упомянуть где-нибудь в документации более очевидным образом. Может быть или, вероятно, это так, но мне потребовался час, прежде чем я нашел этот пост здесь .. однако, спасибо! - person Ben; 05.02.2020