Как прогнозировать временные ряды, включая фактор сезонности в R

У меня есть следующие образцы данных:

library(data.table)
dt <- data.table('time' = c(1:10),
                    'units'= c(89496264,81820040,80960072,109164545,96226255,96270421,95694992,117509717,105134778,0))

Я хотел бы сделать forecast для units в time = 10.

Я вижу, что в time = 4*k, где k = 1,2,..., наблюдается большой прирост единиц, и я хотел бы включить это как фактор сезонности.

Как я мог сделать это в R ? Я заглянул в auto.arima, но кажется, что это не тот путь.

Спасибо


person quant    schedule 31.07.2018    source источник


Ответы (2)


API Prophet позволяет легко вычислять прогнозы с помощью аддитивной модели, где нет - линейные тренды соответствуют годовой, недельной и ежедневной сезонности.

Цитата из ссылки выше:

Он лучше всего работает с временными рядами, которые имеют сильные сезонные эффекты и несколько сезонов исторических данных. Пророк устойчив к отсутствующим данным и сдвигам в тренде и обычно хорошо справляется с выбросами.

install.packages(‘prophet’)
library(prophet)
model <- prophet(dt) # see ?prophet for details, this builds the model (like auto.arima)
future <- make_future_dataframe(model, periods = 10) # creates the "future" data 
forecast <- predict(model, future) # predictions

tail(forecast)

Вот полный пример в R .

person RLave    schedule 31.07.2018
comment
пророк хорошо выглядит. благодарю вас. Знаете ли вы, можете ли вы выбрать, есть ли у вас аддитивные сезонные эффекты или мультипликативные? - person quant; 31.07.2018
comment
да, с seasonality.mode см. rdocumentation.org/packages/prophet/ версии/0.3.0.1/темы/ - person RLave; 31.07.2018
comment
у меня была установлена ​​версия 0.2, а seasonality.mode не было. в последней версии это - person quant; 31.07.2018
comment
Выбирает ли prophet также «лучшую» модель? И если да, то по каким критериям? А также, как я могу увидеть, какой из них выбран? - person quant; 01.08.2018
comment
Он выбирает лучшую модель с критериями L-BFGS, ts разбивается на 2/3 оцениваемых компонентов. Это будет не лучшая модель в целом, но, вероятно, лучше, чем какая-то более упрощенная. - person RLave; 01.08.2018
comment
Я рекомендую прочитать цитируемый документ peerj.com/preprints/3190.pdf. - person RLave; 01.08.2018
comment
есть ли способ увидеть форму закрытой формы выбранной модели? - person quant; 01.08.2018
comment
Точно не знаю, но сомневаюсь, что есть. - person RLave; 01.08.2018
comment
Давайте продолжим это обсуждение в чате. - person quant; 01.08.2018

Вы правы, вы можете поспорить на 98,4%, что есть сезонность для t = 4 * k, и ее значение равно +2 1108156. Если сезонность предполагается мультипликативной, а не аддитивной, можно получить на 98,5%, что сезонность есть и ее значение равно +18,7%.

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

Сначала введите новую логическую переменную dt$season = (dt$time %% 4)==0, которая истинна (т.е. =1) для t=0,4,8,... и ложна (т.е. =0) в других местах. Тогда функция x~a*season+b равна a+b для t=0,4,8,... и b в другом месте. Другими словами, a — это разница между сезонным эффектом и несезонным эффектом.

Линейная регрессия fit <- lm(units ~ season, data= dt) дает вам a=21108156, а summary(fit) говорит вам, что стандартная ошибка a равна 6697979, так что наблюдаемое значение a=21108156 имеет вероятность менее 0,0161 появиться, если бы оно было равно 0. Таким образом, вы можете разумно поспорить, что существует сезонность из 4 циклов с более чем 1-0,0161 = 98,388% шансов быть правильным.

Если вы предполагаете, что сезонность является мультипликативной, используйте те же рассуждения с переменной dt$mult = dt$units * dt$season. На этот раз a * dt$mult + b равно a * dt$units + b, если действует сезонность, и b, если нет. Таким образом, сезонность дает разницу в a * dt$units, то есть среднее значение умножается на a=.1877=18.77% со значимостью 0.01471=1-98.5%.

Так работают готовые пакеты.

person AlainD    schedule 31.07.2018