我是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))获得的参数是不同的 从上面的代码中获得的。你能找出代码逻辑中的问题吗? 提前谢谢。
答案 0 :(得分:1)
无法理解您的日志功能。另外,我认为你对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,为了= C(2,0,2))$ COEF
ar1: 0.3489 ar2: 0.1060 ma1: -0.4318 ma2: 0.1887 拦截: 0.4919y = 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 强>
请注意,第一个结果的ar2甚至没有相同的符号,并且四处都是蹩脚的。但第二个是非常合适的。相同的模拟函数参数,但结果不同。
请注意,时间序列中的值越少,获得准确结果的难度就越大。以下是我计算机上的一些运行。
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>
所有这些结果都非常糟糕。
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过程的状态空间表示以及卡尔曼滤波器发现的创新及其方差来计算精确似然。