ARIMA vs ARMA ในซีรี่ส์ที่ต่างกัน


13

ใน R (2.15.2) ฉันติดตั้ง ARIMA หนึ่งครั้ง (3,1,3) ในอนุกรมเวลาหนึ่งครั้งและ ARMA (3,3) หนึ่งครั้งในช่วงเวลาที่ต่างกัน พารามิเตอร์ที่ติดตั้งแตกต่างกันซึ่งฉันอ้างถึงวิธีการติดตั้งใน ARIMA

นอกจากนี้การติดตั้ง ARIMA (3,0,3) ในข้อมูลเดียวกันกับ ARMA (3,3) จะไม่ส่งผลให้มีพารามิเตอร์เหมือนกันไม่ว่าวิธีการฟิตติ้งที่ฉันใช้จะเป็นอย่างไร

ฉันสนใจที่จะระบุว่าความแตกต่างนั้นมาจากไหนและด้วยพารามิเตอร์ใดที่ฉันสามารถทำได้ (ถ้าหากทั้งหมด) พอดีกับ ARIMA เพื่อให้ได้ค่าสัมประสิทธิ์ของความพอดีเหมือนกับ ARMA

รหัสตัวอย่างที่จะสาธิต:

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)

แก้ไข: การใช้ผลรวมสี่เหลี่ยมจัตุรัสแบบมีเงื่อนไขนั้นค่อนข้างใกล้เคียงกัน แต่ก็ไม่ค่อยมี ขอบคุณสำหรับคำแนะนำสำหรับ fit1!

แก้ไข 2: ฉันไม่คิดว่านี่เป็นของซ้ำ จุดที่ 2 และ 3 แก้ไขปัญหาที่แตกต่างจากของฉันและแม้ว่าฉันจะแทนที่การเริ่มต้นที่กล่าวถึงในจุดที่ 1 โดย

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

ฉันยังได้รับค่าสัมประสิทธิ์ที่แตกต่างกัน


fit1มีเพียง 1 MA & 1 AR พารามิเตอร์: คุณหมายถึงfit1<-arma(diff(x,1,lag=1),c(3,3),include.intercept=F)อะไร
Scortchi - Reinstate Monica

1
ฉันคิดว่ามีความแตกต่างกันเล็กน้อยในอัลกอริทึมการปรับพอดีแม้เมื่อคุณระบุการลดผลรวมตามเงื่อนไขของข้อผิดพลาดกำลังสองน้อยที่สุด หน้าวิธีใช้เพื่อarimaกล่าวถึงการn.condโต้แย้งที่ให้จำนวนการสังเกตในตอนเริ่มต้นของซีรีส์ที่จะเพิกเฉยเมื่อคำนวณมัน - อาจเป็นไปได้ (มีความผิดปกติกับการใช้โอกาสสูงสุดได้อย่างไร)
Scortchi - Reinstate Monica

AFAIK n.cond ไม่ได้ใช้การสังเกตสองสามข้อแรกเพื่อให้พอดี มันไม่ได้ช่วยฉันที่นั่น ไม่มีอะไรผิดปกติกับ ML เลย ฉันแค่อยากจะเข้าใจความแตกต่าง
user1965813

คำตอบ:


10

มีสามประเด็นเล็ก ๆ น้อย ๆ อยู่ในtseries::armaเมื่อเทียบกับstats::arimaนำไปสู่ผลที่แตกต่างกันเล็กน้อยในรูปแบบ ARMA สำหรับชุด differenced ใช้ที่tseries::armaและ ARIMA stats::arimaใน

  • ค่าเริ่มต้นของสัมประสิทธิ์: stats::arimaตั้งค่าสัมประสิทธิ์AR และ MA เริ่มต้นเป็นศูนย์ในขณะที่tseries::armaใช้ขั้นตอนที่อธิบายไว้ใน Hannan และ Rissanen (1982) เพื่อรับค่าเริ่มต้นของสัมประสิทธิ์

  • ขนาดของฟังก์ชั่นวัตถุประสงค์: ฟังก์ชั่นวัตถุประสงค์ในการtseries::armaส่งกลับค่าของผลรวมของเงื่อนไขของสี่เหลี่ยม, RSS; ผลตอบแทนstats::arima0.5*log(RSS/(n-ncond))

  • อัลกอริธึมการปรับให้เหมาะสม: โดยค่าเริ่มต้นจะใช้ Nelder-Mead ในtseries::armaขณะที่stats::arimaใช้อัลกอริทึม BFGS

อันสุดท้ายสามารถเปลี่ยนแปลงได้ผ่านการโต้แย้งoptim.methodในstats::arimaแต่คนอื่น ๆ จะต้องแก้ไขรหัส ด้านล่างฉันแสดงเวอร์ชั่นย่อของซอร์สโค้ด (โค้ดขั้นต่ำสำหรับรุ่นนี้โดยเฉพาะ) stats::arimaซึ่งมีการแก้ไขปัญหาสามข้อที่กล่าวถึงด้านบนเพื่อให้เหมือนกันกับสิ่งtseries::armaต่อไปนี้ หลังจากแก้ไขปัญหาเหล่านี้tseries::armaจะได้รับผลลัพธ์เช่นเดียวกับใน


เวอร์ชันขั้นต่ำของstats::arima(ด้วยการเปลี่ยนแปลงที่กล่าวถึงข้างต้น):

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

ตอนนี้เปรียบเทียบทั้งสองโพรซีเดอร์และตรวจสอบว่าให้ผลลัพธ์เดียวกัน (ต้องการซีรีย์ที่xสร้างโดย OP ในเนื้อความของคำถาม)

ใช้ค่าเริ่มต้นที่เลือกใน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(ศูนย์):

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

การทำงานที่ดี. ขอบคุณมาก! สำหรับฉันฉันเพิ่มอาร์กิวเมนต์ความอดทนเพื่อให้สามารถเปรียบเทียบโซลูชันทั้งสองของคุณกับฟังก์ชัน arima ปกติและมันใช้งานได้อย่างมีเสน่ห์ ขอบคุณมาก!
user1965813

0

เท่าที่ฉันสามารถบอกได้ความแตกต่างนั้นเกิดจากข้อกำหนดของ MA นั่นคือเมื่อฉันพอดีกับข้อมูลของคุณด้วยเทอม AR เพียง ARMA ของซีรี่ย์ที่แตกต่างและ ARIMA เห็นด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.