Включение внешнего регрессора в иерархический/сгруппированный временной ряд

Товарищи,

Я работал с иерархическими временными рядами, относящимися к набору идентичных товаров в нескольких магазинах. Для этой цели, когда мы агрегируем набор данных на основе двух атрибутов, таких как «магазин» и «тип_продукта» в моем случае, мы должны затем агрегировать целевую переменную, которая является «спросом» для каждого отдельного продукта для каждой группы или иерархии. Что я хотел бы сделать, так это добавить еще одну категориальную переменную в мою модель, скажем, «Динамическая гармоническая регрессия», поскольку я использую еженедельные временные ряды. Однако я не знаю, как мне включить его, если моя внешняя переменная является категориальной переменной с 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

Заранее большое спасибо.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
94
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Столбец внешнего регрессора (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)

Большое спасибо, дорогой Митчелл, за ответ. Я понимаю, как агрегировать категориальную переменную здесь было основным вопросом, поэтому я не добавил ее сюда. Значит ли это, что внешняя переменная должна быть непрерывной, чтобы быть полезной в данном случае?

Anoushiravan R 08.05.2022 19:34

Просто еще один вопрос для меня, чтобы понять это. Основываясь на store * product_type и моих еженедельных временных рядах, каждое агрегирование рассчитывается для каждой комбинации ТИП ПРОДУКТА - МАГАЗИН за НЕДЕЛЮ, я прав?

Anoushiravan R 08.05.2022 19:37

Да, ваша временная переменная не изменилась в этой агрегации. store * product_type будет рассматривать агрегаты по сумме, по store, по product_type и по взаимодействию store и product_type (ваши текущие данные). Вам нужно подумать о том, какой должна быть ваша категориальная переменная, если она агрегирована (возможно, NA и используется только на нижнем уровне?).

Mitchell O'Hara-Wild 10.05.2022 02:17

Большое спасибо за ваше объяснение. Мы все многим обязаны вам и доктору Хайндману за все ваши усилия и материалы. Моя категориальная переменная NA для большинства продуктов означает, что она не существует. Поэтому я подумал, что могу преобразовать его в бинарный способ, если существует какая-либо категория для набора продуктов на определенной неделе или нет. С этим предположением я получил более низкие RMSE и MASE по сравнению с исключением внешней переменной. Так что я думаю, что это может быть законным.

Anoushiravan R 10.05.2022 20:13

Но все равно получаю эту ошибку Provided exogenous regressors are rank deficient, removing regressors: Promotion_AggYes``. Я читал в сообществе rstudio, что доктор Хайндман упомянул, что это могло быть связано с тем, что внешний регрессор должен был быть константой.

Anoushiravan R 10.05.2022 23:04

Без данных трудно определить, почему регрессоры имеют недостаточный ранг. Однако есть вероятность, что некоторые из ваших моделей имеют Promotion_AggYes одинаковое значение (например, NA). Если это так, то эти переменные не следует включать в модель для этих рядов.

Mitchell O'Hara-Wild 11.05.2022 01:24

Большое спасибо еще раз. Мне хотелось бы что-нибудь с этим сделать, потому что это относится к моей диссертации, и я надеялся представить хотя бы что-то надежное о включении внешнего регрессора. Моя внешняя переменная имеет почти 15 уровней плюс NULL, но я рассматривал все эти уровни как 1 и NULL как 0 таким образом, чтобы это означало, произошло событие или нет. Но в совокупности я подумал, что суммирую их, и если это выше 1, я считаю, что это 1 означает, что произошло событие любого типа, иначе 0. Вот почему он может стать недостаточным по рангу здесь.

Anoushiravan R 11.05.2022 18:57

Тем не менее, я могу наблюдать небольшое улучшение, как есть.

Anoushiravan R 11.05.2022 18:58

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