Непоследовательное поведение прогноза при использовании запаздывающих xreg в R fabletools

Это вопрос, который я открыл как проблему, но не получил ответа от автора пакета, поэтому подумал, что задам вопрос здесь. Спасибо!

Я замечаю некоторые несоответствия при прогнозировании с запаздыванием xreg. В частности, прогнозы на h <= лаговый период. Похоже, что исторические данные, предоставленные исходной модели, не добавляются к новым данным перед созданием прогноза. В приведенном ниже примере я использую пример lag = 2 из fpp3. Первый прогноз идентичен прогнозу, созданному в книге. Во втором прогнозе я увеличиваю путем связывания исторических данных рекламы с новыми данными рекламы, созданными в . Когда я делаю это, я получаю другой прогноз в vs. Мне кажется, что прогноз в не имеет доступа к историческим (xreg) данным, поэтому TVaderts рассматривается как для первых двух шагов на горизонте. Это правильно? И если да, то не следует ли включать эти данные в том виде, в котором они есть? Это может быть связано с.

      library(fpp3)
#> ── Attaching packages ──────────────────────────────────────────── fpp3 0.4.0 ──
#> ✓ tibble      3.1.2      ✓ tsibble     1.0.1 
#> ✓ dplyr       1.0.6      ✓ tsibbledata 0.3.0 
#> ✓ tidyr       1.1.3      ✓ feasts      0.2.1 
#> ✓ lubridate   1.7.10     ✓ fable       0.3.1 
#> ✓ ggplot2     3.3.3
#> ── Conflicts ───────────────────────────────────────────────── fpp3_conflicts ──
#> x lubridate::date()    masks base::date()
#> x dplyr::filter()      masks stats::filter()
#> x tsibble::intersect() masks base::intersect()
#> x tsibble::interval()  masks lubridate::interval()
#> x dplyr::lag()         masks stats::lag()
#> x tsibble::setdiff()   masks base::setdiff()
#> x tsibble::union()     masks base::union()
library(fabletools)
library(fable)
library(dplyr)
library(tsibble)

fit <- insurance %>%
  # Restrict data so models use same fitting period
  # Estimate models
  model(
    lag2 = ARIMA(Quotes ~ pdq(d = 0) +
                   TVadverts + lag(TVadverts) +
                   lag(TVadverts, 2))
  )

insurance_future <- new_data(insurance, 20) %>%
  mutate(TVadverts = 8)

# Forecast as shown in https://otexts.com/fpp3/lagged-predictors.html
fc1 <- fit %>%
  forecast(insurance_future)

# Manually pre-pend historic advert data to future data to ensure presence of
# lagged regressors
fc2 <- fit %>% 
  forecast(bind_rows(select(insurance, -Quotes), insurance_future)) %>%
  filter_index(as.character(min(insurance_future$Month)) ~ .)

print(fc1)
#> # A fable: 20 x 5 [1M]
#> # Key:     .model [1]
#>    .model    Month      Quotes .mean TVadverts
#>    <chr>     <mth>      <dist> <dbl>     <dbl>
#>  1 lag2   2005 May N(13, 0.23)  13.0         8
#>  2 lag2   2005 Jun N(13, 0.59)  13.0         8
#>  3 lag2   2005 Jul N(13, 0.72)  13.2         8
#>  4 lag2   2005 Aug N(13, 0.72)  13.2         8
#>  5 lag2   2005 Sep N(13, 0.72)  13.2         8
#>  6 lag2   2005 Oct N(13, 0.72)  13.2         8
#>  7 lag2   2005 Nov N(13, 0.72)  13.2         8
#>  8 lag2   2005 Dec N(13, 0.72)  13.2         8
#>  9 lag2   2006 Jan N(13, 0.72)  13.2         8
#> 10 lag2   2006 Feb N(13, 0.72)  13.2         8
#> 11 lag2   2006 Mar N(13, 0.72)  13.2         8
#> 12 lag2   2006 Apr N(13, 0.72)  13.2         8
#> 13 lag2   2006 May N(13, 0.72)  13.2         8
#> 14 lag2   2006 Jun N(13, 0.72)  13.2         8
#> 15 lag2   2006 Jul N(13, 0.72)  13.2         8
#> 16 lag2   2006 Aug N(13, 0.72)  13.2         8
#> 17 lag2   2006 Sep N(13, 0.72)  13.2         8
#> 18 lag2   2006 Oct N(13, 0.72)  13.2         8
#> 19 lag2   2006 Nov N(13, 0.72)  13.2         8
#> 20 lag2   2006 Dec N(13, 0.72)  13.2         8
print(fc2)
#> # A fable: 20 x 5 [1M]
#> # Key:     .model [1]
#>    .model    Month      Quotes .mean TVadverts
#>    <chr>     <mth>      <dist> <dbl>     <dbl>
#>  1 lag2   2005 May N(14, 0.72)  13.5         8
#>  2 lag2   2005 Jun N(13, 0.72)  13.3         8
#>  3 lag2   2005 Jul N(13, 0.72)  13.2         8
#>  4 lag2   2005 Aug N(13, 0.72)  13.2         8
#>  5 lag2   2005 Sep N(13, 0.72)  13.2         8
#>  6 lag2   2005 Oct N(13, 0.72)  13.2         8
#>  7 lag2   2005 Nov N(13, 0.72)  13.2         8
#>  8 lag2   2005 Dec N(13, 0.72)  13.2         8
#>  9 lag2   2006 Jan N(13, 0.72)  13.2         8
#> 10 lag2   2006 Feb N(13, 0.72)  13.2         8
#> 11 lag2   2006 Mar N(13, 0.72)  13.2         8
#> 12 lag2   2006 Apr N(13, 0.72)  13.2         8
#> 13 lag2   2006 May N(13, 0.72)  13.2         8
#> 14 lag2   2006 Jun N(13, 0.72)  13.2         8
#> 15 lag2   2006 Jul N(13, 0.72)  13.2         8
#> 16 lag2   2006 Aug N(13, 0.72)  13.2         8
#> 17 lag2   2006 Sep N(13, 0.72)  13.2         8
#> 18 lag2   2006 Oct N(13, 0.72)  13.2         8
#> 19 lag2   2006 Nov N(13, 0.72)  13.2         8
#> 20 lag2   2006 Dec N(13, 0.72)  13.2         8

