我遇到了一个问题,它似乎 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() 不同的结果?