Разница в значениях с использованием метода вне выборки между прогнозом и прогнозом в R - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь выяснить разницу между forecast и predict методом.

У меня есть следующее. Данные можно найти на веб-сайте DataMarket .

Обе функции дают одно и то же значение для прогноза с полными данными, но не с использованием метода вне выборки. Разве это не должно быть так же, поскольку Arima является оберткой вокруг arima?

> library(forecast)
> library(tidyverse)
> 
> data = read.csv("Data/monthly-lake-erie-levels-1921-19.csv", sep = ",", header = TRUE)
> data = data[-dim(data)[1],]
> 
> y = ts(data$Monthly.Lake.Erie.Levels.1921...1970.,
+                 frequency = 12,
+                 start = c(1921,1))
> 
> model.arima = arima(y, order = c(0, 1, 1), seasonal = c(0, 1, 0))
> model.Arima = Arima(y, order = c(0, 1, 1), seasonal = c(0, 1, 0))
> 
> preds.arima = predict(model.arima, n.ahead=1)$pred[1]
> preds.Arima = forecast(model.Arima, h=1)$mean[1]
> 
> preds.Arima
[1] 15.51397
> preds.arima
[1] 15.51397
> 
> S = round(0.75 * length(y))
> h = 1
> errors.a = c()
> errors.A = c()
> preds.a = c()
> preds.A = c()
> 
> for (i in S:(length(y) - h)) 
+ {
+   model.sub.a = arima(y[1:i], order = c(0, 1, 1), seasonal = c(0, 1, 0))
+   pred.a = predict(model.sub.a, n.ahead = h)$pred[h]
+   preds.a = c(preds.a, pred.a)
+   errors.a = c(errors.a, y[i + h] - pred.a)
+   
+   model.sub.A = Arima(y[1:i], order = c(0, 1, 1), seasonal = c(0, 1, 0))
+   pred.A = forecast(model.sub.A, h = h)$mean[h]
+   preds.A = c(preds.A, pred.A)
+   errors.A = c(errors.A, y[i + h] - pred.A)
+ }
> 
> all = cbind(errors.A, errors.a, preds.A, preds.a)
> 
> head(all)
       errors.A    errors.a  preds.A  preds.a
[1,]  0.4352598  0.27795891 14.53674 14.69404
[2,] -0.1875257 -0.42878261 15.15953 15.40078
[3,] -0.3183146 -0.49988640 14.89131 15.07289
[4,] -0.6598827 -0.51497911 14.43588 14.29098
[5,] -0.4743845 -0.08133969 13.49138 13.09834
[6,] -0.2121536  0.32318767 12.81215 12.27681

EDIT

Источник различий найден. Объект y[1:i] больше не является объектом временного ряда, в то время как для моделей SARIMA требуется указание частоты. И arima, и Arima что-то делают, но, очевидно, это не одно и то же. Изменение этих двух строк

# ...
model.sub.a = arima(y[1:i], order = c(0, 1, 1), seasonal = c(0, 1, 0))
# ...
model.sub.a = Arima(y[1:i], order = c(0, 1, 1), seasonal = c(0, 1, 0))
# ...

Этим двумя исправляет проблему.

# ...
model.sub.a = arima(ts(y[1:i], frequency=12), order = c(0, 1, 1), seasonal = c(0, 1, 0))
# ...
model.sub.a = Arima(ts(y[1:i], frequency=12), order = c(0, 1, 1), seasonal = c(0, 1, 0))
# ...
...