1. BoxCox

В пакете forecast Hyndman сделал 3 функции, относящиеcя к Box-cox преобразованю:
  • BoxCox(): возвращает результат BoxCox преобразования из входной переменой.

Code:

BoxCox <- function(x,lambda)
{
  if(lambda < 0)
   x[x < 0] <- NA
  if(lambda==0)
    out <- log(x)
  else
    out <- (sign(x)*abs(x)^lambda - 1)/lambda
  if(!is.null(colnames(x)))
    colnames(out) <- colnames(x)
  return(out)
}
  • InvBoxCox():обратный ход BoxCox преобразования

  • BoxCox.lamda(): автаматически выбирает параметр lambda для BoxCox преобзования.

Например:

# функция BoxCox.lambda() будет автоматически выбирает значение lambda:
# lambda <- BoxCox.lambda(x) 
# plot(BoxCox(x,lambda))

2. Пакет prophet от фейсбука

Prophet - инструмент для анализа и прогнозирования временных рядов. Он лучше всешо работает с дневными данными по крайней мере с историчесими данными одного года. Библиотека автоматически обработает пропущенные значения.

Праздники:

Prophet позволяет указать отдельно даты, на которые выпадают праздники. Модель учтет это в предсказании. Также можно регулировать степень влияния праздников — holidays_prior_scale, что очень удобно, если модель переобучилась.

Построение прогноза:

создаем модель -> обучаем ее с помощью метода .fit() -> строим предсказание .predict() -> Для обучения нужно передать DataFrame с колонками:

  • ds: время, формат поля должен быть datetime;

  • y: целевая переменная в числовом формате.

Для получения прогноза нужно передать новый DataFrame, содержащий столбец ds. Для этого в библиотеке есть функция make_future_dataframe, которая принимает параметр periods — период, для которого мы хотим получить прогноз и freq — частота временного ряда (значение по умолчанию — день).

создание входного DataFrame с колонками ds, y:

history <- data.frame(ds = seq(as.Date('2015-01-01'), as.Date('2016-01-01'), by = 'd'), y = sin(1:366/200) + rnorm(366)/10)
head(history)
plot(history)

Прогноз:

В виде прогноза Prophet вернет DataFrame с большим количеством столбцов. Наиболее интересные:

  • ds — временная метка для прогнозируемого значения;
  • yhat— прогнозируемое значение;
  • yhat_lower — нижняя граница прогноза;
  • yhat_upper — высшая граница прогноза.
library(prophet)
m <- prophet(history)
Disabling yearly seasonality. Run prophet with yearly.seasonality=TRUE to override this.
Disabling daily seasonality. Run prophet with daily.seasonality=TRUE to override this.
Initial log joint probability = -14.2728
Optimization terminated normally: 
  Convergence detected: relative gradient magnitude is below tolerance
future <- make_future_dataframe(m, periods = 365)
forecast <- predict(m, future)

|==============================================================================================|100% ~0 s remaining     
head(forecast)
Визуализация для forecast
plot(m, forecast)

