由 auto.arima() 识别的模型是否简约?

机器算法验证 时间序列 预测 有马 aic 自动算法
2022-03-23 03:58:30

我一直在尝试学习和应用 ARIMA 模型。我一直在阅读 Pankratz 撰写的关于 ARIMA 的优秀文章 -使用单变量框进行预测 - 詹金斯模型:概念和案例作者在文中特别强调了选择 ARIMA 模型时的简约原则。

我开始玩R预测auto.arima()中的函数这是我所做的,我模拟了 ARIMA,然后应用了. 下面是2个例子。正如您在两个示例中所看到的,清楚地确定了一个许多人认为不简约的模型。特别是在示例 2 中,当实际 ARIMA(1,0,1) 就足够且简约时,识别出 ARIMA(3,0,3)。auto.arima()auto.arima()auto.arima()

以下是我的问题。我将不胜感激任何建议和建议。

  1. 是否有关于何时使用/修改使用自动算法识别的模型的指导,例如auto.arima()
  2. auto.arima()仅使用 AIC(我认为这是使用的)来识别模型有什么坑吗?
  3. 可以构建一个简洁的自动算法吗?

顺便说一句,我auto.arima()只是作为一个例子。这将适用于任何自动算法。

下面是示例#1:

set.seed(182)
y <- arima.sim(n=500,list(ar=0.2,ma=0.6),mean = 10)

auto.arima(y)

qa <- arima(y,order=c(1,0,1))
qa

以下是来自 的结果auto.arima()请注意,所有系数都是微不足道的。即,值 < 2。t

ARIMA(1,0,2) with non-zero mean 

Coefficients:
         ar1     ma1      ma2  intercept
      0.5395  0.2109  -0.3385    19.9850
s.e.  0.4062  0.4160   0.3049     0.0878

sigma^2 estimated as 1.076:  log likelihood=-728.14
AIC=1466.28   AICc=1466.41   BIC=1487.36

以下是arima()使用 ARIMA(1,0,1) 顺序运行的结果

Series: y 
ARIMA(1,0,1) with non-zero mean 

Coefficients:
         ar1     ma1  intercept
      0.2398  0.6478    20.0323
s.e.  0.0531  0.0376     0.1002

sigma^2 estimated as 1.071:  log likelihood=-727.1
AIC=1462.2   AICc=1462.28   BIC=1479.06

示例 2:

set.seed(453)
y <- arima.sim(n=500,list(ar=0.2,ma=0.6),mean = 10)

auto.arima(y)

qa <- arima(y,order=c(1,0,1))
qa

以下是来自的结果auto.arima()

ARIMA(3,0,3) with non-zero mean 

Coefficients:
         ar1      ar2     ar3     ma1     ma2     ma3  intercept
      0.7541  -1.0606  0.2072  0.1391  0.5912  0.5491    20.0326
s.e.  0.0811   0.0666  0.0647  0.0725  0.0598  0.0636     0.0939

sigma^2 estimated as 1.027:  log likelihood=-716.84
AIC=1449.67   AICc=1449.97   BIC=1483.39

以下是arima()按 ARIMA(1,0,1) 顺序运行的结果

Series: y 
ARIMA(1,0,1) with non-zero mean 

Coefficients:
         ar1     ma1  intercept
      0.2398  0.6478    20.0323
s.e.  0.0531  0.0376     0.1002

sigma^2 estimated as 1.071:  log likelihood=-727.1
AIC=1462.2   AICc=1462.28   BIC=1479.06
4个回答

这里有几个问题。首先,不要假设模拟的 ARIMA 确实是您指定的顺序;您正在从指定模型中抽取样本,并且由于随机性,抽取的特定样本的最佳拟合模型可能不是从中抽取模拟的模型。

我之所以提到这一点是因为第二个也是更重要的问题:该auto.arima()函数可以通过更有效的拟合算法估计模型,使用条件平方和,以避免长序列或复杂季节性模型的计算时间过长。使用此估计过程时,auto.arima() 近似模型的信息标准(因为尚未计算模型的对数似然)。如果用户没有指示应该使用哪种方法,则使用简单的启发式方法来确定条件平方和估计是否有效

行为是通过参数控制approximation的,简单的启发式是(length(x)>100 | frequency(x)>12),因此如果系列的长度大于或者每年有超过 12 个观察值,则approximation取一个值。模拟系列没有为参数指定值时,您使用. 这解释了明显错误地选择了具有更大AIC、AICc 和 BIC 的模型,而不是您安装的更简单模型TRUE n=100n=500 approximationauto.arima()approximation = TRUEarima()

对于您的示例 1,我们应该有

> auto.arima(y, approximation = FALSE)
Series: y 
ARIMA(0,0,1) with non-zero mean 

Coefficients:
         ma1  intercept
      0.7166    19.9844
s.e.  0.0301     0.0797

sigma^2 estimated as 1.079:  log likelihood=-728.94
AIC=1463.87   AICc=1463.92   BIC=1476.52
> qa
Series: y 
ARIMA(1,0,1) with non-zero mean 

