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
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ì?