ARIMA vs ARMA在不同系列上


13

在R(2.15.2)中,我在一个时间序列上安装了一次ARIMA(3,1,3),在一次有差异的时间序列上安装了一次ARMA(3,3)。拟合参数不同,这归因于ARIMA中的拟合方法。

同样,无论我使用哪种拟合方法,在与ARMA(3,3)相同的数据上拟合ARIMA(3,0,3)都不会得到相同的参数。

我有兴趣确定差异的出处以及可以使用哪些参数(如果有的话)拟合ARIMA,以获得与ARMA相同的拟合系数。

示例代码演示:

library(tseries)
set.seed(2)
#getting a time series manually
x<-c(1,2,1)
e<-c(0,0.3,-0.2)
n<-45
AR<-c(0.5,-0.4,-0.1)
MA<-c(0.4,0.3,-0.2)
for(i in 4:n){
tt<-rnorm(1)
t<-x[length(x)]+tt+x[i-1]*AR[1]+x[i-2]*AR[2]+x[i-3]*AR[3]+e[i-1]*MA[1]+e[i-2]*MA[2]+e[i-3]*MA[3]
x<-c(x,t)
e<-c(e,tt)
}
par(mfrow=c(2,1))
plot(x)
plot(diff(x,1))

#fitting different versions. What I would like to get is fit1 with ARIMA()
fit1<-arma(diff(x,1,lag=1),c(3,3),include.intercept=F)
fit2<-arima(x,c(3,1,3),include.mean=F)
fit3<-arima(diff(x,1),c(3,0,3),include.mean=F)
fit4<-arima(x,c(3,1,3),method="CSS",include.mean=F)
fit5<-arima(diff(x,1),c(3,0,3),method="CSS",include.mean=F)

cbind(fit1$coe,fit2$coe,fit3$coe,fit4$coe,fit5$coe)

编辑:使用条件平方和来的很接近,但还不完全是。感谢您对fit1的提示!

Edit2:我不认为这是重复的。第2点和第3点解决的问题与我的不同,即使我重写了第1点提到的初始化,

fit4<-arima(x,c(3,1,3),method="CSS",include.mean=F,init=fit1$coe)

我仍然得到不同的系数


fit1只有1 MA和1 AR参数:您是说fit1<-arma(diff(x,1,lag=1),c(3,3),include.intercept=F)吗?
Scortchi-恢复莫妮卡

1
我假设即使指定最小化平方误差的条件总和,拟合算法也存在一些细微差异。帮助页面中arima提到了一个n.cond参数,该参数给出了系列开始时要观察的次数,因此在计算时可以忽略-也许就是这样。(无论如何,使用最大似然怎么了?)
Scortchi-恢复莫妮卡

AFAIK n.cond不使用前几个观察值来拟合。它没有帮助我在那里。ML完全没错。我只是想了解差异。
user1965813 2013年

Answers:


10

与之tseries::arma相比,有三个小问题stats::arima导致ARMA模型中使用tseries::arma和ARIMA 的差异序列的结果略有不同stats::arima

  • 系数stats::arima的初始值:将初始AR和MA系数设置为零,同时tseries::arma使用Hannan和Rissanen(1982)中描述的过程获取系数的初始值。

  • 目标函数的标度:目标函数in tseries::arma返回条件平方和的值RSS;stats::arima返回0.5*log(RSS/(n-ncond))

  • 优化算法:默认情况下,Nelder-Mead用于tseries::arma,而stats::arima采用BFGS算法。

可以通过中的参数更改最后一个optim.methodstats::arima但是其他的则需要修改代码。下面,我显示源代码的节略版本(此特定模型的最小代码),stats::arima其中对上述三个问题进行了修改,使其与中的相同tseries::arma解决这些问题后,tseries::arma可获得与中相同的结果。


的最低版本stats::arima(具有上述更改):

