ARIMA vs ARMA sulla serie differenziata


13

In R (2.15.2) ho montato una volta un ARIMA (3,1,3) su una serie temporale e una volta un ARMA (3,3) sulla serie temporale una volta differenziata. I parametri adattati differiscono, che ho attribuito al metodo di adattamento in ARIMA.

Inoltre, il montaggio di un ARIMA (3,0,3) sugli stessi dati di ARMA (3,3) non determinerà parametri identici, indipendentemente dal metodo di adattamento che utilizzo.

Sono interessato a identificare da dove proviene la differenza e con quali parametri posso (se non del tutto) adattarmi all'ARIMA per ottenere gli stessi coefficienti di adattamento dell'ARMA.

Codice di esempio per dimostrare:

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)

Modifica: l'uso della somma condizionale dei quadrati si avvicina abbastanza, ma non è del tutto presente. Grazie per il suggerimento per fit1!

Edit2: Non penso che questo sia un duplicato. I punti 2 e 3 affrontano problemi diversi dai miei e anche se ignoro l'inizializzazione di cui al punto 1 con

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

Ricevo ancora coefficienti diversi


fit1ha solo 1 parametro MA e 1 AR: intendevi fit1<-arma(diff(x,1,lag=1),c(3,3),include.intercept=F)?
Scortchi - Ripristina Monica

1
Suppongo che ci sia una leggera differenza negli algoritmi di adattamento anche quando si specifica minimizzare la somma condizionale degli errori al quadrato. Le pagine di aiuto per arimamenzionare un n.condargomento che fornisce il numero di osservazioni all'inizio della serie da ignorare durante il calcolo - forse è tutto. (Cosa c'è che non va nell'usare la massima verosimiglianza comunque?)
Scortchi - Reinstalla Monica

AFAIK n.cond non utilizza le prime osservazioni per adattarsi. Non mi ha aiutato lì. Niente di sbagliato con ML. Vorrei solo capire le differenze.
user1965813

Risposte:


10

Vi sono tre problemi minori tseries::armarispetto a quelli stats::arimache portano a un risultato leggermente diverso nel modello ARMA per le serie differenziate che utilizzano tseries::armae ARIMA in stats::arima.

  • Valori stats::arimainiziali dei coefficienti: imposta i coefficienti AR e MA iniziali su zero, mentre si tseries::armautilizza la procedura descritta in Hannan e Rissanen (1982) per ottenere i valori iniziali dei coefficienti.

  • Scala della funzione obiettivo: la funzione obiettivo in tseries::armarestituisce il valore delle somme condizionate di quadrati, RSS; stats::arimaritorna 0.5*log(RSS/(n-ncond)).

  • Algoritmo di ottimizzazione: per impostazione predefinita, Nelder è utilizzato in tseries::arma, mentre stats::arimautilizza l'algoritmo BFGS.

L'ultimo può essere modificato tramite l'argomento optim.methodin stats::arimama gli altri richiederebbero la modifica del codice. Di seguito, mostro una versione ridotta del codice sorgente (codice minimo per questo particolare modello) per stats::arimacui i tre problemi sopra menzionati vengono modificati in modo che siano gli stessi di in tseries::arma. Dopo aver risolto questi problemi, tseries::armasi ottiene lo stesso risultato di in .


Versione minima di stats::arima(con le modifiche sopra menzionate):

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

Ora, confronta entrambe le procedure e verifica che producano lo stesso risultato (richiede le serie xgenerate dall'OP nel corpo della domanda).

Utilizzando i valori iniziali scelti in 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

Utilizzando i valori iniziali scelti in stats::arima(zeri):

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

Ottimo lavoro. Grazie mille! Per me ho aggiunto un argomento di tolleranza per poter anche confrontare le tue due soluzioni con la normale funzione di arima e tutto ha funzionato come un incantesimo. Molte grazie!
user1965813

0

Per quanto ne so, la differenza è interamente dovuta ai termini MA. Cioè, quando inserisco i tuoi dati con solo termini AR, l'ARMA delle serie differenziate e ARIMA sono d'accordo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.