waldo::compare(fc1, fc2)
#> `old$Quotes[[1]]$mu`: 13.0
#> `new$Quotes[[1]]$mu`: 13.5
#> 
#> `old$Quotes[[1]]$sigma`: 0.5
#> `new$Quotes[[1]]$sigma`: 0.8
#> 
#> `old$Quotes[[2]]$mu`: 13.0
#> `new$Quotes[[2]]$mu`: 13.3
#> 
#> `old$Quotes[[2]]$sigma`: 0.77
#> `new$Quotes[[2]]$sigma`: 0.85
#> 
#> `old$.mean[1:5]`: 13.0 13.0 13.2 13.2 13.2
#> `new$.mean[1:5]`: 13.5 13.3 13.2 13.2 13.2

Любопытно, что когда я создаю новые переменные с задержкой вручную (а не в формуле), результаты модели соответствуют «базовому случаю» из fpp3(в моем примере).

      insurance_manlag <- insurance %>%
  mutate(TVadverts1 = lag(TVadverts),
         TVadverts2 = lag(TVadverts, 2))

fit <- insurance_manlag %>%
  # Restrict data so models use same fitting period
  # Estimate models
  model(
    lag2 = ARIMA(Quotes ~ pdq(d = 0) +
                   TVadverts + TVadverts1 + TVadverts2)
  )

insurance_man_future <- append_row(insurance, n = 20) %>%
  replace_na(replace = list(TVadverts = 8)) %>%
  mutate(TVadverts1 = lag(TVadverts),
         TVadverts2 = lag(TVadverts, 2)) %>%
  slice_tail(n = 20)

# Forecast as shown in https://otexts.com/fpp3/lagged-predictors.html
fc3 <- fit %>%
  forecast(insurance_man_future)

waldo::compare(fc1$Quotes, fc3$Quotes)
#> ✓ No differences
waldo::compare(fc2$Quotes, fc3$Quotes)
#> `old[[1]]$mu`: 13.5
#> `new[[1]]$mu`: 13.0
#> 
#> `old[[1]]$sigma`: 0.8
#> `new[[1]]$sigma`: 0.5
#> 
#> `old[[2]]$mu`: 13.3
#> `new[[2]]$mu`: 13.0
#> 
#> `old[[2]]$sigma`: 0.85
#> `new[[2]]$sigma`: 0.77

Создано 2021-06-02 пакетом REPEX (v2.0.0)

Это воспроизведение заставляет меня поверить, что это правильно, а не. Если да, то что происходит в это приводит к тому, что у него другой прогноз по сравнению с )?

1 ответ

В {fable}, модели, производящие прогнозы, сохраняют всю информацию, необходимую для составления прогнозов. При использовании рекомендованного интерфейса для получения fc1 (как показано в книге), модель придерживается двух последних значений: TVadverts. Хотя они не были необходимы для оценки модели, они необходимы для составления первой пары прогнозов.

При использовании forecast() функция с предполагаемым поведением модели для создания прогнозов для каждого момента времени в new_data. Я считаю, что прогнозирование по временным точкам, не относящимся к концу ряда, еще не реализовано, поэтому я изменю это, чтобы получить ошибку.

Вообще говоря, при использовании lag()функции в формуле модели нет необходимости добавлять исторические данные. Модели сохранят и запомнят необходимые значения для прогнозирования.

Другие вопросы по тегам