为什么我的(自动)arima-model 不能预测我的时间序列?

机器算法验证 r 时间序列 预测 有马
2022-03-27 11:04:13

为了测试,我生成了一个非常简单的时间序列,具有清晰的重复模式。我预计 auto.arima 将生成一个模型,可以预测该模式,但显然它没有。谁能给我一些提示,我可以如何改进模型以正确预测该模式?

library(forecast)

ts<-c(1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1)
fit <- auto.arima(ts)
plot(forecast(fit,h=20))

在此处输入图像描述 谢谢!

2个回答

您的两个示例都涉及确定性时间序列,没有噪音也没有趋势。没有趋势的确定性时间序列实际上并不是 ARIMA 设计的那种数据(请参阅此问题以了解有关 ARIMA 假设的更多信息)。

实际上,要根据您的数据预测未来趋势,您可以做的只是取不同时间滞后的平均值,然后以相同的顺序重复它们。这里的问题是确定要使用的滞后数,即找出重复自身的窗口的长度。这可以通过使用平方误差之和或其他误差度量来简单地实现。如果你定义平均值k'th 滞后值为

x¯(k)=1N/Ki=0(N/K)1xk+i×K

误差平方和为

SSE=k=1Ki=0(N/K)1(xk+i×Kx¯(k))2

然后您可以使用 SSE 选择最佳窗口大小。您可以在下面找到 R 中的示例。

tsPattern <- function(x, kmax = ceiling((length(x)/2))) {

  stopifnot(is.numeric(x))
  kmax <- min(round(length(x)/2), kmax)

  predPattern <- function(x, k) {
    n <- length(x)
    pattern <- rep(1:k, times = ceiling(n/k), length.out = n)
    pred <- rep(tapply(x, pattern, mean), times = ceiling(n/k), length.out = n)
    as.numeric(pred)
  }

  out <- NULL
  for (k in 1:kmax) {
    xhat <- predPattern(x, k)
    out[k] <- sum((x - xhat)^2)
  }

  list(fitted = predPattern(x, which.min(out)),
       sumsq = which.min(out))
} 

ts<-c(1,1,1,1,1,0,0,
      1,1,1,1,1,0,0,
      1,1,1,1,1,0,0,
      1,1,1,1,1,0,0,
      1,1,1,1,1,0,0,
      1,1,1,1,1,0,0,
      1,1,1,1,1,0,0,
      1,1,1,1,1,0,0,
      1,1,1,1,1)

ts2 <-rep(c(1,1,2,3,4,4,5,5,6,5,5,4,3,3,2),10)
ts2 <- ts2 * round(runif(length(ts2), 0.95, 1.0), digits=2)

tsPattern(ts, 10)
tsPattern(ts2, 20)

您可以在下面看到绘制的结果(红点是估计值,线条是实际数据)。

在此处输入图像描述

这种原始方法非常适合您的确定性时间序列示例,没有趋势和噪声,但是对于现实生活中的数据,它会失败,即恰好在 ARIMA(和其他类似的时间序列方法)设计的情况下。您可以在下面看到使用此方法和auto.arima现实生活数据(预测库中的WWWusage数据集)的结果。

在此处输入图像描述

有点晚了,但您可以指定您的频率并告诉 arima 您有季节性:

library(forecast)

ts<-c(1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1)

ts <- ts(ts, frequency = 7)
fit <- auto.arima(ts, D = 1)
plot(forecast(fit,h=20))

这可以按需要工作,并且 ARIMA 会找到结构。

在此处输入图像描述