statsmodels: указание моделей нелинейной регрессии с использованием patsy

Я пытаюсь рассчитать модели нелинейной регрессии, используя statsmodles. В частности, у меня проблемы с изучением синтаксиса patsy.

Есть ли какой-нибудь учебник или пример того, как формулировать нелинейные модели с использованием синтаксиса patsy?

В частности, как будет работать нелинейная модель на этом примере (http://statsmodels.sourceforge.net/devel/examples/generated/example_ols.html) будет указано с помощью patsy?

заранее большое спасибо

Энди


person Andy    schedule 21.05.2013    source источник


Ответы (1)


Пэтси не очень удобна для подгонки общих нелинейных моделей, но модели на странице, на которую вы ссылаетесь, представляют собой особый вид нелинейной модели — они используют линейный метод подгонки модели. (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
comment
Можем ли мы создать манекен или взаимодействия, используя функции идентификации? например, могу ли я построить такой термин, как $I(x1 * (x2=='USA'))$? - person xappppp; 22.12.2016