преобразовать числовой формат даты в правильный формат даты, используя auto.arima () по группам в R - PullRequest
0 голосов
/ 25 декабря 2018

Давайте поработаем с этим образцом данных

timeseries<-structure(list(Data = structure(c(10L, 14L, 18L, 22L, 26L, 29L, 
32L, 35L, 38L, 1L, 4L, 7L, 11L, 15L, 19L, 23L, 27L, 30L, 33L, 
36L, 39L, 2L, 5L, 8L, 12L, 16L, 20L, 24L, 28L, 31L, 34L, 37L, 
40L, 3L, 6L, 9L, 13L, 17L, 21L, 25L), .Label = c("01.01.2018", 
"01.01.2019", "01.01.2020", "01.02.2018", "01.02.2019", "01.02.2020", 
"01.03.2018", "01.03.2019", "01.03.2020", "01.04.2017", "01.04.2018", 
"01.04.2019", "01.04.2020", "01.05.2017", "01.05.2018", "01.05.2019", 
"01.05.2020", "01.06.2017", "01.06.2018", "01.06.2019", "01.06.2020", 
"01.07.2017", "01.07.2018", "01.07.2019", "01.07.2020", "01.08.2017", 
"01.08.2018", "01.08.2019", "01.09.2017", "01.09.2018", "01.09.2019", 
"01.10.2017", "01.10.2018", "01.10.2019", "01.11.2017", "01.11.2018", 
"01.11.2019", "01.12.2017", "01.12.2018", "01.12.2019"), class = "factor"), 
    client = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L), .Label = c("Horns", "Kornev"), class = "factor"), stuff = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("chickens", 
    "hooves", "Oysters"), class = "factor"), Sales = c(374L, 
    12L, 120L, 242L, 227L, 268L, 280L, 419L, 12L, 172L, 336L, 
    117L, 108L, 150L, 90L, 117L, 116L, 146L, 120L, 211L, 213L, 
    67L, 146L, 118L, 152L, 122L, 201L, 497L, 522L, 65L, 268L, 
    441L, 247L, 348L, 445L, 477L, 62L, 226L, 476L, 306L)), .Names = c("Data", 
"client", "stuff", "Sales"), class = "data.frame", row.names = c(NA, 
-40L))

Я хочу выполнить прогноз с использованием auto.arima по группам

# first the grouping variable
timeseries$group <- paste0(timeseries$client,timeseries$stuff)

# now the list
listed <- split(timeseries,timeseries$group)

library("forecast")
library("lubridate")

listed_ts <- lapply(listed,
                    function(x) ts(x[["Sales"]], start = ymd("2017-01-04"), frequency = 12)  ) 

listed_ts

listed_arima <- lapply(listed_ts,function(x) auto.arima(x) )
#Now the forecast for each arima:
listed_forecast <- lapply(listed_arima,function(x) forecast(x,2) )
listed_forecast
do.call(rbind,listed_forecast)

и после listed_forecast я получу следующий вывод

  Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov
    17170 374  12 120 242 227 268 280 419  12 172 336

    $Hornshooves
          Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
    17170 497 522  65 268 441 247 348 445 477  62 226 476
    17171 306                                            

    $KornevOysters
          Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
    17170 117 108 150  90 117 116 146 120 211 213  67 146
    17171 118 152 122 201

17170 - неправильный формат даты

Итак, as.numeric(ymd("2017-01-04")) показывает нам 17170

Как получить выходные данные в правильном формате даты?я хочу вот так с обычным форматом даты

$Hornschickens
          Point Forecast    Lo 80    Hi 80     Lo 95    Hi 95
Dec 2017       223.8182 50.98365 396.6527 -40.50942 488.1458
Jan 2018       223.8182 50.98365 396.6527 -40.50942 488.1458

Так что я предполагаю, что 17170 в прогнозе означает 2017,17171 = 2018 Но любые проблемы с преобразованием в формат чтения

я вижу следующую логикувозможно сделать автоматическое преобразование этих числовых значений в даты

, где

1970-01-01 (Ymd) равно 0

1970-01-02 равно 1

"2018-12-25" равно 17890

, но при агрегировании по месяцам входные данные, как в моем примере

dec 17890, столь простое преобразование в декабрь 2018 приводит к 17890 в диапазонеДекабрь 2018 года.

1 Ответ

0 голосов
/ 25 декабря 2018

Параметр start в listed_ts не должен быть датой:

start --- время первого наблюдения.Либо одно число, либо вектор из двух целых чисел, которые задают натуральную единицу времени и количество отсчетов (на основе 1) в единицу времени.См. Примеры использования второй формы.

?ts.) Таким образом, вместо использования start = c(2017, 1) делает работу.

...