# objective function, conditional sum of squares
# adapted from "armaCSS" in stats::arima
armaCSS <- function(p, x, arma, ncond)
{
  # this does nothing, except returning the vector of coefficients as a list
  trarma <- .Call(stats:::C_ARIMA_transPars, p, arma, FALSE)
  res <- .Call(stats:::C_ARIMA_CSS, x, arma, trarma[[1L]], trarma[[2L]], as.integer(ncond), FALSE)
  # return the conditional sum of squares instead of 0.5*log(res), 
  # actually CSS is divided by n-ncond but does not relevant in this case
  #0.5 * log(res)
  res
}
# initial values of coefficients  
# adapted from function "arma.init" within tseries::arma
arma.init <- function(dx, max.order, lag.ar=NULL, lag.ma=NULL)
{
  n <- length(dx)
  k <- round(1.1*log(n))
  e <- as.vector(na.omit(drop(ar.ols(dx, order.max = k, aic = FALSE, demean = FALSE, intercept = FALSE)$resid)))
      ee <- embed(e, max.order+1)
      xx <- embed(dx[-(1:k)], max.order+1)
      return(lm(xx[,1]~xx[,lag.ar+1]+ee[,lag.ma+1]-1)$coef) 
}
# modified version of stats::arima
modified.arima <- function(x, order, seasonal, init)
{
  n <- length(x)
  arma <- as.integer(c(order[-2L], seasonal$order[-2L], seasonal$period, order[2L], seasonal$order[2L]))
      narma <- sum(arma[1L:4L])
      ncond <- order[2L] + seasonal$order[2L] * seasonal$period
      ncond1 <- order[1L] + seasonal$period * seasonal$order[1L]
      ncond <- as.integer(ncond + ncond1)
      optim(init, armaCSS, method = "Nelder-Mead", hessian = TRUE, x=x, arma=arma, ncond=ncond)$par
}

现在,比较这两个过程并检查是否产生相同的结果(需要x问题主体中OP生成的序列)。

使用在中选择的初始值tseries::arima

dx <- diff(x)
fit1 <- arma(dx, order=c(3,3), include.intercept=FALSE)
coef(fit1)
#         ar1         ar2         ar3         ma1         ma2         ma3 
#  0.33139827  0.80013071 -0.45177254  0.67331027 -0.14600320 -0.08931003 
init <- arma.init(diff(x), 3, 1:3, 1:3)
fit2.coef <- modified.arima(x, order=c(3,1,3), seasonal=list(order=c(0,0,0), period=1), init=init)
fit2.coef
# xx[, lag.ar + 1]1 xx[, lag.ar + 1]2 xx[, lag.ar + 1]3 ee[, lag.ma + 1]1 
#        0.33139827        0.80013071       -0.45177254        0.67331027 
# ee[, lag.ma + 1]2 ee[, lag.ma + 1]3 
#       -0.14600320       -0.08931003 
all.equal(coef(fit1), fit2.coef, check.attributes=FALSE)
# [1] TRUE

使用在stats::arima(零)中选择的初始值:

fit3 <- arma(dx, order=c(3,3), include.intercept=FALSE, coef=rep(0,6))
coef(fit3)
#         ar1         ar2         ar3         ma1         ma2         ma3 
#  0.33176424  0.79999112 -0.45215742  0.67304072 -0.14592152 -0.08900624 
init <- rep(0, 6)
fit4.coef <- modified.arima(x, order=c(3,1,3), seasonal=list(order=c(0,0,0), period=1), init=init)
fit4.coef
# [1]  0.33176424  0.79999112 -0.45215742  0.67304072 -0.14592152 -0.08900624
all.equal(coef(fit3), fit4.coef, check.attributes=FALSE)
# [1] TRUE

做得好。非常感谢你!对我来说,我添加了一个公差参数,以便能够将您的两个解决方案与普通的arima函数进行比较,并且它们都像一个魅力一样工作。非常感谢!
user1965813 2015年

0

据我所知,差异完全是由于MA术语引起的。也就是说,当我仅使用AR术语来拟合您的数据时,差异系列的ARMA和ARIMA同意。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.