Coefficients:
         ar1     ma1  intercept
      0.0565  0.6890    19.9846
s.e.  0.0626  0.0456     0.0830

sigma^2 estimated as 1.078:  log likelihood=-728.53
AIC=1465.06   AICc=1465.14   BIC=1481.92

因此auto.arima()选择了比真实模型更简洁的模型;选择了 ARIMA(0, 0, 1)。但这是基于信息标准,现在它们是一致的;所选模型的 AIC、AICc 和 BIC 较低,尽管 AIC 和 AICc 的差异很小。至少现在选择符合基于信息标准选择模型的规范。

我相信选择 MA(1) 的原因与我提到的第一个问题有关;也就是说,从规定的 ARIMA(p, d, q) 中抽取的样本的最佳拟合模型可能与真实模型的阶数不同。这是由于随机抽样。采取更长的系列或更长的老化期可能有助于增加选择真实模型的机会,但不要指望它。

无论如何,这里的寓意是,当某些事情看起来明显错误时,例如在您的问题中,请阅读相关的手册页或文档以确保您了解该软件的工作原理。

非常感谢@Gavin、@Irishstat 和 @Rob 回答我的问题。很明显,如果我需要来自 auto.arima 等自动算法的简约模型,则应使用 BIC 信息标准而不是 AIC,尤其是在查看了上面的这篇文章 和@Gavin 的文章之后。

我也非常同意@Irishstat 的观点,即选择基于 IC 标准的模型存在局限性,因为它不会选择更好的模型来拟合具有异常值和水平偏移的数据。在我看来,异常值 + 电平转换 + 混乱数据 = 真实的业务数据,其他任何东西都是教科书数据集。在我看来,任何不考虑异常值+水平变化的自动模型都应该谨慎使用。

来到代码 - auto.arima 可以在 AIC 或 BIC 之间进行选择。请参阅下面的代码已根据上述问题进行了修改。

非常感谢交叉验证的社区。我每天都在学习新的和有趣的东西。

###############
set.seed(453)
y <- arima.sim(n=500,list(ar=0.2,ma=0.6),mean = 10)

## Adequetly describes the unknown data
fit.aic <- auto.arima(y,ic = c("aic"))
fit.aic

## Selects the model that is parsimonious
fit.bic <- auto.arima(y,ic = c("bic"))
fit.bic

BIC IC 选择 MA(2) 模型。

> fit.bic
Series: y 
ARIMA(0,0,2) with non-zero mean 

Coefficients:
         ma1     ma2  intercept
      0.9256  0.2335    20.0326
s.e.  0.0453  0.0444     0.0992

sigma^2 estimated as 1.059:  log likelihood=-724.19
AIC=1456.39   AICc=1456.47   BIC=1473.24

我将 500 个值带入 AUTOBOX(我帮助开发的一个商业软件),并收到了以下在此处输入图像描述基于 Chow 测试的关于参数恒定性的建议。在时间序列研究中犯的一个非常基本的错误是假设数据是由具有恒定参数的特定模型驱动的。AUTOBOX 在周期 246 检测到一个断点,这可能反映了尚未“预热”的模拟。模拟数据时,好的做法是删除前“n”个值,然后研究剩余的值。我把数据分成两部分;第一个 245 和剩余的 255 。这是两个在此处输入图像描述非常不同的 acf 图在此处输入图像描述

回到分析:这里是为最后 246 个值识别的模型,在此处输入图像描述这里在此处输入图像描述有以下统计信息在此处输入图像描述实际/拟合和预测在这里在此处输入图像描述,残差图在这里在此处输入图像描述残差的 ACF 表明充分性在此处输入图像描述. 请注意,识别出的 5 个脉冲的影响非常小,很容易被忽略(在这种情况下!)。总之,这里学到的教训是,有时我们有太多数据,我们需要考虑时间变化的系数。在这种情况下,我们正在识别参数的变化,该变化(显然)不会对结果模型/参数产生重大影响,但它指出了时间序列分析中通常需要的过程改进。我对 auto.arima 的经验表明,由于它明确地不治疗/补救高斯违规行为,它倾向于过度依赖历史值而不是从数据中提取结构来过度建模。在这种情况下,因为它是一个没有高斯违规的严格控制的模拟,所以它可以工作,但我通常会怀疑这种带宽有限且单步的 ARIMA 模型识别方法。信任但要验证 !

Akaike_information_criterion “可以解释为第 i 个模型最小化(估计的)信息损失的相对概率”。  exp(AICminAICi)/2

如果是这样,它将帮助用户查看这些相对概率,以及来自auto.arima( ... trace=TRUE ). 例如,eggs data run as in this question 给出

                                # relprob = exp( (AICmin - AIC) / 2 ) * 100
 ARIMA(0,1,0) with drift : 784.5    100
 ARIMA(0,1,1) with drift : 784.8     86
 ARIMA(1,1,0) with drift : 784.9     82
 ARIMA(0,1,0)            : 792.4      2
 ARIMA(2,1,2) with drift : Inf    0
 ARIMA(1,1,1) with drift : Inf    0