Добавление сезонности и нестационарности к конечному результату после прогнозирования ARIMA или ETS - PullRequest
0 голосов
/ 29 октября 2018
TS<-ts(Product_Dist_Training_Trans[,17], frequency = 7)

plot(TS)
library(tseries)
library(forecast)

TSETS<- TS

adf<- adf.test(TS)

Order<- ndiffs(TS)

if (adf$p.value>.05)
{
for(i in  1:Order){
TSDiff<- diff(TS)  
TS<- TSDiff}} else
{
TS
}

decomp<- decompose(TS)

TSadj<- TS-decomp$seasonal

Arima<- auto.arima(TSadj)
AM<- forecast(Arima, h = 29)
AM$mean
plot(AM)

ETS<- ets(TSETS)
fc <- forecast(ETS, h = 29)
fc$mean
plot(fc)

Я пытаюсь прогнозировать объем ежедневных продаж в течение 29 дней с данными обучения 118 дней, я использую прогнозирование ARIMA и ETS. Я получаю отрицательные значения в конечном результате для ARIMA (так как я делаю серию стационарными и несезонными для ARIMA), а также ETS. Как получить правильные прогнозные значения в конечном результате? Кроме того, как мне сделать сравнение двух методов, чтобы получить более точные результаты?

1 Ответ

0 голосов
/ 29 октября 2018

Прежде всего, вы определили объект временного ряда с частотой = 7, что означает, что вы определяете еженедельную сезонность данных

Для прогнозирования временных рядов с аримой используйте следующий код:

TS<-ts(Product_Dist_Training_Trans[,17], frequency = 7)
plot(TS)
library(tseries)
library(forecast)

decomp<-stl(TS , s.window = "periodic") 
plot(decomp)
decomp_components<-as.data.frame(decomp$time.series)

seasonal_component<-ts(decomp_components$seasonal, frequency = 7)

relation1<-auto.arima(seasonal_component,seasonal = T ,max.p = 10, max.q = 10, max.d = 5, max.P = 5, max.Q = 5, max.D = 2, max.order = 30, start.p = 1, start.q = 1)
result1<-forecast(relation1, model = "Arima", h = 29)

plot(result1)
deseasonal_cnt<-seasadj(decomp)
relation2 <- auto.arima(deseasonal_cnt,seasonal = F ,max.p = 10, max.q = 10, max.d = 5,max.P = 5, max.Q = 5, max.D = 2, max.order = 30, start.p = 1, start.q = 1)

result2<-forecast(relation2, model = "Arima",h=29)
plot(result2)
result<-result1$mean+result2$mean

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

result[result<0]<- 0

Проблема с вашим кодом состоит в том, что вы прогнозировали только для сезонной части, вам также нужно сделать прогноз для несезонной части, а затем объединить результат

...