ARIMA vs ARMA sur les séries différenciées


13

Dans R (2.15.2), j'ai monté une fois un ARIMA (3,1,3) sur une série temporelle et une fois un ARMA (3,3) sur la série temporelle une fois différenciée. Les paramètres ajustés diffèrent, ce que j'ai attribué à la méthode d'ajustement dans ARIMA.

De plus, l'ajustement d'un ARIMA (3,0,3) sur les mêmes données que l'ARMA (3,3) n'entraînera pas de paramètres identiques, quelle que soit la méthode d'ajustement que j'utilise.

Je suis intéressé à identifier d'où vient la différence et avec quels paramètres je peux (le cas échéant) ajuster l'ARIMA pour obtenir les mêmes coefficients d'ajustement que ceux de l'ARMA.

Exemple de code pour démontrer:

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)

Edit: L'utilisation de la somme conditionnelle des carrés est assez proche, mais n'est pas tout à fait là. Merci pour l'astuce pour le fit1!

Edit2: Je ne pense pas que ce soit un doublon. Les points 2 et 3 abordent des problèmes différents du mien, et même si je remplace l'initialisation mentionnée au point 1 par

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

J'ai toujours des coefficients différents


fit1n'a qu'un seul paramètre MA & 1 AR: vouliez-vous dire fit1<-arma(diff(x,1,lag=1),c(3,3),include.intercept=F)?
Scortchi - Réintégrer Monica

1
Je suppose qu'il y a une légère différence dans les algorithmes d'ajustement même lorsque vous spécifiez la minimisation de la somme conditionnelle des erreurs quadratiques. Les pages d'aide pour arimamentionner un n.condargument donnant le nombre d'observations au début de la série à ignorer lors du calcul - c'est peut-être ça. (Quoi de mal à utiliser le maximum de vraisemblance de toute façon?)
Scortchi - Réintégrer Monica

AFAIK n.cond n'utilise pas les premières observations pour s'adapter. Cela ne m'a pas aidé là-bas. Rien de mal avec ML du tout. Je voudrais juste comprendre les différences.
user1965813

Réponses:


10

Il y a trois problèmes mineurs par tseries::armarapport à ceux stats::arimaqui conduisent à un résultat légèrement différent dans le modèle ARMA pour les séries différenciées utilisant tseries::armaet ARIMA dans stats::arima.

  • Valeurs de départ des coefficients: stats::arimamet les coefficients AR et MA initiaux à zéro, tandis que tseries::armala procédure décrite dans Hannan et Rissanen (1982) est utilisée pour obtenir les valeurs initiales des coefficients.

  • Echelle de la fonction objectif: la fonction objectif en tseries::armaretourne la valeur des sommes conditionnelles des carrés, RSS; stats::arimaretourne 0.5*log(RSS/(n-ncond)).

  • Algorithme d'optimisation: par défaut, Nelder-Mead est utilisé dans tseries::arma, tout en utilisant stats::arimal'algorithme BFGS.

Le dernier peut être modifié via l'argument optim.methoddans stats::arimamais les autres nécessiteraient de modifier le code. Ci-dessous, je montre une version abrégée du code source (code minimal pour ce modèle particulier) pour stats::arimalequel les trois problèmes mentionnés ci-dessus sont modifiés afin qu'ils soient les mêmes que dans tseries::arma. Après avoir résolu ces problèmes, le même résultat que dans tseries::armaest obtenu.


Version minimale de stats::arima(avec les changements mentionnés ci-dessus):

# 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
}

Maintenant, comparez les deux procédures et vérifiez qu'elles donnent le même résultat (nécessite la série xgénérée par l'OP dans le corps de la question).

En utilisant les valeurs initiales choisies dans 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

En utilisant les valeurs initiales choisies dans stats::arima(zéros):

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

Bon travail. Merci beaucoup! Pour moi, j'ai ajouté un argument de tolérance pour pouvoir également comparer vos deux solutions à la fonction arima normale et tout a fonctionné comme un charme. Merci beaucoup!
user1965813

0

Pour autant que je sache, la différence est entièrement due aux termes MA. Autrement dit, lorsque j'ajuste vos données avec uniquement des termes AR, l'ARMA de la série différenciée et ARIMA sont d'accord.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.