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

ARIMA的最大似然估计与使用ARIMA()计算的值不匹配,r,statistics,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) likeli

我是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()

kings无法理解您的日志函数。此外,我认为您对arima和optim函数的期望过高。以下是一些评论:

  • 出于您的目的(学习),我将使用
    arima.sim
    功能生成一个系列。这将允许您知道
    optim
    arima
    应该给出的值

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

    y=arima.sim(n=1000,列表(ar=c(0.6,-0.2),ma=c(-0.7,0.5)),平均值=0.3)
    arima(y,order=c(2,0,2))$coef
    ar1:0.3489ar2:0.1060ma1:-0.4318ma2: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,order=c(2,0,2))$coef
    ar1:0.6100ar2:-0.1672ma1:-0.6663ma2:0.4816截距:0.4199

  • 请注意,第一个结果的ar2甚至没有相同的符号,而且到处都是垃圾。但是第二个很合适。模拟功能参数相同,但结果不同

  • 请注意,时间序列上的值越少,获得准确结果就越困难。这是我电脑上的一些运行

    y=arima.sim(n=42,列表(ar=c(0.6,-0.2),ma=c(-0.7,0.5)),平均值=0.3)
    arima(y,order=c(2,0,2))$coef
    ar1:-1.1102ar2:-0.4528ma1:1.2052ma2: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,order=c(2,0,2))$coef
    ar1:0.8623ar2:-0.3935ma1:-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,order=c(2,0,2))$coef
    ar1:-0.2749ar2:0.4170ma1:-0.0078ma2:-0.0586截距:0.3737

  • 所有这些结果都很糟糕

    4.我发现你的代码有点难以阅读/理解。下面是我在我的机器上运行的结果

    库(stats4)
    kingsarima()函数不使用最大似然法拟合模型

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


    你应该自己做这个功能吗?R中有一些软件包对ARIMA模型进行MLE,例如
    TSA
    (时间序列分析)。我的一个朋友建议我先手动执行该功能,而不采用自动功能。他说,这是了解系统工作原理的最佳方式。
    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