Skip to content

Compare ts model libraries regarding stats outputs

Alexey Romanenko edited this page Oct 5, 2021 · 1 revision

Density forecasting algorithms

Как получить плотность распределения в качестве прогноза:

В случае one-step-ahead на каждом шаге рассчитывать остатки. На основе распределения остатков и прогноза построить плотность распределения прогноза (распределение остатков + прогноз) Достать дисперсию прогнозов + сам прогноз. Тут надо выдвигать предположение о распределении прогноза и на основе прогноза (мат ожидание) и дисперсии строить распределение прогноза.

Statsmodels

AutoReg (AR), ARIMA

  • можно достать остатки res.resid
  • sigma2 - дисперсия ошибок (у AutoReg есть, у ARIMA нет) Я проверил, что sigma2 равняется дисперсии по res.resid
  • есть встроенный тест на нормальность остатков res.test_normality() “Test for normality of standardized residuals” (std_resid = resid / np.sqrt(self.sigma2)) Выдаёт только jarque_bera, Skewness, Kurtosis
  • можно строить прогнозы с доверительными интервалами res.get_prediction(...)
  • есть крутой метод plot_diagnostics() со всей диагностикой, в том числе Kernel density estimation для распределения остатков (gaussian_kde(std_resid): scipy.stats.gaussian_kde)
  • .simulate() распределение ошибки задаётся как-то странно measurement_shocks: "If specified, these are the shocks to the measurement equation. If unspecified, these are automatically generated using a pseudo-random number generator. If specified, must be shaped nsimulations x k_endog, where k_endog is the same as in the state space model." ES models: ExponentialSmoothing, SimpleExpSmoothing, Holt .simulate() - указываешь сколько значений и сколько повторений. Я взял распределение ошибок + прогноз. Сделал simulate(nsimulations=1, repetitions=100000, random_errors='bootstrap'), и распределения сошлись. То есть для простоты мы можем брать simulate с большим количеством repetitions, строить по ним гистограмму, что и будет плотностью распределения случайной величины. В качестве random_errors можно брать абсолютно любое распределение. По умолчанию берётся нормальное распределения с диспресией, рассчитанной по ошибкам на выборке. При 'bootstrap': samples the random errors from the fit errors. ThetaModel (SES/IMA model) The Theta model is a simple forecasting method that combines a linear time trend with a Simple Exponential Smoother (Assimakopoulos & Nikolopoulos)
  • one_step: The one-step forecast from the SES.
  • sigma2: The estimated residual variance from the SES/IMA model.
  • вывод интервала прогнозов prediction_intervals(...), plot_predict(...)

Есть отдельный блок ​​statsmodels.tsa.statespace. Не совсем понял, что это такое, но кажется, что может быть для нас полезным.

Sktime

ES models Нет ничего для нас интересного. Даже остатки не выдают ARIMA Может выдавать доверительные интервалы прогноза forecaster.predict(fh=[1,2,3], return_pred_int=True, alpha=0.05) ThetaModel Тоже может выдавать доверительные интервалы. Либо внутри predict, либо отдельно через forecaster.compute_pred_int(y_pred) Дополнительно есть небольшой блок по Online Forecasting (например, OnlineEnsembleForecaster). Возможно это может быть полезно для нас.

В целом, у всех алгоритмов одинаковый набор методов. Кажется, достаточно простой и неглубокой библиотекой.

Pyflux

ARIMA Через model.plot_predict(h=20,past_values=20,figsize=(15,5)) можно построить интервалы (не совсем понял, что именно тут строится) “Plots in-sample rolling predictions for the model. This means that the user pretends a last subsection of data is out-of-sample, and forecasts after each period and assesses how well they did. The user can choose whether to fit parameters once at the beginning or every time step.” Внутри этого метода есть параметр fit_once: whether to fit once, or every timestep (это и есть возможность построение one-step-ahead прогноза). Проблема в том, что выдаётся только график. Чтобы достать оттуда сами значения, надо будет лезть в реализацию.

Для всех алгоритмов одинаковый набор методов. Документация кажется скудной (ссылок на реализации методов внутри документации нет) Prophet Кажется, что это инструмент для прогнозирования для тех, кто не особо хочет углубляться в суть дела. Всего несколько методов, по типу fit, predict, plot и всё. Есть информация по интервалам в самом предсказании m.predict(future)

Clone this wiki locally