Có ba vấn đề nhỏ tseries::arma
so 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::arma
và 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::arma
sử 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::arma
trả về giá trị của các tổng có điều kiện của bình phương, RSS; stats::arima
trả 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::arma
khi stats::arima
sử dụng thuật toán BFGS.
Cái cuối cùng có thể được thay đổi thông qua đối số optim.method
trong stats::arima
như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::arma
thu đượ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
fit1
chỉ có 1 tham số MA & 1 AR: ý bạn làfit1<-arma(diff(x,1,lag=1),c(3,3),include.intercept=F)
gì?