Forecast::auto.arima() 没有返回具有差异参数的模型

机器算法验证 r 时间序列 预测 有马
2022-03-21 06:10:35

我遇到了一个问题,它似乎 predict::auto.arima() 没有在应该返回具有差异参数的模型时返回。通读我的可重现示例以解决问题。

我有以下数据:

library(magrittr)
library(dplyr)

mydata <- c(305, 348, 337, 350, 368, 345, 370, 291, 337, 323, 328, 307, 
            299, 323, 292, 273, 282, 333, 325, 322, 298, 306, 339, 320, 
            348, 349, 381, 331, 373, 349, 307, 321, 347, 304, 314, 273, 
            309, 300, 266, 280, 318, 346, 399, 360, 394, 447, 420, 417, 
            341, 320, 292, 264, 264, 276, 292, 284, 219, 252)

然后我将其转换为单变量时间序列对象(并且干净):

global_ts <- ts(data=mydata, start=1960, end=2017, frequency=1) %>%
  forecast::tsclean(.)

数据如下所示:

ggplot2::autoplot(global_ts) +
  ggplot2::theme_bw() +
  ggplot2::geom_line(size=0.6) +
  ggplot2::geom_point(shape = 21, colour = "black", fill = "dodgerblue", size = 3, stroke = 1) +
  ggplot2::labs(x="\nTime [years]") +
  ggplot2::theme(axis.text.x  = ggplot2::element_text(size=12)) +
  ggplot2::theme(axis.text.y  = ggplot2::element_text(size=12)) +
  ggplot2::theme(axis.title.x = ggplot2::element_text(size=18)) +
  ggplot2::theme(axis.title.y = ggplot2::element_text(size=18))

在此处输入图像描述

这些数据不是固定的:

 tseries::adf.test(global_ts)

在此处输入图像描述

数据显示自相关:

acf(global_ts, lag.max = 20)

在此处输入图像描述

数据显示部分自相关: 在此处输入图像描述

为了使数据平稳化,我决定计算第一个差异:

global_ts_difference_lag_1 = diff(global_ts, differences = 1)

第一个区别如下所示:

ggplot2::autoplot(global_ts_difference_lag_1) +
  ggplot2::theme_bw() +
  ggplot2::geom_line(size=0.6) +
  ggplot2::geom_point(shape = 21, colour = "black", fill = "dodgerblue", size = 3, stroke = 1) +
  ggplot2::labs(x="\nTime [years]") +
  ggplot2::theme(axis.text.x  = ggplot2::element_text(size=12)) +
  ggplot2::theme(axis.text.y  = ggplot2::element_text(size=12)) +
  ggplot2::theme(axis.title.x = ggplot2::element_text(size=18)) +
  ggplot2::theme(axis.title.y = ggplot2::element_text(size=18)) 

在此处输入图像描述

一阶差分数据是平稳的:

tseries::adf.test(global_ts_difference_lag_1)

在此处输入图像描述

一阶差分数据不显示自相关:

acf(global_ts_difference_lag_1, lag.max = 20)

在此处输入图像描述

一阶差分数据显示没有偏自相关(注意:一条线超过 95% 置信区间是可以接受的,因为 19/20 = 0.95):

pacf(global_ts_difference_lag_1, lag.max = 20)

在此处输入图像描述

我使用 forecast::auto.arima() 执行了 ARIMA:

forecast::auto.arima(global_ts, ic="aic", trace=TRUE, stepwise = FALSE)

forecast::auto.arima() 函数返回了一个非差分 ARIMA,即使数据显然是非平稳的,没有差分......

在此处输入图像描述

如果我使用 ARIMA(1,0,0) 进行预测,我会得到以下信息:

global_arima <- arima(global_ts, order=c(1,0,0), include.mean = TRUE)
global_arima

在此处输入图像描述

plot(forecast::forecast(global_arima, h=11, level=95))

在此处输入图像描述

现在,如果我在 forecast::auto.arima() 函数中指定一阶差分作为参数,它会返回一个不同的模型:

forecast::auto.arima(global_ts, ic="aic", d=1, trace=TRUE, stepwise = FALSE)

在此处输入图像描述

如果我使用 ARIMA(1,1,0) 进行预测,我会得到以下信息:

global_arima <- arima(global_ts, order=c(1,1,0), include.mean = TRUE)
global_arima

在此处输入图像描述

plot(forecast::forecast(global_arima, h=11, level=95))

在此处输入图像描述

我的问题如下 -

为什么 forecast::auto.arima() 不能正确执行差异检查?

Forecast::auto.arima() 的文档说“d”参数是“一阶差分的顺序。如果缺少,将根据 KPSS 测试选择一个值。”

forecast::auto.arima() 是否真的根据 KPSS 测试选择差分 (d) 的值?好像真的没有这样做...

为了覆盖我的基础,我进行了手动 KPSS 测试,这导致原始时间序列的明显非平稳性:

tseries::kpss.test(global_ts)

在此处输入图像描述

是什么赋予了?我错过了什么吗?我应该相信哪个预测?

哦,我还应该提到,我在使用 forecast::ndiffs() 时得到了奇怪的结果,它应该告诉用户实现平稳性所需的差异数量。所进行的测试似乎决定了结果......

forecast::ndiffs(global_ts, test="kpss")

在此处输入图像描述

forecast::ndiffs(global_ts, test="adf")

在此处输入图像描述

forecast::ndiffs(global_ts, test="pp")

在此处输入图像描述

为什么这些测试会给出如此截然不同的结果?此外,为什么 tseries::kpss.test() 会给出与 forecast::ndiffs() 不同的结果?

1个回答

auto.arima 是一个基于列表的蛮力程序,它尝试一组固定的模型并根据估计的参数选择计算出的 AIC。AIC 应该使用控制干预管理的模型从残差计算,否则干预效果被认为是高斯噪声,低估了实际模型的自回归效应,从而错误计算了模型参数,直接导致错误的平方和,最终AIC 不正确。更重要的是,它对非平稳性(除了功率变换)的唯一补救措施是建议差分。

我取了 58 个值并使用 AUTOBOX(我选择的工具 .. 因为我帮助开发了它!)自动识别可能的 arima 模型,其中包括任何需要的干预效果。确定的模型(arima 部分)与 auto.arima 非常相似,只是预测渐近线到低得多的水平。这是由于检测和合并了电平偏移(注意,电平偏移反映了需要对系列进行贬义,而不是将系列作为非平稳性的建议原因进行区分)。

这里的等式在周期 48 处具有电平偏移。

在此处输入图像描述这里有统计数据在此处输入图像描述

模型的残差在此处,此处在此处输入图像描述为 acf 在此处输入图像描述预测图在这里在此处输入图像描述

最后,@jbowman 的反映很好,因为它突出了 AR(1) 由于残差中未经处理的异常结构(即周期 48 处的电平移动)而存在缺陷。注意周期 48 的永久下降(电平偏移)。有时可以通过识别一组暂定残差中的结构,以这种方式手动/视觉检测模型中是否需要电平转换。

在此处输入图像描述

最后,您引用的 adf 测试有一些假设.. 其中之一是不需要脉冲、电平转换、本地时间趋势或季节性脉冲。这可能就是您遇到难题的原因。测试假设非常重要。

回答您的问题/评论....该系列是非平稳的,但不需要差异。