ARIMA बनाम ARMA विभेदित श्रृंखला पर


13

आर (2.15.2) में मैं एक बार श्रृंखला में एक बार एआरएमए (3,1,3) और एक बार अंतरित समय पर एक एआरएमए (3,3) फिट हुआ। फिट किए गए पैरामीटर अलग हैं, जिन्हें मैंने ARIMA में फिटिंग विधि के लिए जिम्मेदार ठहराया।

इसके अलावा, ARMA (3,3) के समान डेटा पर ARIMA (3,0,3) को फिट करना समान मापदंडों में परिणाम नहीं देगा, कोई फर्क नहीं पड़ता कि मैं जिस फिटिंग विधि का उपयोग करता हूं।

मुझे इस बात की पहचान करने में दिलचस्पी है कि अंतर कहां से आता है और मैं (अगर सभी में) 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 के लिए संकेत के लिए धन्यवाद!

Edit2: मुझे नहीं लगता कि यह कोई डुप्लिकेट है। अंक 2 और 3 खदान की तुलना में अलग-अलग समस्याओं को संबोधित करते हैं, और यहां तक ​​कि अगर मैं बिंदु 1 द्वारा वर्णित प्रारंभिककरण को ओवरराइड करता हूं

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

मुझे अब भी अलग-अलग गुणांक मिलते हैं


fit1केवल 1 एमए और 1 एआर पैरामीटर है: क्या आपका मतलब है fit1<-arma(diff(x,1,lag=1),c(3,3),include.intercept=F)?
Scortchi - को पुनः स्थापित मोनिका

1
मुझे लगता है कि जब आप चुकता त्रुटियों की सशर्त राशि को निर्दिष्ट करते हैं, तब भी फिटिंग एल्गोरिदम में कुछ मामूली अंतर होता है। श्रृंखला की शुरुआत में टिप्पणियों की संख्या देने वाले arimaएक n.condतर्क का उल्लेख करने के लिए मदद पृष्ठों को अनदेखा करते समय - शायद यही है। (क्या वैसे भी अधिकतम संभावना का उपयोग कर के साथ गलत क्या है?)
को पुनः स्थापित मोनिका - Scortchi

AFAIK n.cond फिट होने के लिए पहले कुछ टिप्पणियों का उपयोग नहीं करता है। इसने वहां मेरी मदद नहीं की। एमएल के साथ कुछ भी गलत नहीं है। मैं सिर्फ मतभेदों को समझना चाहूंगा।
user1965813

3
Rob

जवाबों:


10

वहाँ tseries::armaकी तुलना में तीन छोटे मुद्दों की तुलना stats::arimaमें ARMA मॉडल में थोड़ा अलग परिणाम का उपयोग करने tseries::armaऔर ARIMA में ARIMA की तुलना में तीन अलग-अलग मुद्दे हैं stats::arima

  • गुणांक के मानों को शुरू करना: stats::arimaप्रारंभिक AR और MA गुणांक को शून्य पर सेट tseries::armaकरता है , जबकि गुणांक के प्रारंभिक मूल्यों को प्राप्त करने के लिए हन्नान और रिसेनेन (1982) में वर्णित प्रक्रिया का उपयोग किया जाता है।

  • उद्देश्य समारोह का पैमाना: tseries::armaवर्गों, सशर्त राशियों के मूल्य को रिटर्न में उद्देश्य समारोह , आरएसएस; stats::arimaलौटता है 0.5*log(RSS/(n-ncond))

  • ऑप्टिमाइज़ेशन एल्गोरिदम: डिफ़ॉल्ट रूप से, Nelder-Mead का उपयोग किया जाता है tseries::arma, जबकि stats::arimaBFGS एल्गोरिदम को नियोजित करता है।

पिछले एक को तर्क के माध्यम से बदला जा सकता है 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प्रश्न के शरीर में ओपी द्वारा उत्पन्न श्रृंखला की आवश्यकता है )।

चुने गए प्रारंभिक मूल्यों का उपयोग करना 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

अच्छा कार्य। आपका बहुत बहुत धन्यवाद! मेरे लिए मैंने एक सहिष्णुता तर्क जोड़ा, जो आपके दो समाधानों की सामान्य अरिमा फ़ंक्शन से तुलना करने में सक्षम है और यह सब एक आकर्षण की तरह काम करता है। आपका बहुत बहुत धन्यवाद!
user1965813

0

जहां तक ​​मैं बता सकता हूं, अंतर पूरी तरह से एमए की शर्तों के कारण है। यही है, जब मैं आपके डेटा को केवल AR शर्तों के साथ फिट करता हूं, तो विभेदित श्रृंखला का ARMA और ARIMA सहमत हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.