手动 ARIMA 估计

机器算法验证 时间序列 预测 有马 优化 盒子詹金斯
2022-02-10 18:00:26

我试图了解如何在 ARIMA 建模/Box Jenkins (BJ) 中估计参数。不幸的是,我遇到的所有书籍都没有详细描述估计过程,例如对数似然估计过程。以下是任何标准教科书中 ARMA 的对数似然:

LL(θ)=n2log(2π)n2log(σ2)t=1net22σ2

我想通过自己来学习 ARIMA/BJ 估计。所以我用R编写用于手动估计 ARMA 的代码。下面是我所做的R,

  • 我模拟了 ARMA (1,1)
  • 把上面的方程写成一个函数
  • 使用模拟数据和优化函数来估计 AR 和 MA 参数。
  • 我还在 stats 包中运行了 ARIMA,并比较了我手动操作的 ARMA 参数。 下面是对比:

比较

**以下是我的问题:

  • 为什么估计变量和计算变量之间存在细微差别?
  • ARIMA 是否在 R 回溯中起作用,或者估计过程与我的代码中下面概述的不同?
  • 我已将观察 1 处的 e1 或错误指定为 0,这是正确的吗?
  • 还有一种方法可以使用优化的粗麻布估计预测的置信范围吗?

非常感谢您一如既往的帮助。

下面是代码:

## 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
2个回答

有精确可能性的概念。它需要初始参数的知识,例如 MA 误差的第一个值(您的问题之一)。实现通常在如何处理初始值方面有所不同。我通常做的是(这在很多书中都没有提到)也是最大化 ML wrt 的初始值。

请看一下 Tsay 的以下内容,它并不涵盖所有情况,但对我很有帮助:

http://faculty.chicagobooth.edu/ruey.tsay/teaching/uts/lec8-08.pdf

您是否阅读了arima函数的帮助页面?以下是相关摘录:

确切的可能性是通过 ARIMA 过程的状态空间表示以及卡尔曼滤波器发现的创新及其方差来计算的。差分 ARMA 过程的初始化使用平稳性,并且基于 Gardner 等人。(1980 年)。对于差分过程,非平稳分量被赋予扩散先验(由 kappa 控制)。仍受扩散先验控制的观测(由卡尔曼增益至少为 1e4 确定)被排除在可能性计算之外。(在没有缺失值的情况下,这给出了与 arima0 相当的结果,当排除的观测值恰好是那些被差分丢弃的观测值时。)

同样相关的是一个参数method=c("CSS-ML", "ML", "CSS")

拟合方法:最大似然或最小化条件平方和。默认(除非存在缺失值)是使用条件平方和来查找起始值,然后是最大似然。

你的结果与函数产生的结果没有太大区别arima,所以你肯定做对了。

请记住,如果要比较两个优化程序的结果,则需要确保起始值相同,并且使用相同的优化方法,否则结果可能会有所不同。