2016-03-02 4 views
1

В некоторых случаях мне приходится делать прогнозы вручную, что означает использование формулы модели. Для модели AR (p) это легко. Но для модели ARIMA (p, d, q), d> = 1, я немного сложнее. Следующий пример, я рассчитан с помощью моделей AR (2). У меня есть ряд с 1990 по 2010 год, мне нужно прогноз на 2011 год:Формула расчета модели ARIMA?

> a<-c(198,150,120,84,150,136,80,128,160,132,144,234,300,312,400,468,420,500,650,612,516) 
> series<-ts(a,frequency=1,start=c(1990)) 
> fit<-Arima(series,c(2,0,0),method="ML") 
> fit 
Series: series 
ARIMA(2,0,0) with non-zero mean 

Coefficients: 
     ar1  ar2 intercept 
     1.1923 -0.2881 305.3748 
s.e. 0.2174 0.2346 111.5251 

sigma^2 estimated as 3727: log likelihood=-117.2 
AIC=242.4 AICc=244.9 BIC=246.58 

Я получил формулу расчета модели AR (2):

y[t]=305.3748+1.1923*y[t-1]-0.2881*y[t-2] 

и я беру прогноз на 2011 год:

y[2011] = 305.3748+1.1923*y[2010]-0.2881*y[2009] 
     = 305.3748+1.1923*516-0.2881*612 
     = 744 

Однако, когда я подхожу ARIMA модель (2,1,0):

> fit2<-Arima(series,c(2,1,0),method="ML") 
> fit2 
Series: series 
ARIMA(2,1,0)      

Coefficients: 
     ar1  ar2 
     0.2561 -0.3494 
s.e. 0.2196 0.2117 

sigma^2 estimated as 3489: log likelihood=-110.1 
AIC=226.2 AICc=227.7 BIC=229.19 

Я не знаю, как написать формулу, когда d = 1? И еще одна проблема, поэтому, когда я сделал прогноз с функцией forecast(), результат отличается от - когда я вычислил по формуле?

> forecast(fit,h=1) 
    Point Forecast Lo 80 Hi 80 Lo 95 Hi 95 
2011  468.1754 389.9369 546.4138 348.52 587.8308 

ответ

1

ARIMA (2,1,0) просто означает, что вы

  1. дифференцировать ряд, т.е. заменить series на diff(series),
  2. затем применить формулу для ARIMA (2,0,0), но до diff(series),
  3. окончательно «повторно интегрировать» результат на cumsum.

Функция fcst_ar2 содержит формулу для ARIMA (2,0,0), fcst_diff_ar2 что для ARIMA (2,1,0):

library(forecast) 

#-------------------------------------------------------- 

fcst_ar2 <- function(coef, series, horizon) 
{ 
    y <- as.vector(series) - coef[3] 

    for (i in 1:horizon) { 
    y <- c(y, coef[2:1] %*% tail(y,2)) 
    } 

    return(y + coef[3]) 
} 

#-------------------------------------------------------- 

fcst_diff_ar2 <- function(coef, series, horizon) 
{ 
    y <- as.vector(series) 

    return(cumsum(c(y[1], fcst_ar2(c(coef,0), diff(y), horizon)))) 
} 

#======================================================== 
# Example: 

a<-c(198,150,120,84,150,136,80,128,160,132,144,234,300,312,400,468,420,500,650,612,516) 
series<-ts(a,frequency=1,start=c(1990)) 
fit<-Arima(series,c(2,0,0),method="ML") 
fit2<-Arima(series,c(2,1,0),method="ML") 

#-------------------------------------------------------- 
fcst_ar2(coef(fit), series, 3) 
# [1] 198.0000 150.0000 120.0000 84.0000 150.0000 136.0000 80.0000 128.0000 
# [9] 160.0000 132.0000 144.0000 234.0000 300.0000 312.0000 400.0000 468.0000 
# [17] 420.0000 500.0000 650.0000 612.0000 516.0000 468.1754 438.8091 417.5725 

forecast(fit, 3) 
#  Point Forecast Lo 80 Hi 80 Lo 95 Hi 95 
# 2011  468.1754 389.9369 546.4138 348.5200 587.8308 
# 2012  438.8091 317.0562 560.5621 252.6041 625.0142 
# 2013  417.5725 266.9412 568.2038 187.2018 647.9432 

#-------------------------------------------------------- 
fcst_diff_ar2(coef(fit2), series, 3) 
# [1] 198.0000 150.0000 120.0000 84.0000 150.0000 136.0000 80.0000 128.0000 
# [9] 160.0000 132.0000 144.0000 234.0000 300.0000 312.0000 400.0000 468.0000 
# [17] 420.0000 500.0000 650.0000 612.0000 516.0000 504.6897 535.3388 547.1413 

forecast(fit2, 3) 
#  Point Forecast Lo 80 Hi 80 Lo 95 Hi 95 
# 2011  504.6897 428.9867 580.3927 388.9119 620.4675 
# 2012  535.3388 413.7918 656.8858 349.4487 721.2289 
# 2013  547.1413 405.0444 689.2383 329.8228 764.4599 
+0

Большое спасибо @ mra68 :) –

Смежные вопросы