ARIMA的最大似然估计与使用ARIMA()计算的值不匹配
我是r的新手。我使用optim函数来获得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
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