Tôi đang cố gắng hiểu làm thế nào các tham số được ước tính trong mô hình ARIMA / Hộp Jenkins (BJ). Thật không may, không có cuốn sách nào tôi gặp phải mô tả thủ tục ước tính, chẳng hạn như thủ tục ước tính Log-Likabilities một cách chi tiết. Tôi tìm thấy trang web / tài liệu giảng dạy rất hữu ích. Sau đây là phương trình từ nguồn tham khảo ở trên.
Tôi muốn học ước lượng ARIMA / BJ bằng cách tự làm. Vì vậy, tôi đã sử dụng để viết mã để ước tính ARMA bằng tay. Dưới đây là những gì tôi đã làm trong ,
- Tôi mô phỏng ARMA (1,1)
- Đã viết phương trình trên như là một hàm
- Đã sử dụng dữ liệu mô phỏng và chức năng tối ưu để ước tính các tham số AR và MA.
- Tôi cũng đã chạy ARIMA trong gói số liệu thống kê và so sánh các tham số ARMA từ những gì tôi đã làm bằng tay. Dưới đây là so sánh:
** Dưới đây là những câu hỏi của tôi:
- Tại sao có sự khác biệt nhỏ giữa các biến ước tính và tính toán?
- Có phải ARIMA hoạt động trong R phát lại hoặc làm thủ tục ước tính khác với những gì được nêu dưới đây trong mã của tôi không?
- Tôi đã gán e1 hoặc lỗi tại quan sát 1 là 0, điều này có đúng không?
- Ngoài ra có cách nào để ước tính giới hạn tin cậy của các dự báo bằng cách sử dụng hessian của tối ưu hóa không?
Cảm ơn rất nhiều vì sự giúp đỡ của bạn như mọi khi.
Dưới đây là mã:
## Load Packages
library(stats)
library(forecast)
set.seed(456)
## Simulate Arima
y <- arima.sim(n = 250, list(ar = 0.3, ma = 0.7), mean = 5)
plot(y)
## Optimize Log-Likelihood for ARIMA
n = length(y) ## Count the number of observations
e = rep(1, n) ## Initialize e
logl <- function(mx){
g <- numeric
mx <- matrix(mx, ncol = 4)
mu <- mx[,1] ## Constant Term
sigma <- mx[,2]
rho <- mx[,3] ## AR coeff
theta <- mx[,4] ## MA coeff
e[1] = 0 ## Since e1 = 0
for (t in (2 : n)){
e[t] = y[t] - mu - rho*y[t-1] - theta*e[t-1]
}
## Maximize Log-Likelihood Function
g1 <- (-((n)/2)*log(2*pi) - ((n)/2)*log(sigma^2+0.000000001) - (1/2)*(1/(sigma^2+0.000000001))*e%*%e)
##note: multiplying Log-Likelihood by "-1" in order to maximize in the optimization
## This is done becuase Optim function in R can only minimize, "X"ing by -1 we can maximize
## also "+"ing by 0.000000001 sigma^2 to avoid divisible by 0
g <- -1 * g1
return(g)
}
## Optimize Log-Likelihood
arimopt <- optim(par=c(10,0.6,0.3,0.5), fn=logl, gr = NULL,
method = c("L-BFGS-B"),control = list(), hessian = T)
arimopt
############# Output Results###############
ar1_calculated = arimopt$par[3]
ma1_calculated = arimopt$par[4]
sigmasq_calculated = (arimopt$par[2])^2
logl_calculated = arimopt$val
ar1_calculated
ma1_calculated
sigmasq_calculated
logl_calculated
############# Estimate Using Arima###############
est <- arima(y,order=c(1,0,1))
est
g1
+0.000000001