我正在使用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 package(v0.3.0)在2020-04-15创建
现在已在开发版本中用this commit修复。
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 package(v0.3.0)在2020-04-16创建