ARIMA vs ARMA farkli serilerde


13

R (2.15.2) 'de bir zaman serisine bir kez ARIMA (3,1,3) ve bir zamanlar farklı zaman aralıklarına bir ARMA (3,3) taktım. Takılan parametreler, ARIMA'daki takma yöntemine atfettiğim farklılıklar gösteriyor.

Ayrıca, ARMA (3,3) ile aynı verilere bir ARIMA (3,0,3) takmak, kullandığım takma yöntemi ne olursa olsun aynı parametrelerle sonuçlanmaz.

Farkın nereden geldiğini ve ARMA ile aynı katsayıları elde etmek için hangi parametrelere (eğer varsa) ARIMA uydurabileceğimi tanımlamakla ilgileniyorum.

Gösterilecek örnek kod:

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)

Düzenleme: Şartlı kareler toplamı oldukça yakın geliyor, ama tam olarak orada değil. Fit1 için ipucu için teşekkürler!

Edit2: Bunun bir kopya olduğunu sanmıyorum. 2 ve 3 numaralı noktalar benimkinden farklı sorunları ele alıyor ve 1 numaralı maddede belirtilen başlatma işlemini geçersiz kılsam bile

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

Hala farklı katsayılar elde ediyorum


fit1sadece 1 MA & 1 AR parametresi var: Bunu mu demek istediniz fit1<-arma(diff(x,1,lag=1),c(3,3),include.intercept=F)?
Scortchi - Monica'yı eski durumuna döndürün

1
Kare hataların koşullu toplamını en aza indirdiğinizde bile, takma algoritmalarında küçük bir fark olduğunu varsayalım. Yardım sayfalarında , serinin başlangıcında hesaplarken göz ardı edilecek gözlem sayısını veren arimabir n.condargümandan bahsediliyor - belki de bu kadar. (Yine de maksimum olasılık kullanmanın nesi yanlış?)
Scortchi - Monica'yı eski durumuna getirin

AFAIK n.cond ilk birkaç gözlemi sığdırmak için kullanmaz. Orada bana yardımcı olmadı. ML ile ilgili hiçbir şey yanlış değil. Sadece farklılıkları anlamak istiyorum.
user1965813 10:30 '

Yanıtlar:


10

Buna göre üç küçük sorun vardır, tseries::armabununla birlikte stats::arima, ARMA modelinde farklı seriler tseries::armave ARIMA in için farklı bir sonuç elde edilir stats::arima.

  • Katsayıların başlangıç ​​değerleri: stats::arimabaşlangıç ​​AR ve MA katsayılarını sıfıra tseries::armaayarlarken, katsayıların başlangıç ​​değerlerini almak için Hannan ve Rissanen (1982) 'de açıklanan prosedürü kullanır.

  • Objektif fonksiyonun ölçeği: objektif fonksiyon tseries::arma, karelerin koşullu toplamlarının değerini döndürür, RSS; stats::arimadöner 0.5*log(RSS/(n-ncond)).

  • Optimizasyon algoritması: Varsayılan olarak, Nelder-Mead kullanılır tseries::armaiken, stats::arimaBFGS algoritması kullanır.

Sonuncusu içindeki argüman ile değiştirilebilir optim.method, stats::arimaancak diğerleri kodun değiştirilmesini gerektirir. Aşağıda, stats::arimayukarıda belirtilen üç sorunun değiştirildiği şekilde değiştirildiği kaynak kodun (bu belirli model için minimum kod) kısaltılmış bir sürümünü göstereceğim tseries::arma. Bu sorunları ele aldıktan sonra, aynı sonuç tseries::armaelde edilir.


Asgari sürümü stats::arima(yukarıda belirtilen değişikliklerle):

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

Şimdi, her iki prosedürü de karşılaştırın ve aynı sonucu verdiğini kontrol edin ( xOP tarafından sorunun gövdesinde üretilen seriyi gerektirir ).

Seçili ilk değerleri kullanarak 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(Sıfırlar) içinde seçilen başlangıç ​​değerlerini kullanarak :

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

Harika iş. Çok teşekkür ederim! Benim için iki çözümünüzü normal arima işleviyle de karşılaştırabilmek için bir tolerans argümanı ekledim ve hepsi bir cazibe gibi çalıştı. Çok teşekkürler!
user1965813

0

Anlayabildiğim kadarıyla, fark tamamen MA terimlerinden kaynaklanıyor. Yani, verilerinizi yalnızca AR terimleriyle uydurduğumda, farklı serilerin ARMA ve ARIMA aynı fikirde.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.