LS0tDQp0aXRsZTogItCe0LHQt9C+0YAgQm94Q294INC/0YDQtdC+0LHRgNCw0LfQvtCy0LDQvdC40Y8g0LIg0L/QsNC60LXRgtC1IGZvcmVjYXN0KEh5bmRtYW4pINC4INC/0LDQutC10YLQsCBwcm9waGV0INC+0YIg0YTQtdC50YHQsdGD0LrQsCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIyAxLiBCb3hDb3ggDQoNCiMjIyMjINCSINC/0LDQutC10YLQtSBmb3JlY2FzdCBIeW5kbWFuINGB0LTQtdC70LDQuyAzINGE0YPQvdC60YbQuNC4LCDQvtGC0L3QvtGB0Y/RidC40LVj0Y8g0LogQm94LWNveCDQv9GA0LXQvtCx0YDQsNC30L7QstCw0L3RjjoNCg0KLSAqKkJveENveCgpKio6INCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINGA0LXQt9GD0LvRjNGC0LDRgiBCb3hDb3gg0L/RgNC10L7QsdGA0LDQt9C+0LLQsNC90LjRjyDQuNC3INCy0YXQvtC00L3QvtC5INC/0LXRgNC10LzQtdC90L7QuS4NCg0KIVtdKDIucG5nKQ0KDQojIyMjIENvZGU6DQoNCmBgYHtyIGVjaG89VFJVRX0NCkJveENveCA8LSBmdW5jdGlvbih4LGxhbWJkYSkNCnsNCiAgaWYobGFtYmRhIDwgMCkNCiAgIHhbeCA8IDBdIDwtIE5BDQogIGlmKGxhbWJkYT09MCkNCiAgICBvdXQgPC0gbG9nKHgpDQogIGVsc2UNCiAgICBvdXQgPC0gKHNpZ24oeCkqYWJzKHgpXmxhbWJkYSAtIDEpL2xhbWJkYQ0KICBpZighaXMubnVsbChjb2xuYW1lcyh4KSkpDQogICAgY29sbmFtZXMob3V0KSA8LSBjb2xuYW1lcyh4KQ0KICByZXR1cm4ob3V0KQ0KfQ0KDQpgYGANCg0KLSAqKkludkJveENveCgpKio60L7QsdGA0LDRgtC90YvQuSDRhdC+0LQgQm94Q294INC/0YDQtdC+0LHRgNCw0LfQvtCy0LDQvdC40Y8NCg0KLSAqKkJveENveC5sYW1kYSgpKio6INCw0LLRgtCw0LzQsNGC0LjRh9C10YHQutC4INCy0YvQsdC40YDQsNC10YIg0L/QsNGA0LDQvNC10YLRgCBsYW1iZGEg0LTQu9GPIEJveENveCDQv9GA0LXQvtCx0LfQvtCy0LDQvdC40Y8uDQoNCtCd0LDQv9GA0LjQvNC10YA6DQoNCmBgYHtyfQ0KIyDRhNGD0L3QutGG0LjRjyBCb3hDb3gubGFtYmRhKCkg0LHRg9C00LXRgiDQsNCy0YLQvtC80LDRgtC40YfQtdGB0LrQuCDQstGL0LHQuNGA0LDQtdGCINC30L3QsNGH0LXQvdC40LUgbGFtYmRhOg0KIyBsYW1iZGEgPC0gQm94Q294LmxhbWJkYSh4KSANCiMgcGxvdChCb3hDb3goeCxsYW1iZGEpKQ0KYGBgDQoNCiMjIyAyLiDQn9Cw0LrQtdGCIHByb3BoZXQg0L7RgiDRhNC10LnRgdCx0YPQutCwDQoNCioqUHJvcGhldCoqIC0gINC40L3RgdGC0YDRg9C80LXQvdGCINC00LvRjyDQsNC90LDQu9C40LfQsCDQuCDQv9GA0L7Qs9C90L7Qt9C40YDQvtCy0LDQvdC40Y8g0LLRgNC10LzQtdC90L3Ri9GFINGA0Y/QtNC+0LIuINCe0L0g0LvRg9GH0YjQtSDQstGB0LXRiNC+INGA0LDQsdC+0YLQsNC10YIg0YEg0LTQvdC10LLQvdGL0LzQuCDQtNCw0L3QvdGL0LzQuCDQv9C+INC60YDQsNC50L3QtdC5INC80LXRgNC1INGBINC40YHRgtC+0YDQuNGH0LXRgdC40LzQuCDQtNCw0L3QvdGL0LzQuCDQvtC00L3QvtCz0L4g0LPQvtC00LAuINCR0LjQsdC70LjQvtGC0LXQutCwINCw0LLRgtC+0LzQsNGC0LjRh9C10YHQutC4INC+0LHRgNCw0LHQvtGC0LDQtdGCINC/0YDQvtC/0YPRidC10L3QvdGL0LUg0LfQvdCw0YfQtdC90LjRjy4NCg0KIyMjI9Cf0YDQsNC30LTQvdC40LrQuDoNCg0KUHJvcGhldCDQv9C+0LfQstC+0LvRj9C10YIg0YPQutCw0LfQsNGC0Ywg0L7RgtC00LXQu9GM0L3QviDQtNCw0YLRiywg0L3QsCDQutC+0YLQvtGA0YvQtSDQstGL0L/QsNC00LDRjtGCINC/0YDQsNC30LTQvdC40LrQuC4g0JzQvtC00LXQu9GMINGD0YfRgtC10YIg0Y3RgtC+INCyINC/0YDQtdC00YHQutCw0LfQsNC90LjQuC4g0KLQsNC60LbQtSDQvNC+0LbQvdC+INGA0LXQs9GD0LvQuNGA0L7QstCw0YLRjCDRgdGC0LXQv9C10L3RjCDQstC70LjRj9C90LjRjyDQv9GA0LDQt9C00L3QuNC60L7QsiDigJQgaG9saWRheXNfcHJpb3Jfc2NhbGUsINGH0YLQviDQvtGH0LXQvdGMINGD0LTQvtCx0L3Qviwg0LXRgdC70Lgg0LzQvtC00LXQu9GMINC/0LXRgNC10L7QsdGD0YfQuNC70LDRgdGMLg0KDQojIyMj0J/QvtGB0YLRgNC+0LXQvdC40LUg0L/RgNC+0LPQvdC+0LfQsDoNCg0K0YHQvtC30LTQsNC10Lwg0LzQvtC00LXQu9GMIC0+INC+0LHRg9GH0LDQtdC8INC10LUg0YEg0L/QvtC80L7RidGM0Y4g0LzQtdGC0L7QtNCwIC5maXQoKSAtPiDRgdGC0YDQvtC40Lwg0L/RgNC10LTRgdC60LDQt9Cw0L3QuNC1IC5wcmVkaWN0KCkgLT4g0JTQu9GPINC+0LHRg9GH0LXQvdC40Y8g0L3Rg9C20L3QviDQv9C10YDQtdC00LDRgtGMIERhdGFGcmFtZSDRgSDQutC+0LvQvtC90LrQsNC80Lg6DQoNCi0gZHM6INCy0YDQtdC80Y8sINGE0L7RgNC80LDRgiDQv9C+0LvRjyDQtNC+0LvQttC10L0g0LHRi9GC0YwgZGF0ZXRpbWU7DQoNCi0geTog0YbQtdC70LXQstCw0Y8g0L/QtdGA0LXQvNC10L3QvdCw0Y8g0LIg0YfQuNGB0LvQvtCy0L7QvCDRhNC+0YDQvNCw0YLQtS4NCg0K0JTQu9GPINC/0L7Qu9GD0YfQtdC90LjRjyDQv9GA0L7Qs9C90L7Qt9CwINC90YPQttC90L4g0L/QtdGA0LXQtNCw0YLRjCDQvdC+0LLRi9C5IERhdGFGcmFtZSwg0YHQvtC00LXRgNC20LDRidC40Lkg0YHRgtC+0LvQsdC10YYgZHMuINCU0LvRjyDRjdGC0L7Qs9C+INCyINCx0LjQsdC70LjQvtGC0LXQutC1INC10YHRgtGMINGE0YPQvdC60YbQuNGPIG1ha2VfZnV0dXJlX2RhdGFmcmFtZSwg0LrQvtGC0L7RgNCw0Y8g0L/RgNC40L3QuNC80LDQtdGCINC/0LDRgNCw0LzQtdGC0YAgcGVyaW9kcyDigJQg0L/QtdGA0LjQvtC0LCDQtNC70Y8g0LrQvtGC0L7RgNC+0LPQviDQvNGLINGF0L7RgtC40Lwg0L/QvtC70YPRh9C40YLRjCDQv9GA0L7Qs9C90L7QtyDQuCBmcmVxIOKAlCDRh9Cw0YHRgtC+0YLQsCDQstGA0LXQvNC10L3QvdC+0LPQviDRgNGP0LTQsCAo0LfQvdCw0YfQtdC90LjQtSDQv9C+INGD0LzQvtC70YfQsNC90LjRjiDigJQg0LTQtdC90YwpLg0KDQoqKtGB0L7Qt9C00LDQvdC40LUg0LLRhdC+0LTQvdC+0LPQviBEYXRhRnJhbWUg0YEg0LrQvtC70L7QvdC60LDQvNC4IGRzLCB5OioqDQoNCmBgYHtyfQ0KaGlzdG9yeSA8LSBkYXRhLmZyYW1lKGRzID0gc2VxKGFzLkRhdGUoJzIwMTUtMDEtMDEnKSwgYXMuRGF0ZSgnMjAxNi0wMS0wMScpLCBieSA9ICdkJyksIHkgPSBzaW4oMTozNjYvMjAwKSArIHJub3JtKDM2NikvMTApDQpoZWFkKGhpc3RvcnkpDQpgYGANCg0KYGBge3IsIGZpZy5oZWlnaHQ9IDgsIGZpZy53aWR0aD0xMn0NCnBsb3QoaGlzdG9yeSkNCmBgYA0KDQojIyMjIyDQn9GA0L7Qs9C90L7QtzoNCg0K0JIg0LLQuNC00LUg0L/RgNC+0LPQvdC+0LfQsCBQcm9waGV0INCy0LXRgNC90LXRgiBEYXRhRnJhbWUg0YEg0LHQvtC70YzRiNC40Lwg0LrQvtC70LjRh9C10YHRgtCy0L7QvCDRgdGC0L7Qu9Cx0YbQvtCyLiDQndCw0LjQsdC+0LvQtdC1INC40L3RgtC10YDQtdGB0L3Ri9C1Og0KDQotIGRzIOKAlCDQstGA0LXQvNC10L3QvdCw0Y8g0LzQtdGC0LrQsCDQtNC70Y8g0L/RgNC+0LPQvdC+0LfQuNGA0YPQtdC80L7Qs9C+INC30L3QsNGH0LXQvdC40Y87DQotIHloYXTigJQg0L/RgNC+0LPQvdC+0LfQuNGA0YPQtdC80L7QtSDQt9C90LDRh9C10L3QuNC1Ow0KLSB5aGF0X2xvd2VyIOKAlCDQvdC40LbQvdGP0Y8g0LPRgNCw0L3QuNGG0LAg0L/RgNC+0LPQvdC+0LfQsDsNCi0geWhhdF91cHBlciDigJQg0LLRi9GB0YjQsNGPINCz0YDQsNC90LjRhtCwINC/0YDQvtCz0L3QvtC30LAuDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PSA4LCBmaWcud2lkdGg9MTJ9DQpsaWJyYXJ5KHByb3BoZXQpDQptIDwtIHByb3BoZXQoaGlzdG9yeSkNCmZ1dHVyZSA8LSBtYWtlX2Z1dHVyZV9kYXRhZnJhbWUobSwgcGVyaW9kcyA9IDM2NSkNCmZvcmVjYXN0IDwtIHByZWRpY3QobSwgZnV0dXJlKQ0KaGVhZChmb3JlY2FzdCkNCmBgYA0KDQojIyMjIyDQktC40LfRg9Cw0LvQuNC30LDRhtC40Y8g0LTQu9GPIGZvcmVjYXN0DQoNCmBgYHtyLCBmaWcuaGVpZ2h0PSA4LCBmaWcud2lkdGg9MTJ9DQpwbG90KG0sIGZvcmVjYXN0KQ0KYGBgDQoNCg==