ARIMA vs ARMA pada seri berbeda

13

Dalam R (2.15.2) saya memasang sekali ARIMA (3,1,3) pada deret waktu dan sekali ARMA (3,3) pada deret waktu yang berbeda. Parameter yang dipasang berbeda, yang saya dikaitkan dengan metode pemasangan di ARIMA.

Juga, pemasangan ARIMA (3,0,3) pada data yang sama dengan ARMA (3,3) tidak akan menghasilkan parameter yang identik, tidak peduli metode pemasangan yang saya gunakan.

Saya tertarik untuk mengidentifikasi dari mana perbedaan berasal dan dengan parameter apa saya dapat (jika sama sekali) cocok dengan ARIMA untuk mendapatkan koefisien fit yang sama dengan ARMA.

Kode contoh untuk diperagakan:

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)

Sunting: Menggunakan jumlah bersyarat kotak datang cukup dekat, tetapi tidak cukup di sana. Terima kasih atas petunjuk untuk fit1!

Sunting2: Saya tidak berpikir ini adalah duplikat. Poin 2 dan 3 mengatasi masalah yang berbeda dari masalah saya, dan bahkan jika saya mengabaikan inisialisasi yang disebutkan dalam poin 1 oleh

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

Saya masih mendapatkan koefisien yang berbeda

pengguna1965813
sumber
fit1hanya memiliki 1 parameter MA & 1 AR: maksud Anda fit1<-arma(diff(x,1,lag=1),c(3,3),include.intercept=F)?
Scortchi
1
Saya berasumsi ada sedikit perbedaan dalam algoritma pemasangan bahkan ketika Anda menentukan meminimalkan jumlah kesalahan kuadrat bersyarat. Halaman bantuan untuk arimamenyebutkan n.condargumen yang memberikan jumlah pengamatan di awal seri untuk diabaikan ketika menghitungnya - mungkin itu saja. (Lagi pula, apa salahnya menggunakan kemungkinan maksimum?)
Scortchi - Reinstate Monica
AFAIK n.cond tidak menggunakan beberapa pengamatan pertama yang cocok. Itu tidak membantu saya di sana. Tidak ada yang salah dengan ML sama sekali. Saya hanya ingin memahami perbedaannya.
user1965813
3
Duplikat? stats.stackexchange.com/a/32799/159
Rob Hyndman

Jawaban:

10

Ada tiga masalah kecil tseries::armadibandingkan dengan stats::arimayang mengarah ke hasil yang sedikit berbeda dalam model ARMA untuk seri yang dibedakan menggunakan tseries::armadan ARIMA di stats::arima.

  • Nilai awal dari koefisien: stats::arimaset koefisien awal AR dan MA ke nol, sementara tseries::armamenggunakan prosedur yang dijelaskan dalam Hannan dan Rissanen (1982) digunakan untuk mendapatkan nilai awal dari koefisien.

  • Skala fungsi objektif: fungsi objektif dalam tseries::armamengembalikan nilai jumlah kuadrat bersyarat, RSS; stats::arimakembali 0.5*log(RSS/(n-ncond)).

  • Algoritma optimasi: Secara default, Nelder-Mead digunakan tseries::arma, sementara stats::arimamenggunakan algoritma BFGS.

Yang terakhir dapat diubah melalui argumen optim.methoddi stats::arimatapi yang lain akan membutuhkan memodifikasi kode. Di bawah ini, saya menunjukkan versi singkat dari kode sumber (kode minimal untuk model khusus ini) untuk di stats::arimamana tiga masalah yang disebutkan di atas dimodifikasi sehingga sama seperti di tseries::arma. Setelah mengatasi masalah ini, hasil yang sama dengan tseries::armayang diperoleh.


Versi minimal stats::arima(dengan perubahan yang disebutkan di atas):

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

Sekarang, bandingkan kedua prosedur dan periksa apakah menghasilkan hasil yang sama (memerlukan seri x dihasilkan oleh OP di badan pertanyaan).

Menggunakan nilai awal yang dipilih di 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

Menggunakan nilai awal yang dipilih dalam stats::arima(nol):

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
sumber
Kerja bagus. Terima kasih banyak! Bagi saya, saya menambahkan argumen toleransi untuk juga dapat membandingkan dua solusi Anda dengan fungsi arima normal dan semuanya bekerja seperti pesona. Terima kasih banyak!
user1965813
0

Sejauh yang saya tahu, perbedaannya sepenuhnya karena ketentuan MA. Yaitu, ketika saya mencocokkan data Anda dengan hanya persyaratan AR, ARMA dari seri berbeda dan ARIMA setuju.

Wayne
sumber