R: Прогнозирование нескольких временных рядов с помощью басни, цибла и карты.
Я пытаюсь уместить некоторые временные ряды, используя пакеты R tsibble
а также fable
, все еще строящаяся замена для грозного Роба Хиндмана forecast
пакет. Все серии объединены в один Циббл, который я затем совместил с ARIMA, функцией, которая заменяет, среди прочего, forecast::auto.arima
,
я использую map_at
сначала перебрать все элементы, кроме Date
и затем снова извлечь информацию о модели из моделей, которые были подобраны для каждой серии, используя fablelite::components
, (Много fable
функции действительно в fablelite
).
Это терпит неудачу, очевидно, потому что компоненты ожидают объект класса mdl_df
и мои объекты модели имеют класс mdl_defn
Вот игрушечный пример, который (почти) воспроизводит ошибку:
library(tidyverse)
library(tsibble)
library(fable)
set.seed(1)
ar1 <- arima.sim(model=list(ar=.6), n=10)
ma1 <- arima.sim(model=list(ma=0.4), n=10)
Date <- c(ymd("2019-01-01"):ymd("2019-01-10"), ymd("2019-01-01"):ymd("2019-01-10"))
tb <- tibble(Date, ar1, ma1)
# Fit the whole series
tb_all <- tb %>%
map_at(.at = c("ar1", "ma1"), .f = ARIMA)
names(arima_all[2:3])<- c("ar1", "ma1")
# Extract model components
tb_components <- tb %>%
map_at(.at = c("ar1", "ma1"),
.f = fablelite::components)
Обратите внимание, что в этой игрушке, как и мои реальные данные, время в 5-дневных неделях с пропущенными выходными
В этом игрушечном примере сообщение об ошибке говорит, что функция компонентов отклоняет элементы списка на том основании, что для класса нет метода ts
, В моем реальном случае, в котором используются более длинные серии и их больше, но, на мой взгляд, они идентичны, элементы отклоняются, потому что они относятся к классу. mdl_defn
, Обратите внимание, что если я рассмотрю второй и третий элементы tb_all
с участием str( )
они также отображаются как классы 'mdl_defn'
, 'R6'
Не уверен, где ts
в сообщении об ошибке приходит от.
1 ответ
Вот пример, который, надеюсь, делает что-то вроде того, что вы хотите.
Для начала нужно создать циббл:
library(tidyverse)
library(tsibble)
library(fable)
library(lubridate)
set.seed(1)
ar1 <- arima.sim(model=list(ar=.6), n=30)
ma1 <- arima.sim(model=list(ma=0.4), n=30)
Date <- ymd(paste0("2019-01-",1:30))
tb <- bind_cols(Date=Date, ar1=ar1, ma1=ma1) %>%
gather("Series", "value", -Date) %>%
as_tsibble(index=Date, key=Series)
tb
#> # A tsibble: 60 x 3 [1D]
#> # Key: Series [2]
#> Date Series value
#> <date> <chr> <dbl>
#> 1 2019-01-01 ar1 -2.07
#> 2 2019-01-02 ar1 -0.118
#> 3 2019-01-03 ar1 -0.116
#> 4 2019-01-04 ar1 -0.0856
#> 5 2019-01-05 ar1 0.892
#> 6 2019-01-06 ar1 1.36
#> 7 2019-01-07 ar1 1.41
#> 8 2019-01-08 ar1 1.76
#> 9 2019-01-09 ar1 1.84
#> 10 2019-01-10 ar1 1.18
#> # … with 50 more rows
Это содержит две серии: ar1
а также ma1
за те же 30 дней.
Далее вы можете подогнать модели ARIMA к обеим сериям в одной простой функции.
tb_all <- tb %>% model(arima = ARIMA(value))
tb_all
#> # A mable: 2 x 2
#> # Key: Series [2]
#> Series arima
#> <chr> <model>
#> 1 ar1 <ARIMA(0,0,2)>
#> 2 ma1 <ARIMA(0,0,0) w/ mean>
Наконец, не ясно, что вы пытаетесь извлечь с помощью components()
, но, возможно, одно из следующего делает то, что вы хотите:
tidy(tb_all)
#> # A tibble: 3 x 7
#> Series .model term estimate std.error statistic p.value
#> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 ar1 arima ma1 0.810 0.198 4.09 0.000332
#> 2 ar1 arima ma2 0.340 0.181 1.88 0.0705
#> 3 ma1 arima constant 0.295 0.183 1.61 0.118
glance(tb_all)
#> # A tibble: 2 x 9
#> Series .model sigma2 log_lik AIC AICc BIC ar_roots ma_roots
#> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <list> <list>
#> 1 ar1 arima 0.695 -36.4 78.9 79.8 83.1 <cpl [0]> <cpl [2]>
#> 2 ma1 arima 1.04 -42.7 89.4 89.8 92.2 <cpl [0]> <cpl [0]>
augment(tb_all)
#> # A tsibble: 60 x 6 [1D]
#> # Key: Series, .model [2]
#> Series .model Date value .fitted .resid
#> <chr> <chr> <date> <dbl> <dbl> <dbl>
#> 1 ar1 arima 2019-01-01 -2.07 -0.515 -1.56
#> 2 ar1 arima 2019-01-02 -0.118 -1.21 1.09
#> 3 ar1 arima 2019-01-03 -0.116 0.511 -0.627
#> 4 ar1 arima 2019-01-04 -0.0856 -0.155 0.0690
#> 5 ar1 arima 2019-01-05 0.892 -0.154 1.05
#> 6 ar1 arima 2019-01-06 1.36 0.871 0.486
#> 7 ar1 arima 2019-01-07 1.41 0.749 0.659
#> 8 ar1 arima 2019-01-08 1.76 0.699 1.06
#> 9 ar1 arima 2019-01-09 1.84 1.09 0.754
#> 10 ar1 arima 2019-01-10 1.18 0.973 0.206
#> # … with 50 more rows
Чтобы увидеть результаты модели традиционным способом, используйте report()
:
tb_all %>% filter(Series=='ar1') %>% report()
#> Series: value
#> Model: ARIMA(0,0,2)
#>
#> Coefficients:
#> ma1 ma2
#> 0.8102 0.3402
#> s.e. 0.1982 0.1809
#>
#> sigma^2 estimated as 0.6952: log likelihood=-36.43
#> AIC=78.86 AICc=79.78 BIC=83.06
tb_all %>% filter(Series=='ma1') %>% report()
#> Series: value
#> Model: ARIMA(0,0,0) w/ mean
#>
#> Coefficients:
#> constant
#> 0.2950
#> s.e. 0.1833
#>
#> sigma^2 estimated as 1.042: log likelihood=-42.68
#> AIC=89.36 AICc=89.81 BIC=92.17