Функция для подбора моделей ARIMAX с rsplit Object - PullRequest
0 голосов
/ 27 апреля 2020

Я хотел бы попросить помощи, чтобы решить мою проблему. Функция должна соответствовать моделям ARIMAX и предоставлять прогнозы. Моя цель - применить скользящий источник к набору данных, привести модель в соответствие с набором анализа и получить прогнозы из набора оценки. Я должен извлечь все прогнозы из набора оценок, чтобы я мог быстро получать прогнозы на весь год. Как мне этого добиться?

Большое спасибо.



library(tidyverse)
library(tsibble)
library(lubridate)
library(fable)
library(dplyr)
library(magrittr)
library(readxl)
library(data.table)
library(rsample)


grim_1<-data.frame(
          Datum_ab = seq(from=as.POSIXct("2000-01-01 00:00"),to= as.POSIXct("2000-12-31 00:00"), by = "hour"),
          Temp_Ist=rnorm(n = 8761, mean = 15, sd = 5),
           Summe = rnorm(n = 8761, mean = 200, sd = 10) )


lg_id <- rep("GRIM_1", 8761)
grim_1 <- cbind(grim_1, lg_id)
my_data_tsbl <- as_tsibble(grim_1, key = lg_id, index = Datum_ab)


roll_eem_sliding <-rsample::rolling_origin(data=my_data_tsbl, initial = 365, assess= 120, skip = 120, cumulative = FALSE)
mod_form_1 <- as.formula(Summe ~ Temp_Ist + pdq(6,0,7) + PDQ(0,1,1, period= "day"))


ff_rolling_flex <- function(split, formula) {

  split_for_data <- analysis(split)

  ff_model <-split_for_data%>% 
    as_tsibble() %>%
    fable::ARIMA(formula)

  holdout <- assessment(split)

  out <- broom::augment(ff_model, newdata = holdout)%>%
    # calculate residuals for future use
    mutate(.resid = Summe - .fitted)

  # Return the test data set with the additional columns
  out
}

ff_rolling_flex(roll_eem_sliding$splits[[1]], mod_form_1) 
#> Error in match.arg(ic): 'arg' muss NULL sein oder ein Charakter-Vektor.

Создано в 2020-04-27 пакетом Представить (v0.3.0)

1 Ответ

0 голосов
/ 28 апреля 2020

Пакет tsibble имеет свои собственные функции для создания разбиений, которые распознаются пакетом fable, поэтому вам не нужно использовать функции rsample здесь.

В этом случае, я думаю, то, что вы пытаетесь сделать, эквивалентно разбиению на листы в терминологии tsibble - когда вы тренируетесь в окне фиксированной длины и windows не перекрываются. Альтернативы - растягивание (с расширяющимся тренировочным набором) и скольжение (с перекрывающимися тренировочными наборами фиксированной длины).

Чтобы упростить MWE, я уменьшил размер набора данных и размер модели.

Следующий код подгонит модели к каждому окну, выдает прогнозы для следующего окна и создайте сводную информацию о точности прогноза.

library(tsibble)
library(fable)
#> Loading required package: fabletools

set.seed(77)
my_data_tsbl <- tibble(
  Datum_ab = seq(from = as.POSIXct("2000-01-01 00:00"), to = as.POSIXct("2000-01-30 00:00"), by = "hour"),
  Temp_Ist = rnorm(n = length(Datum_ab), mean = 15, sd = 5),
  Summe = rnorm(n = length(Datum_ab), mean = 200, sd = 10),
  lg_id = rep("GRIM_1", length(Datum_ab))
) %>%
  as_tsibble(key = lg_id, index=Datum_ab)

tiled <- tile_tsibble(my_data_tsbl, .size=120)

ff_model <- tiled %>%
  model(
    arima = ARIMA(Summe ~ 1 + Temp_Ist + pdq(1, 0, 1) + PDQ(0, 0, 1, period = "day"))
  )
ff_forecast <- forecast(ff_model, new_data=tiled)
ff_forecast
#> # A fable: 697 x 7 [1h] <?>
#> # Key:     .id, lg_id, .model [6]
#>      .id lg_id  .model Datum_ab            Summe .distribution Temp_Ist
#>    <int> <chr>  <chr>  <dttm>              <dbl> <dist>           <dbl>
#>  1     1 GRIM_1 arima  2000-01-01 00:00:00  200. N(200,  95)       12.3
#>  2     1 GRIM_1 arima  2000-01-01 01:00:00  201. N(201,  97)       20.5
#>  3     1 GRIM_1 arima  2000-01-01 02:00:00  200. N(200,  98)       18.2
#>  4     1 GRIM_1 arima  2000-01-01 03:00:00  199. N(199,  99)       20.2
#>  5     1 GRIM_1 arima  2000-01-01 04:00:00  199. N(199,  99)       15.8
#>  6     1 GRIM_1 arima  2000-01-01 05:00:00  201. N(201, 100)       20.7
#>  7     1 GRIM_1 arima  2000-01-01 06:00:00  201. N(201, 100)       10.1
#>  8     1 GRIM_1 arima  2000-01-01 07:00:00  201. N(201, 100)       14.3
#>  9     1 GRIM_1 arima  2000-01-01 08:00:00  200. N(200, 101)       15.7
#> 10     1 GRIM_1 arima  2000-01-01 09:00:00  200. N(200, 101)       22.2
#> # … with 687 more rows
ff_forecast %>% accuracy(my_data_tsbl)
#> # A tibble: 1 x 10
#>   .model lg_id  .type      ME  RMSE   MAE    MPE  MAPE  MASE    ACF1
#>   <chr>  <chr>  <chr>   <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl>   <dbl>
#> 1 arima  GRIM_1 Test  -0.0107  9.69  7.71 -0.239  3.87 0.709 -0.0410

Создано в 2020-04-30 пакетом Представить (v0.3.0)

Столбец ff_forecast с именем Summe является средним значением распределения прогноза. Само распределение дано в .distribution.

. Для распараллеливания вычислений можно использовать пакет future, вставив plan(multiprocess) перед моделированием.

...