Как стать автором
Обновить

Конспект по методам прогнозирования

Время на прочтение4 мин
Количество просмотров4.4K

Данный текст является продолжением серии статей, посвященных краткому описанию основных методов анализа данных. В предыдущий раз мы осветили методы классификации, сейчас рассмотрим способы прогнозирования. Под прогнозированием будем понимать поиск конкретного числа, которое ожидается получить для нового наблюдения или для будущих периодов. В статье указаны названия методов, их краткое описание и скрипт на Python. Конспект может быть полезен перед собеседованием, в соревновании или при запуске нового проекта. Предполагается, что аудитория знает эти методы, но имеет необходимость быстро освежить их в памяти.


Регрессия, оцененная методом наименьших квадратов. Осуществляется попытка представить зависимость одного фактора от другого в виде уравнения. Коэффициенты оцениваются путем минимизации функции потерь (ошибки).

$ \sum_{i=1}^n (y_i-(ax_i+b))^2 → min$


Если решить это уравнение, то можно найти оцениваемые параметры:

$a = \frac{n\sum_{i=0}^n x_i y_i - \sum_{i=0}^n x_i \sum_{i=0}^n y_i}{n\sum_{i=0}^n x_i^2 - (\sum_{i=0}^n x_i)^2}$


$b = \frac{\sum_{i=0}^n y_i - a\sum_{i=0}^n x_i }{n}$


Графическое представление:



Если данные обладают свойствами Гаусса-Маркова:

  • E(ε_i)=0 — математическое ожидание ошибки равно 0
  • σ^2(ε_i)=const — гомоскедастичность
  • cov(ε_i,ε_j)=0,i≠j — отсутствие мультиколлинеарности
  • x_i — детерминированная величина
  • ε ~ N(0,σ^2) — ошибка нормально распределена

То по теореме Гаусса-Маркова оценки будут иметь следующие свойства:

  • Линейность — при линейном преобразовании вектора Y оценки также изменятся линейно.
  • Несмещенность — при увеличении объема выборки математическое ожидание стремится к истинному значению.
  • Состоятельность — при увеличении объема выборки оценки стремятся к их истинному значению.
  • Эффективность — оценки обладают наименьшей дисперсией.
  • Нормальность — оценки нормально распределены.

#imports
import statsmodels.api as sm

#model fit
Y = [1,3,4,5,2,3,4]
X = range(1,8)
X = sm.add_constant(X)
model = sm.OLS(Y,X)
results = model.fit()

#result
print(results.summary())
results.predict(X)


-Обобщенный мнк GLS. Используется, когда не выполняются условия Гаусса-Маркова о гомоскедастичности (постоянстве дисперсии) остатков и некоррелированности остатков между собой. Цель GLS — учесть значения ковариационной матрицы остатков путем корректировки расчета параметров уравнения регрессии. Матрица оцениваемых параметров:

$a^* = (X^TΩ^{-1}X)^{-1}X^TΩ^{-1}Y$

где Ω — ковариационная матрица остатков. Отметим, что при Ω = 1 получим обычный МНК

#imports
import statsmodels.api as sm
from scipy.linalg import toeplitz

#model fit
data = sm.datasets.longley.load(as_pandas=False)
data.exog = sm.add_constant(data.exog)
ols_resid = sm.OLS(data.endog, data.exog).fit().resid
res_fit = sm.OLS(ols_resid[1:], ols_resid[:-1]).fit()
rho = res_fit.params
order = toeplitz(np.arange(16))
sigma = rho**order
gls_model = sm.GLS(data.endog, data.exog, sigma=sigma)
gls_results = gls_model.fit()

#result
print(gls_results.summary())
gls_results.predict

-Взвешенный мнк wls. Используется, когда не выполняется эффективность оценок (есть гетероскедастичность) то есть первым шагом мы, взвешиваем наблюдения на их дисперсию, и далее применяем обычный МНК.


#imports
import statsmodels.api as sm

#model fit
Y = [1,3,4,5,2,3,4]
X = range(1,8)
X = sm.add_constant(X)
wls_model = sm.WLS(Y,X, weights=list(range(1,8)))
results = wls_model.fit()

#result
print(results.summary())
results.predict

-Двухшаговый мнк tsls. Дисперсия для wls, как правило, неизвестна, поэтому на первом шаге мы ее оцениваем, а потом применяем wls. Такой подход также помогает решить проблему эндогенности.


#imports
from linearmodels import IV2SLS, IVLIML, IVGMM, IVGMMCUE
from linearmodels.datasets import meps
from statsmodels.api import OLS, add_constant

#model fit
data = meps.load()
data = data.dropna()
controls = ['totchr', 'female', 'age', 'linc','blhisp']
instruments = ['ssiratio', 'lowincome', 'multlc', 'firmsz']
data['const'] = 1
controls = ['const'] + controls
ivolsmod = IV2SLS(data.ldrugexp, data[['hi_empunion'] + controls], None, None)
res_ols = ivolsmod.fit()

#result
print(res_ols)
print(res_ols.predict)

-ARIMA. Модель временных рядов. Auto-regression (зависит от Y в прошлом периоде) integrated (берутся разности для избавления от нестационарности — когда есть единичные корни, то есть тренд или цикличность) moving average (зависимость от остатка в прошлом периоде).

#imports
from pandas import read_csv
from pandas import datetime
from pandas import DataFrame
from statsmodels.tsa.arima_model import ARIMA
from matplotlib import pyplot

#model fit
def parser(x):
	return datetime.strptime('190'+x, '%Y-%m')

series = read_csv('data.csv', date_parser=parser)
model = ARIMA(series, order=(5,1,0))
model_fit = model.fit(disp=0)

#result
print(model_fit.summary())
model_fit.forecast()

-GARCH . General autoregression conditional heteroscedastic — применяется, когда во временных рядах есть гетероскедастичность.


#imports
import pyflux as pf
import pandas as pd
from pandas_datareader import DataReader
from datetime import datetime

#model fit
jpm = DataReader('JPM',  'yahoo', datetime(2006,1,1), datetime(2016,3,10))
returns = pd.DataFrame(np.diff(np.log(jpm['Adj Close'].values)))
returns.index = jpm.index.values[1:jpm.index.values.shape[0]]
returns.columns = ['JPM Returns']

#result
model = pf.GARCH(returns,p=1,q=1)
x = model.fit()
x.summary()

Если упущен какой-либо важный метод, пожалуйста, напишите об этом в комментариях и статья будет дополнена. Спасибо за внимание.

Теги:
Хабы:
+6
Комментарии1

Публикации

Истории

Работа

Data Scientist
63 вакансии

Ближайшие события