ARIMA的最大似然估计 - 与使用arima()计算的值不匹配

时间:2014-04-09 15:02:18

标签: r statistics

我是r的新手。假设残差是正态分布的,我使用optim函数来获得arima函数的最大似然估计。我将数据区分一次以使其静止不动。我写了以下内容来计算可能性: -

kings <- scan("http://robjhyndman.com/tsdldata/misc/kings.dat",skip=3)

arima1<-function(a=length(kings))
{e<-array(0,dim=a-2);
e[1:2]=0
y=diff(kings)



likelihood<-function(AR,e,y)
{for(i in 3:41)
{e[i]<-sum(y[i],-AR[1],-(AR[2]*y[i-1]),-(AR[3]*y[i-2]),-(AR[4]*e[i-1]),-(AR[5]*e[i-2]))
}
-sum(-(a-1)*(log(AR[6]*(2*22/7)^.5)),-(sum(e^2)/(2*(AR[6])^2)))
}

optim(par<-c(0,0,1,0,1,14),likelihood,y=y,e=e,control=list(maxit=1000))

}
arima1()

然而,使用函数arima(y,order&lt; -c(2,0,2))获得的参数是不同的 从上面的代码中获得的。你能找出代码逻辑中的问题吗? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

无法理解您的日志功能。另外,我认为你对arima和optim函数的期望太高了。以下是一些评论:

  1. 为了您的目的(学习),我将使用arima.sim函数生成一个系列。这样您就可以了解optimarima应该提供的值。

  2. arima函数有时会出错。在连续两次运行中,这就是我计算机中的结果:

      

    y = arima.sim(n = 1000,列表(ar = c(0.6,-0.2),ma = c(-0.7,0.5)),均值= 0.3)
      ARIMA(Y,为了= C(2,0,2))$ COEF
      ar1: 0.3489 ar2: 0.1060 ma1: -0.4318 ma2: 0.1887 拦截: 0.4919

         

    y = arima.sim(n = 1000,列表(ar = c(0.6,-0.2),ma = c(-0.7,0.5)),均值= 0.3)
      ARIMA(Y,为了= C(2,0,2))$ COEF
      ar1: 0.6100 ar2: -0.1672 ma1: -0.6663 ma2: 0.4816 拦截: 0.4199

  3. 请注意,第一个结果的ar2甚至没有相同的符号,并且四处都是蹩脚的。但第二个是非常合适的。相同的模拟函数参数,但结果不同。

    1. 请注意,时间序列中的值越少,获得准确结果的难度就越大。以下是我计算机上的一些运行。

        

      y = arima.sim(n = 42,列表(ar = c(0.6,-0.2),ma = c(-0.7,0.5)),均值= 0.3)
        ARIMA(Y,为了= C(2,0,2))$ COEF
        ar1: -1.1102 ar2: -0.4528 ma1: 1.2052 ma2: 0.9999 拦截: 0.2353260
        y = arima.sim(n = 42,列表(ar = c(0.6,-0.2),ma = c(-0.7,0.5)),均值= 0.3)
        ARIMA(Y,为了= C(2,0,2))$ COEF
        ar1: 0.8623 ar2: -0.3935 ma1:-1.0745 ma2: 0.9999 拦截: 0.4109
        y = arima.sim(n = 42,列表(ar = c(0.6,-0.2),ma = c(-0.7,0.5)),均值= 0.3)
        ARIMA(Y,为了= C(2,0,2))$ COEF
        ar1: -0.2749 ar2: 0.4170 ma1: -0.0078 ma2: -0.0586 拦截: 0.3737 < / strong>

    2. 所有这些结果都非常糟糕。

      4.我发现您的代码有点难以阅读/理解。这是我在我的机器上运行的(带结果)。

      library(stats4)
      
      kings <- scan("http://robjhyndman.com/tsdldata/misc/kings.dat",skip=3)
      y = diff(kings)
      Y_0 = y[c(-1,-2)] # this is y(t)
      Y_1 = y[c(-1,-length(y))] # this is y(t-1)
      Y_2 = y[1:(length(y)-2)] # this is y(t-2)
      
      logARMA22 <- function ( ar1=0.1, ar2=-0.2, ma1=-0.7, ma2=0.1, alpha=0.42, sigma=14)
      {
          E_0 = array(0, dim=length(Y_0))
          E_1 = array(0, dim=length(Y_0))
          E_2 = array(0, dim=length(Y_0))
      
          for ( i in 1:length(E_0) )
          {   
              E_0[i] = Y_0[i] - ar1*Y_1[i] - ar2*Y_2[i]
                       - ma1*E_1[i] - ma2*E_2[i] - alpha
              if ( (i+1) <= length(E_1) )
                  E_1 [i+1] = E_0[i]
              if ( (i+2) <= length(E_2) )
                  E_2 [i+2] = E_0[i]
          }   
      
          # e^2
          E2 = (Y_0-alpha-ar1*Y_1-ar2*Y_2-ma1*E_1-ma2*E_2)^2
          res = suppressWarnings( - sum(log( (1/(sqrt(2*pi)*sigma)) * exp(-(E2)/(2*sigma^2)))) )
          return(res)
      }
      
      print(arima(y, order=c(2,0,2))$coef)
      print(mle(logARMA22))
      
      #Read 42 items
      #         ar1          ar2          ma1          ma2    intercept 
      # 0.087452103 -0.122367077 -0.740473745  0.006492026  0.372799202 
      #
      #Call:
      #mle(minuslogl = logARMA22)
      #
      #Coefficients:
      #        ar1         ar2         ma1         ma2       alpha       sigma 
      #-0.07772158 -0.48516681 -0.50804965  0.03678942  0.10385160 15.33830148 
      

      请注意,mle只是optim的前端(所以你实际上在这里调用optim)。结果可能不同,可能是由于样本的大小。在这种情况下,对数似然函数取自“Henrik Madsen,2008,Time Series Analysis。Equation 6.72(第167页)”。同样this link也可能会有所帮助。

      希望有所帮助

答案 1 :(得分:0)

arima()函数不使用最大似然法来拟合模型。

  

通过ARIMA过程的状态空间表示以及卡尔曼滤波器发现的创新及其方差来计算精确似然。