У меня есть месячный временной ряд (yt) с 108 наблюдениями (с 1/2010 по 12/2018), которые я разделил на тренировочные [1:84] и тестовые наборы [85: 108]. Моя идея состоит в том, чтобы обучить мою модель в тренировочном наборе и применить ее к тестовому набору, чтобы я мог сравнить полученные прогнозы с реальными наблюдениями из тестового набора (и сделать это для h = 1, 3, 6 и 12). Итак, я хочу получить прогнозы и их ошибки, и использовать его для расчета MAE, MSE и RMSE.
Чтобы получить прогнозы
Я реализую код для нескольких Прогнозы с переоценкой, предоставленные доктором Робом Хиндманом в https://robjhyndman.com/hyndsight/rolling-forecasts/:
h<-1 # repeat to h=3,6 and 12
train<-window(yt, end=c(2016,12))
test<-window(yt, start=2017)
n<-length(test)-h+1
fit<-Arima(train, order=c(0,1,1), seasonal=list(order=c(0,1,1), period=12), method="ML") # model identified by analysing ACF and PACF of yt
order<-arimaorder(fit)
fcmat1<-matrix(0, nrow=n, ncol=h)
for(i in 1:n) {
x<-window(yt, end=c(2016,12)+(i-1)/12)
refit<-Arima(x, order=order[1:3], seasonal=order[4:6])
fcmat1[i,]<-forecast(refit, h=h)$mean
}
Затем я могу построить значения в fcmat1 в течение yt и визуально получить доступ к разнице между полученные прогнозы и реальные значения yt [85: 108].
Для получения ошибок
В ссылке выше, доктор Роб ссылается на другую страницу, связанную с перекрестная проверка временных рядов (в https://robjhyndman.com/hyndsight/tscv/), и поэтому я подумал о том, чтобы просто выполнить
for_func<-function(x, h){forecast(fit, h=h)}
e<-tsCV(yt, for_func, h=1)
и использовать «e» для получения мер точности, но затем я запутайтесь, потому что мне кажется, что прогнозы, рассчитанные в for_fun c tsCV, отличаются от прогнозов, полученных ранее (fcmat1), и поэтому будут ошибки. В многоэтапных прогнозах с подходом переоценки я подгоняю модель к обучающему набору и затем «расширяю» ее до оставшихся данных. В подходе tsCV модель Arima применяется ко всем данным (yt), а не только к набору данных поезда.
Если бы я не хотел строить прогнозы, я бы никогда не столкнулся с этой проблемой и Я бы использовал tsCV без сомнений. То же самое, если я просто хочу составить прогноз без оценки его точности (я бы просто использовал многоэтапную переоценку)
Итак, мои вопросы:
- Многошаговое прогнозирование с переоценкой и tsCV как-то связаны? Если да, то как?
На практике, какую из следующих функций мне следует использовать для получения ошибок?
e1<-tsCV(yt, for_func, h=1)
mae1<-mean(abs(e1), na.rm=TRUE)
mse1<-mean(e1^2, na.rm=TRUE)
rmse1<-sqrt(mse1)
# MAE MSE RMSE
# h=1 40.80492 2459.470 49.59305
# h=3 43.23866 2846.406 53.35172
# h=6 46.54597 3321.426 57.63181
# h=12 51.19123 3969.944 63.00749
- Точность () применяется к fcmat
e1<-fcmat1[,1]-test
mae1ad<-mean(abs(e1), na.rm=TRUE)
mse1ad<-mean(e1^2, na.rm=TRUE)
rmse1ad<-sqrt(mse1ad)
# MAE MSE RMSE
# h=1 39.05335 2314.315 48.10733
# h=3 35.95370 2045.558 45.22784
# h=6 45.00950 3301.727 57.46066
# h=12 72.05596 7821.347 88.43838
- Точность (), как обычно применяется
for1<-forecast(Arima(train, order=c(0,1,1), seasonal=list(order=c(0,1,1), period=12), method="ML"),h=1)
e1ac<-accuracy(for1,test)
mae1ac<-e1ac[6]
mse1ac<-e1ac[4]^2
rmse1ac<-e1ac[4]
# MAE MSE RMSE
# h=1 31.93750 1020.004 31.93750
# h=3 55.97562 5097.511 71.39685
# h=6 42.35456 3628.103 60.23374
# h=12 30.84436 2201.275 46.91774
Может кто-нибудь просветить меня об этом? (и в конечном итоге предупредить меня, если я делаю что-то не так) Спасибо