2

如此处所述,在测试集中进行单步预测是一种避免随着预测范围增加而不可避免地增加方差的方法。该部分提到了使用已经训练的模型对测试集执行单步预测的方法,用于forecast包。是否有类似的方法可以使用较新的包对测试数据执行一步预测fable例如,这里new_data描述的参数可能会处理这个问题,但我不确定,因为两者的预测和下面是相同的:h = 24new_data = x_test

> library(fable)
> library(fabletools)
> x <- USAccDeaths %>%
+   as_tsibble()
> x
# A tsibble: 72 x 2 [1M]
      index value
      <mth> <dbl>
 1 1973 Jan  9007
 2 1973 Feb  8106
 3 1973 Mar  8928
 4 1973 Apr  9137
 5 1973 May 10017
 6 1973 Jun 10826
 7 1973 Jul 11317
 8 1973 Aug 10744
 9 1973 Sep  9713
10 1973 Oct  9938
# … with 62 more rows
> x_train <- x %>% filter(year(index) < 1977)
> x_test <- x %>% filter(year(index) >= 1977)
> fit <- x_train %>% model(arima = ARIMA(log(value) ~ pdq(0, 1, 1) + PDQ(0, 1, 1)))
> fit
# A mable: 1 x 1
                      arima
                    <model>
1 <ARIMA(0,1,1)(0,1,1)[12]>
> nrow(x_test)
[1] 24
> forecast(fit, h = 24)$.mean
 [1]  7778.052  7268.527  7831.507  7916.845  8769.478  9144.790 10004.816  9326.874  8172.226
[10]  8527.355  8015.100  8378.166  7692.356  7191.343  7751.466  7839.085  8686.833  9062.247
[19]  9918.487  9250.101  8108.202  8463.933  7958.667  8322.497
> forecast(fit, new_data = x_test)$.mean
 [1]  7778.052  7268.527  7831.507  7916.845  8769.478  9144.790 10004.816  9326.874  8172.226
[10]  8527.355  8015.100  8378.166  7692.356  7191.343  7751.466  7839.085  8686.833  9062.247
[19]  9918.487  9250.101  8108.202  8463.933  7958.667  8322.497
4

1 回答 1

2

答案和代码

model包中许多模型可用的参数{forecast}等价于包中的refit()方法{fable}。当与未来数据一起使用时,它可用于从模型中生成多个单步预测。

library(forecast)
fit <- head(USAccDeaths, -24) %>% 
  auto.arima()
fit_test <- tail(USAccDeaths, 24) %>% 
  Arima(model = fit)
accuracy(fit_test)
#>                    ME     RMSE      MAE       MPE      MAPE      MASE
#> Training set 22.45098 167.0648 85.59724 0.2382773 0.9327587 0.3298545
#>                    ACF1
#> Training set -0.0968173

library(fable)
library(dplyr)
us_accidental_deaths <- as_tsibble(USAccDeaths)
fit <- head(us_accidental_deaths, -24) %>% 
  model(ARIMA(value))
fit_test <- refit(fit, tail(us_accidental_deaths, 24), reestimate = FALSE)
accuracy(fit_test)
#> # A tibble: 1 x 10
#>   .model       .type       ME  RMSE   MAE   MPE  MAPE  MASE RMSSE    ACF1
#>   <chr>        <chr>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>   <dbl>
#> 1 ARIMA(value) Training  22.5  167.  85.6 0.238 0.933 0.330 0.490 -0.0968

reprex 包(v0.3.0)于 2020 年 10 月 13 日创建

解释

模型的fitted()值是提前一步的预测,可用于评估“训练准确度”性能(训练数据的预测准确度)。但是有一个问题——模型的估计参数是基于整个训练集的,因此训练精度比预期的要好(模型包含一些关于它所拟合的未来的信息)。

forecast()函数用于生成模型从未见过的未来时间点的预测。您可以使用 生成单步提前预测forecast(<mable>, h = 1)。然而,这只产生一个单一的预测。相反,我们希望生成一个提前一步的预测,在模型中添加一个新的观测值,然后在该新观测值之外生成另一个提前一步的预测(重复直到数据用完)。

这是该refit()功能有用的地方。它采用现有模型,并将其应用于新数据集。fitted()这个改装过程涉及计算数据(值)的一步预测。通过设置reestimate = FALSE,模型的估计系数将不会更新以更好地适应新的“未来”数据。这解决了模型系数包含有关我们正在测试预测准确性的未来值的一些信息的问题。

于 2020-10-13T06:21:51.213 回答