ARIMA vs ARMA en la serie diferenciada

13

En R (2.15.2) instalé una vez un ARIMA (3,1,3) en una serie de tiempo y una vez un ARMA (3,3) en la serie de tiempo una vez diferenciada. Los parámetros ajustados difieren, lo que atribuí al método de ajuste en ARIMA.

Además, ajustar un ARIMA (3,0,3) en los mismos datos que ARMA (3,3) no dará como resultado parámetros idénticos, sin importar el método de ajuste que use.

Estoy interesado en identificar de dónde viene la diferencia y con qué parámetros puedo (si es que puedo) ajustar el ARIMA para obtener los mismos coeficientes de ajuste que el ARMA.

Código de muestra para demostrar:

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)

Editar: el uso de la suma condicional de cuadrados se acerca bastante, pero no está del todo allí. Gracias por la pista para el fit1!

Edit2: no creo que esto sea un duplicado. Los puntos 2 y 3 abordan problemas diferentes a los míos, e incluso si anulo la inicialización mencionada en el punto 1 por

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

Todavía obtengo diferentes coeficientes

usuario1965813
fuente
fit1tiene solo 1 parámetro MA y 1 AR: ¿quiso decir fit1<-arma(diff(x,1,lag=1),c(3,3),include.intercept=F)?
Scortchi - Restablece a Monica
1
Supongo que hay una ligera diferencia en los algoritmos de ajuste, incluso cuando especificas minimizar la suma condicional de los errores al cuadrado. Las páginas de ayuda arimamencionan un n.condargumento que da el número de observaciones al comienzo de la serie para ignorarlo al calcularlo, tal vez eso es todo. (¿Qué tiene de malo usar la máxima probabilidad de todos modos?)
Scortchi - Restablecer a Monica
AFAIK n.cond no utiliza las primeras observaciones para encajar. No me ayudó allí. No hay nada malo con ML en absoluto. Solo me gustaría entender las diferencias.
user1965813
3
¿Duplicar? stats.stackexchange.com/a/32799/159
Rob Hyndman

Respuestas:

10

Hay tres problemas menores en tseries::armacomparación con los stats::arimaque conducen a un resultado ligeramente diferente en el modelo ARMA para las series diferenciadas que usan tseries::armay ARIMA en stats::arima.

  • Valores stats::arimainiciales de los coeficientes: establece los coeficientes iniciales AR y MA en cero, mientras que tseries::armautiliza el procedimiento descrito en Hannan y Rissanen (1982) para obtener los valores iniciales de los coeficientes.

  • Escala de la función objetivo: la función objetivo en tseries::armadevuelve el valor de las sumas condicionales de cuadrados, RSS; stats::arimavuelve 0.5*log(RSS/(n-ncond)).

  • Algoritmo de optimización: de forma predeterminada, Nelder-Mead se utiliza en tseries::arma, mientras que stats::arimaemplea el algoritmo BFGS.

El último se puede cambiar a través del argumento optim.methoden stats::arimapero los otros requerirían modificar el código. A continuación, muestro una versión abreviada del código fuente (código mínimo para este modelo en particular) stats::arimadonde los tres problemas mencionados anteriormente se modifican para que sean los mismos que en tseries::arma. Después de abordar estos problemas, tseries::armase obtiene el mismo resultado que en .


Versión mínima de stats::arima(con los cambios mencionados anteriormente):

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

Ahora, compare ambos procedimientos y verifique que produzcan el mismo resultado (requiere la serie xgenerada por el OP en el cuerpo de la pregunta).

Usando los valores iniciales elegidos en 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

Usando los valores iniciales elegidos en stats::arima(ceros):

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
javlacalle
fuente
Buen trabajo. ¡Muchas gracias! Para mí, agregué un argumento de tolerancia para poder comparar sus dos soluciones con la función arima normal y todo funcionó de maravilla. ¡Muchas gracias!
user1965813
0

Por lo que puedo decir, la diferencia se debe completamente a los términos de MA. Es decir, cuando ajusto sus datos solo con términos AR, el ARMA de la serie diferenciada y ARIMA están de acuerdo.

Wayne
fuente