Товарищи,
Я работал с иерархическими временными рядами, относящимися к набору идентичных товаров в нескольких магазинах. Для этой цели, когда мы агрегируем набор данных на основе двух атрибутов, таких как «магазин» и «тип_продукта» в моем случае, мы должны затем агрегировать целевую переменную, которая является «спросом» для каждого отдельного продукта для каждой группы или иерархии. Что я хотел бы сделать, так это добавить еще одну категориальную переменную в мою модель, скажем, «Динамическая гармоническая регрессия», поскольку я использую еженедельные временные ряды. Однако я не знаю, как мне включить его, если моя внешняя переменная является категориальной переменной с 4 уровнями. Я хотел бы знать, как я могу агрегировать это или есть ли что-нибудь, что я могу с этим поделать. Здесь вы можете найти небольшой воспроизводимый пример:
library(tidyverse)
library(tsibble)
library(tsibbledata)
library(fable)
library(fabletools)
library(fpp3)
library(readxl)
library(fable.prophet)
library(feasts)
store <- c(rep('st1', 8), rep('st2', 8))
product_type <- c(rep('type1', 4), rep('type2', 4), rep('type1', 4), rep('type2', 4))
products <- c(rep('A', 2), rep('B', 2), rep('C', 2), rep('D', 2),
rep('A', 2), rep('B', 2), rep('C', 2), rep('D', 2))
demands <- c(round(sample(c(1:100), 16, replace = TRUE)))
external_reg <- c(sample(c('red', 'green', 'blue'), 16, replace = TRUE))
date_week <- rep(1:4, 4)
date_year <- rep(2019:2022, 4)
my_data <- tibble(date_year, date_week, store, product_type, products, demands, external_reg)
my_data %>%
mutate(Date = ymd(paste0(date_year, "-01-01")) + weeks(date_week - 1)) %>%
mutate(Week = yearweek(Date)) %>%
as_tsibble(key = c(store, product_type), index = Week) %>%
aggregate_key(store * product_type, Demand_Agg = sum(demands))
Очевидно, что внешний регерессор должен быть столбцом в моем tsibble
:
# A tsibble: 36 x 4 [53W]
# Key: store, product_type [9]
Week store product_type Demand_Agg
<week> <chr*> <chr*> <dbl>
1 2019 W01 <aggregated> <aggregated> 188
2 2020 W02 <aggregated> <aggregated> 142
3 2021 W02 <aggregated> <aggregated> 259
4 2022 W03 <aggregated> <aggregated> 186
5 2019 W01 st1 <aggregated> 89
6 2019 W01 st2 <aggregated> 99
7 2020 W02 st1 <aggregated> 52
8 2020 W02 st2 <aggregated> 90
9 2021 W02 st1 <aggregated> 95
10 2021 W02 st2 <aggregated> 164
# … with 26 more rows
Заранее большое спасибо.
Столбец внешнего регрессора (external_reg
) был удален из вашего вывода, потому что вы не указали, как его следует агрегировать. Учитывая, что это дискретная переменная, может быть сложно агрегировать данные таким образом, чтобы сохранить эту информацию. Как вы решите агрегировать это, зависит от вас и может зависеть от модели, которую вы хотите использовать. Если у вас есть непрерывная переменная, такая как температура, вы можете вычислить среднюю температуру.
Например, если вы хотите сохранить первое значение external_reg
, вы должны агрегировать его с aggregate_key(<tsibble>, store * product_type, Demand_Agg = sum(demands), external_reg = first(external_reg))
library(dplyr)
library(fable)
library(tsibble)
library(lubridate)
my_data <- structure(list(date_year = c(2019L, 2020L, 2021L, 2022L, 2019L,
2020L, 2021L, 2022L, 2019L, 2020L, 2021L, 2022L, 2019L, 2020L,
2021L, 2022L), date_week = c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L,
1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), store = c("st1", "st1", "st1",
"st1", "st1", "st1", "st1", "st1", "st2", "st2", "st2", "st2",
"st2", "st2", "st2", "st2"), product_type = c("type1", "type1",
"type1", "type1", "type2", "type2", "type2", "type2", "type1",
"type1", "type1", "type1", "type2", "type2", "type2", "type2"
), products = c("A", "A", "B", "B", "C", "C", "D", "D", "A",
"A", "B", "B", "C", "C", "D", "D"), demands = c(45, 12, 70, 66,
77, 6, 27, 52, 8, 73, 70, 27, 84, 100, 79, 51), external_reg = c("blue",
"green", "red", "blue", "green", "blue", "red", "green", "blue",
"blue", "green", "green", "red", "green", "blue", "green")), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -16L))
my_data %>%
mutate(Date = ymd(paste0(date_year, "-01-01")) + weeks(date_week - 1)) %>%
mutate(Week = yearweek(Date)) %>%
as_tsibble(key = c(store, product_type), index = Week) %>%
aggregate_key(store * product_type, Demand_Agg = sum(demands), external_reg = first(external_reg))
#> # A tsibble: 36 x 5 [53W]
#> # Key: store, product_type [9]
#> Week store product_type Demand_Agg external_reg
#> <week> <chr*> <chr*> <dbl> <chr>
#> 1 2019 W01 <aggregated> <aggregated> 214 blue
#> 2 2020 W02 <aggregated> <aggregated> 191 green
#> 3 2021 W02 <aggregated> <aggregated> 246 red
#> 4 2022 W03 <aggregated> <aggregated> 196 blue
#> 5 2019 W01 st1 <aggregated> 122 blue
#> 6 2019 W01 st2 <aggregated> 92 blue
#> 7 2020 W02 st1 <aggregated> 18 green
#> 8 2020 W02 st2 <aggregated> 173 blue
#> 9 2021 W02 st1 <aggregated> 97 red
#> 10 2021 W02 st2 <aggregated> 149 green
#> # … with 26 more rows
Created on 2022-05-08 by the reprex package (v2.0.1)
Просто еще один вопрос для меня, чтобы понять это. Основываясь на store * product_type
и моих еженедельных временных рядах, каждое агрегирование рассчитывается для каждой комбинации ТИП ПРОДУКТА - МАГАЗИН за НЕДЕЛЮ, я прав?
Да, ваша временная переменная не изменилась в этой агрегации. store * product_type
будет рассматривать агрегаты по сумме, по store
, по product_type
и по взаимодействию store
и product_type
(ваши текущие данные). Вам нужно подумать о том, какой должна быть ваша категориальная переменная, если она агрегирована (возможно, NA и используется только на нижнем уровне?).
Большое спасибо за ваше объяснение. Мы все многим обязаны вам и доктору Хайндману за все ваши усилия и материалы. Моя категориальная переменная NA
для большинства продуктов означает, что она не существует. Поэтому я подумал, что могу преобразовать его в бинарный способ, если существует какая-либо категория для набора продуктов на определенной неделе или нет. С этим предположением я получил более низкие RMSE и MASE по сравнению с исключением внешней переменной. Так что я думаю, что это может быть законным.
Но все равно получаю эту ошибку Provided exogenous regressors are rank deficient, removing regressors:
Promotion_AggYes``. Я читал в сообществе rstudio, что доктор Хайндман упомянул, что это могло быть связано с тем, что внешний регрессор должен был быть константой.
Без данных трудно определить, почему регрессоры имеют недостаточный ранг. Однако есть вероятность, что некоторые из ваших моделей имеют Promotion_AggYes
одинаковое значение (например, NA). Если это так, то эти переменные не следует включать в модель для этих рядов.
Большое спасибо еще раз. Мне хотелось бы что-нибудь с этим сделать, потому что это относится к моей диссертации, и я надеялся представить хотя бы что-то надежное о включении внешнего регрессора. Моя внешняя переменная имеет почти 15 уровней плюс NULL
, но я рассматривал все эти уровни как 1
и NULL
как 0
таким образом, чтобы это означало, произошло событие или нет. Но в совокупности я подумал, что суммирую их, и если это выше 1
, я считаю, что это 1
означает, что произошло событие любого типа, иначе 0
. Вот почему он может стать недостаточным по рангу здесь.
Тем не менее, я могу наблюдать небольшое улучшение, как есть.
Большое спасибо, дорогой Митчелл, за ответ. Я понимаю, как агрегировать категориальную переменную здесь было основным вопросом, поэтому я не добавил ее сюда. Значит ли это, что внешняя переменная должна быть непрерывной, чтобы быть полезной в данном случае?