Как указать модель нелинейной регрессии в python - PullRequest
0 голосов
/ 19 февраля 2020

Я прохожу курс эконометрики и пытаюсь использовать Python, а не предварительные данные STATA и EVIEWS, в которые они устанавливают задания.

В одном из вопросов у меня есть данные о потреблении с течением времени , Меня просят вычислить это двумя способами.

Первый способ - это расчет модели вида потребления = Aexp (Bt), а второй способ состоит в том, чтобы регистрировать обе стороны и делать обычные OLS в журнале (потребление) = альфа + Bt

* 1006. * Я знаю, как сделать второй путь. Однако, когда я пытаюсь сделать первый путь, это идет не так. Используя statsmodels, я могу экспонировать данные времени (после нормализации), но это вычисляет регрессию в виде потребления = Aexp (t) + B, что не то, что я хочу. (Хочу указать где параметры go). В sklearn я мог найти полиномиальную регрессию, но не экспоненциальную.

Затем я обнаружил scipy.curve_fit. Однако здесь, похоже, есть две проблемы: (1) Кажется, что он полагается на исходные предположения для параметров, что означает мой вывод в конечном итоге будет отличаться от проприетарного программного обеспечения (тогда как выходные данные для таких вещей, как OLS одинаковы) [поскольку я предполагаю, что первоначальные догадки означают, что сделано некоторое итеративное решение, которое полезно для очень странных и замечательных функций, но я предполагаю, что довольно стандартные результаты справедливы для экспоненциальных регрессия] (2) каждый раз, когда я пытаюсь реализовать его, он просто возвращает параметры догадки.

Вот мой код

`consumption_data = pd.read_csv(......\consumption.csv")
def func(x,a,b):
    return a * np.exp(b*x)

xdata = consumption_data.YEAR
ydata = consumption_data.CONSUMPTION
ydata = (ydata - 1948)/100

popt, pcov = curve_fit(func, xdata, ydata, (1,1))
print(popt)

plt.plot(xdata, func(xdata, *popt), 'g--',)
`

Код scipy.optimize в основном просто вставляется в копию из их учебника https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html

1 Ответ

0 голосов
/ 19 февраля 2020

короткий ответ: использовать statsmodels GLM

statsmodels не имеет нелинейных наименьших квадратов. Лучшей библиотекой python для этого является lmfit https://pypi.org/project/lmfit/

curve_fit, lmfit и алгоритм нелинейных наименьших квадратов в целом находят итеративное решение задачи оптимизации. Даже когда нам нужно предоставить начальные значения, решение во многих случаях одинаково для всех пакетов вплоть до допуска конвергенции, например, 1e-5 или 1e-6. Многие стандартные модели в статистике и эконометрике имеют единый глобальный максимум с хорошими данными. Однако в других случаях, таких как смешанные модели, может быть много локальных оптимумов, и оценка может сходиться к одному из них.

К конкретному c случаю:

consumption = A exp(B t)
можно переписать как
consumption = exp(a + B t)

Так что это всего лишь модель с одним индексом или обобщенная линейная модель с экспоненциальной средней функцией.

Общая версия рассчитана на Зависимая переменная как нелинейная функция линейной комбинации объясняющих переменных:

E (y | x) = g (xb)

Это можно оценить с помощью statsmodels с GLM с семейством Gaussian и log-link.

В сторону: В эконометрике есть литература, в которой в качестве оценки для моделей exp используется квази-правдоподобие Пуассона вместо взятия логарифма зависимой переменной. Пуассон обычно использует функцию log-link, как описано выше.

Однако использование GLM позволяет нам использовать log-link, то есть функцию экспоненциального среднего, с любым из поддерживаемых семейств распределения. Основное различие заключается в исходном допущении дисперсии. Гауссиан предполагает постоянную дисперсию, Пуассон предполагает, что дисперсия пропорциональна среднему, а Гамма предполагает, что дисперсия имеет квадратичное значение c в среднем.

Если мы используем надежную оценку сэндвич-ковариации для вывода параметров, то стандарт ошибки и логические выводы верны, даже если функция отклонения не указана.

...