首页 > 解决方案 > 这是预测包中的错误吗?缺失值导致预测。Arima 给出错误结果

问题描述

我正在使用 R 中的预测包将 ARIMA(0, 1, 1) 与漂移模型拟合。我的一些时间序列在前面缺少值。对于预测版本 8.4 及之前的版本,这不会导致问题。使用 8.5 及更高版本,我得到了意想不到的结果。这是一个错误吗?

以下是示例。我的期望是前面的缺失值应该被忽略,预测应该是

[1] 4.644542 4.700419 4.756296

这是 8.5 版的示例。

> library(forecast)
> 
> print(packageVersion("forecast"))
[1] ‘8.5’
> y.ts <- ts(c(NA, NA, NA, NA, NA, NA, NA, NA, 4.02, 4.06, 4.05, 4.01,
+            4.02, 4.04, 4.16, 4.12, 4.15, 4.44, 4.60))
> fit <- Arima(y.ts, c(0, 1, 1), include.drift = T)
> print(fit)
Series: y.ts 
ARIMA(0,1,1) with drift 

Coefficients:
         ma1   drift
      0.6464  0.0559
s.e.  0.5060  0.0447

sigma^2 estimated as 0.009785:  log likelihood=9.79
AIC=-13.58   AICc=-9.58   BIC=-12.67
> print((forecast(fit, 3)$mean))
Time Series:
Start = 20 
End = 22 
Frequency = 1 
[1] 4.197528 4.253405 4.309282

以下是 8.4 版的结果:

> library(forecast)
> 
> print(packageVersion("forecast"))
[1] ‘8.4’
> y.ts <- ts(c(NA, NA, NA, NA, NA, NA, NA, NA, 4.02, 4.06, 4.05, 4.01,
+            4.02, 4.04, 4.16, 4.12, 4.15, 4.44, 4.60))
> fit <- Arima(y.ts, c(0, 1, 1), include.drift = T)
> print(fit)
Series: y.ts 
ARIMA(0,1,1) with drift 

Coefficients:
         ma1   drift
      0.6464  0.0559
s.e.  0.5060  0.0447

sigma^2 estimated as 0.004892:  log likelihood=9.79
AIC=-13.58   AICc=-11.87   BIC=-10.91
> print((forecast(fit, 3)$mean))
Time Series:
Start = 20 
End = 22 
Frequency = 1 
[1] 4.644542 4.700419 4.756296

鉴于两个模型具有相同的系数和残差,我相信它们应该给出相同的预测。我使用系数和残差“手动”检查了预测是什么。这表明版本 8.4 给出了正确的预测。无论我加载了哪个版本,下一行的输出都是相同的。

> print(y.ts[[length(y.ts)]] + fit$coef[['drift']] + fit$residuals[[length(y.ts)]]*fit$coef[['ma1']])
[1] 4.644542

我还尝试使用最新版本的预测包(撰写本文时为 8.12)。结果与 8.5 版的结果一致。

有趣的是,两个模型预测之间的差异几乎是漂移系数的精确倍数,其中乘数等于缺失值的数量:

> (4.644542 - 4.197528)/.0559
[1] 7.996673

在我看来,这可能是一个错误,因为 8.4 版本优雅地处理了这些情况,而 8.5 及更高版本在没有警告的情况下给出了不好的结果。

标签: rforecastingarimaforecast

解决方案


根据https://cran.r-project.org/src/contrib/Archive/forecast/,v8.5 于 2019 年 1 月发布并于 2019 年 4 月被取代。当前版本是 v8.12,它给出了以下结果。

library(forecast)
packageVersion("forecast")
#> [1] '8.12'
y.ts <- ts(c(NA, NA, NA, NA, NA, NA, NA, NA, 4.02, 4.06, 4.05, 4.01,
          4.02, 4.04, 4.16, 4.12, 4.15, 4.44, 4.60))
fit <- Arima(y.ts, c(0, 1, 1), include.drift = T)
fit
#> Series: y.ts 
#> ARIMA(0,1,1) with drift 
#> 
#> Coefficients:
#>          ma1   drift
#>       0.6464  0.0559
#> s.e.  0.5060  0.0447
#> 
#> sigma^2 estimated as 0.009785:  log likelihood=9.79
#> AIC=-13.58   AICc=-9.58   BIC=-12.67
forecast(fit, 3)$mean
#> Time Series:
#> Start = 20 
#> End = 22 
#> Frequency = 1 
#> [1] 4.197528 4.253405 4.309282

reprex 包(v0.3.0)于 2020-04-15 创建

现在用这个提交在开发版本中修复。

library(forecast)
packageVersion("forecast")
#> [1] '8.12.0.9000'
y.ts <- ts(c(NA, NA, NA, NA, NA, NA, NA, NA, 4.02, 4.06, 4.05, 4.01,
             4.02, 4.04, 4.16, 4.12, 4.15, 4.44, 4.60))
fit <- Arima(y.ts, c(0, 1, 1), include.drift = T)
fit
#> Series: y.ts 
#> ARIMA(0,1,1) with drift 
#> 
#> Coefficients:
#>          ma1   drift
#>       0.6464  0.0559
#> s.e.  0.5060  0.0447
#> 
#> sigma^2 estimated as 0.009785:  log likelihood=9.79
#> AIC=-13.58   AICc=-9.58   BIC=-12.67
forecast(fit, 3)$mean
#> Time Series:
#> Start = 20 
#> End = 22 
#> Frequency = 1 
#> [1] 4.644542 4.700419 4.756296

reprex 包(v0.3.0)于 2020-04-16 创建


推荐阅读