ARIMA gegen ARMA auf der differenzierten Reihe


13

In R (2.15.2) habe ich einmal eine ARIMA (3,1,3) auf eine Zeitreihe und einmal eine ARMA (3,3) auf die einmal differenzierten Zeitreihen gepasst. Die angepassten Parameter unterscheiden sich, was ich der Anpassungsmethode in ARIMA zuschrieb.

Auch das Anpassen einer ARIMA (3,0,3) an dieselben Daten wie ARMA (3,3) führt nicht zu identischen Parametern, unabhängig von der verwendeten Anpassungsmethode.

Ich möchte herausfinden, woher der Unterschied kommt und mit welchen Parametern ich die ARIMA (wenn überhaupt) anpassen kann, um die gleichen Koeffizienten der Anpassung wie von der ARMA zu erhalten.

Beispielcode zur Demonstration:

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: Die Verwendung der bedingten Quadratsumme kommt ziemlich nahe, ist aber nicht ganz da. Danke für den Hinweis für die fit1!

Edit2: Ich denke nicht, dass dies ein Duplikat ist. Die Punkte 2 und 3 behandeln andere Probleme als meine, und selbst wenn ich die in Punkt 1 erwähnte Initialisierung durch überschreibe

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

Ich bekomme immer noch verschiedene Koeffizienten


fit1hat nur 1 MA & 1 AR Parameter: meintest du fit1<-arma(diff(x,1,lag=1),c(3,3),include.intercept=F)?
Scortchi

1
Ich gehe davon aus, dass die Anpassungsalgorithmen geringfügige Unterschiede aufweisen, auch wenn Sie die bedingte Summe der Fehlerquadrate minimieren. Die Hilfeseiten arimaerwähnen ein n.condArgument, das die Anzahl der Beobachtungen am Anfang der Reihe angibt, die bei der Berechnung ignoriert werden sollen - vielleicht ist es das. (Was ist eigentlich falsch daran, die maximale Wahrscheinlichkeit zu nutzen?)
Scortchi - Reinstate Monica

AFAIK n.cond verwendet die ersten Beobachtungen nicht, um zu passen. Es hat mir dort nicht geholfen. An ML ist überhaupt nichts auszusetzen. Ich möchte nur die Unterschiede verstehen.
user1965813

Antworten:


10

Im tseries::armaVergleich dazu gibt es drei kleinere Probleme stats::arima, die zu einem geringfügig unterschiedlichen Ergebnis im ARMA-Modell für die differenzierten Serien using tseries::armaund ARIMA in führen stats::arima.

  • stats::arimaAnfangswerte der Koeffizienten: Setzt die anfänglichen AR- und MA-Koeffizienten auf Null, während tseries::armadas in Hannan und Rissanen (1982) beschriebene Verfahren verwendet wird, um Anfangswerte der Koeffizienten zu erhalten.

  • Maßstab der Zielfunktion: Die Zielfunktion in tseries::armaliefert den Wert der bedingten Quadratsummen, RSS; stats::arimakehrt zurück 0.5*log(RSS/(n-ncond)).

  • Optimierungsalgorithmus: Standardmäßig wird Nelder-Mead verwendet tseries::arma, während stats::arimader BFGS-Algorithmus verwendet wird.

Das letzte kann durch das Argument optim.methodin geändert werden, bei stats::arimaden anderen muss der Code geändert werden. Im Folgenden zeige ich eine gekürzte Version des Quellcodes (Minimalcode für dieses bestimmte Modell), stats::arimabei der die drei oben genannten Probleme so geändert wurden, dass sie mit denen in identisch sind tseries::arma. Nach Behebung dieser Probleme wird das gleiche Ergebnis wie in tseries::armaerzielt.


Minimale Version von stats::arima(mit den oben genannten Änderungen):

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

Vergleichen Sie nun beide Verfahren und überprüfen Sie, ob das gleiche Ergebnis erzielt wird (erfordert die xvom OP im Hauptteil der Frage generierte Reihe ).

Unter Verwendung der in folgenden Schritten ausgewählten Anfangswerte 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

Unter Verwendung der in stats::arima(Nullen) gewählten Anfangswerte :

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

Gute Arbeit. Vielen Dank! Für mich habe ich ein Toleranzargument hinzugefügt, um auch Ihre beiden Lösungen mit der normalen Arima-Funktion vergleichen zu können, und alles hat wie ein Zauber funktioniert. Danke vielmals!
user1965813

0

Soweit ich das beurteilen kann, ist der Unterschied ausschließlich auf die MA-Bedingungen zurückzuführen. Das heißt, wenn ich Ihre Daten nur mit AR-Begriffen ausrüste, stimmen ARMA der differenzierten Serie und ARIMA überein.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.