ARIMA模型的计算公式?

时间:2016-03-02 11:44:33

标签: r time-series forecasting autoregressive-models

在某些情况下,我必须手动进行预测,这意味着使用模型的公式。对于AR(p)模型,它很容易。但对于ARIMA模型(p,d,q),d> = 1,我有点困难。 以下示例,我使用模型AR(2)计算。我有从1990年到2010年的系列,我需要预测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

我收到了模型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 个答案:

答案 0 :(得分:2)

ARIMA(2,1,0)只是意味着你

  1. 区分系列,即将series替换为diff(series)
  2. 然后将公式应用于ARIMA(2,0,0),但应用于diff(series)
  3. 最后通过cumsum“重新整合”结果。
  4. 函数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