Пэтси не очень удобна для подгонки общих нелинейных моделей, но модели на странице, на которую вы ссылаетесь, представляют собой особый вид нелинейной модели — они используют линейный метод подгонки модели. (OLS) и применяя его к нелинейным преобразованиям основных переменных. Стандартный и очень полезный прием — объединить несколько нелинейных преобразований одной и той же переменной, чтобы эффективно подогнать более общие кривые. Для этого очень пригодится пэтси.
Что вам действительно нужно знать, так это то, как выразить преобразование переменных в patsy. Это довольно легко. То, как работает patsy, учитывая строку формулы, такую как "x1 + x2:x3"
, сканирует и интерпретирует специальные операторы patsy, такие как +
и :
, а затем оставшиеся вещи (x1
, x2
, x3
) интерпретируются как произвольный код Python. Так что с тем же успехом вы можете написать "np.sin(x1) + np.log(x2):x3"
или что-то в этом роде.
Единственное, на что следует обратить внимание, это то, что если вы хотите написать преобразование, использующее операторы Python, которые конфликтуют с операторами patsy. Например, если вы хотите использовать +
или **
в своем преобразовании, вы должны быть осторожны, чтобы убедиться, что patsy не интерпретирует их самостоятельно и оставляет их для python. Хитрость здесь в том, что patsy будет игнорировать любые операторы, которые появляются внутри вызова функции (или другого сложного выражения Python, которое patsy не понимает, но в основном это вызовы функций). Итак, если вы напишите "x1 + np.log(x2 + x3)"
, то patsy будет рассматривать это как два предиктора, x1
и np.log(x2 + x3)
- вы можете видеть, что он интерпретировал первый +
, но оставил второй для интерпретации python.
Но что, если вы хотите, скажем, сложить вместе две переменные и использовать их в качестве предиктора, не прибегая к логарифму? Ну, из того, что мы уже знаем, мы можем придумать простой хак: мы могли бы определить функцию, которая просто возвращает свои входные данные (функция identity), и вызвать ее, например: "x1 + I(x2 + x3)"
. Теперь вызов функции I(...)
не позволит patsy увидеть второй +
, но когда мы на самом деле вычислим термин I(x2 + x3)
, он будет таким же, как x2
плюс x3
.
И кстати, patsy автоматически предоставляет функцию под названием I()
, которая работает следующим образом и всегда доступна для использования.
Теперь вы знаете все, что нужно знать, чтобы воспроизвести примеры на этой странице. Для первого используется формула "x + I(x**2)"
. Для второго формула "x + np.sin(x) + I((x - 5)**2)"
.
И для последнего примера проще всего использовать встроенную в patsy поддержку категориального кодирования: "x + C(groups)"
. (Здесь C
— еще одна специальная встроенная функция, которая позволяет нам настроить способ кодирования категориальных данных. Здесь мы просто используем ее, чтобы сообщить Пэтси, что хотя groups
выглядит как числовой вектор — его значения равны 0, 1, 2 — - на самом деле мы должны относиться к нему как к категориальному, где каждое значение представляет другую группу. Тогда patsy применяет свое категориальное кодирование по умолчанию)
person
Nathaniel J. Smith
schedule
15.06.2013