ARIMA vs ARMA trên loạt khác biệt


13

Trong R (2.15.2), tôi đã trang bị một lần ARIMA (3,1,3) trên chuỗi thời gian và một lần ARMA (3,3) trên các mốc thời gian khác nhau một lần. Các tham số được trang bị khác nhau, mà tôi quy cho phương pháp lắp trong ARIMA.

Ngoài ra, việc khớp ARIMA (3.0,3) trên cùng một dữ liệu như ARMA (3,3) sẽ không dẫn đến các tham số giống hệt nhau, bất kể phương pháp phù hợp tôi sử dụng.

Tôi quan tâm đến việc xác định sự khác biệt đến từ đâu và với những thông số nào tôi có thể (nếu có) phù hợp với ARIMA để có được các hệ số phù hợp như từ ARMA.

Mã mẫu để chứng minh:

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)

Chỉnh sửa: Sử dụng tổng bình phương có điều kiện đến khá gần, nhưng không hoàn toàn ở đó. Cảm ơn gợi ý cho sự phù hợp1!

Edit2: Tôi không nghĩ đây là một bản sao. Điểm 2 và 3 giải quyết các vấn đề khác với tôi và ngay cả khi tôi ghi đè việc khởi tạo được đề cập ở điểm 1 bằng

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

Tôi vẫn nhận được các hệ số khác nhau


fit1chỉ có 1 tham số MA & 1 AR: ý bạn là fit1<-arma(diff(x,1,lag=1),c(3,3),include.intercept=F)gì?
Scortchi - Phục hồi Monica

1
Tôi cho rằng có một số khác biệt nhỏ trong các thuật toán phù hợp ngay cả khi bạn chỉ định giảm thiểu tổng các lỗi bình phương có điều kiện. Các trang trợ giúp để arimađề cập đến một n.condđối số đưa ra số lượng quan sát ở đầu chuỗi để bỏ qua khi tính toán - có lẽ đó là điều đó. (Có gì sai khi sử dụng khả năng tối đa nào?)
Scortchi - Tái lập Monica

AFAIK n.cond không sử dụng một vài quan sát đầu tiên để phù hợp. Nó không giúp tôi ở đó. Không có gì sai với ML cả. Tôi chỉ muốn hiểu sự khác biệt.
dùng1965813

Câu trả lời:


10

Có ba vấn đề nhỏ tseries::armaso với stats::arimađiều đó dẫn đến một kết quả hơi khác trong mô hình ARMA cho loạt khác biệt sử dụng tseries::armavà ARIMA trong stats::arima.

  • Giá trị khởi đầu của các hệ số: stats::arimađặt hệ số AR và MA ban đầu bằng 0, trong khi tseries::armasử dụng quy trình được mô tả trong Hannan và Rissanen (1982) được sử dụng để lấy giá trị ban đầu của các hệ số.

  • Thang đo của hàm mục tiêu: hàm mục tiêu tseries::armatrả về giá trị của các tổng có điều kiện của bình phương, RSS; stats::arimatrả lại 0.5*log(RSS/(n-ncond)).

  • Thuật toán tối ưu hóa: Theo mặc định, Nelder-Mead được sử dụng trong tseries::armakhi stats::arimasử dụng thuật toán BFGS.

Cái cuối cùng có thể được thay đổi thông qua đối số optim.methodtrong stats::arimanhưng những cái khác sẽ yêu cầu sửa đổi mã. Dưới đây, tôi hiển thị một phiên bản rút gọn của mã nguồn (mã tối thiểu cho mô hình cụ thể này) trong stats::arimađó ba vấn đề được đề cập ở trên được sửa đổi để chúng giống như trong tseries::arma. Sau khi giải quyết các vấn đề này, kết quả tương tự như trong tseries::armathu được.


Phiên bản tối thiểu của stats::arima(với những thay đổi được đề cập ở trên):

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

Bây giờ, so sánh cả hai quy trình và kiểm tra xem có mang lại kết quả như nhau không (yêu cầu chuỗi xđược tạo bởi OP trong phần thân của câu hỏi).

Sử dụng các giá trị ban đầu được chọn trong 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

Sử dụng các giá trị ban đầu được chọn trong stats::arima(số không):

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

Công việc tuyệt vời. Cảm ơn rât nhiều! Đối với tôi, tôi đã thêm một đối số dung sai để có thể so sánh hai giải pháp của bạn với hàm arima bình thường và tất cả đều hoạt động như một bùa mê. Cảm ơn rất nhiều!
dùng1965813

0

Theo như tôi có thể nói, sự khác biệt hoàn toàn là do các điều khoản MA. Đó là, khi tôi khớp dữ liệu của bạn chỉ với các thuật ngữ AR, ARMA của loạt khác biệt và ARIMA đồng ý.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.