r - 这是预测包中的错误吗?缺失值导致预测。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 及更高版本在没有警告的情况下给出了不好的结果。
解决方案
根据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 创建
推荐阅读
- gitlab - 在 GitLab CI/CD 作业中添加和推送提交标签
- laravel - 为什么没有创建库存?
- sql - 将查询转换为 SQL Server 语法
- angular - Ionic 4 Cordova - 如何修复键盘覆盖 Windows 上的输入字段(Surface)
- powershell - 如何使用 powershell 在 powerpoint 中选择表格单元格
- reactjs - Better code implementation when mapping in React.js
- angular - 使用 mat-table-exporter 时出错“TypeError:无法读取 MatTableExporterDirective.push 未定义的属性‘componentView’
- sql - 使用计算和联接时的最佳实践
- linux - 输入 bash 脚本自动输入的内容
- javascript - 如何添加/删除类到 selectize.js?