1
votes

In some cases, i have to do forecasts by hand, which means using the formula of the model. For AR(p) model, it is easy. But for the ARIMA model (p, d, q), d> = 1, i have a bit of difficult. The following example, i calculated with models AR(2). I have series from 1990 to 2010, i need forecast for 2011:

> 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

I received a calculation formula of model AR(2):

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

and i take forecast for 2011:

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

However, when I fit ARIMA model (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

I don't know how to write formula when d = 1? And a further problem, that why when I made forecast with function forecast(), the result is different from - when I calculated by the formula?

> 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

1 Answers

2
votes

ARIMA(2,1,0) simply means that you

  1. differentiate the series, i.e. replace series by diff(series),
  2. then apply the formula for ARIMA(2,0,0), but to diff(series),
  3. finally "re-integrate" the result by cumsum.

The function fcst_ar2 contains the formula for ARIMA(2,0,0), fcst_diff_ar2 that for 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