Статьи

Указание сложных групп временных рядов в HTS

В последней версии пакета hts для R теперь можно относительно легко указывать довольно сложные структуры группировки.

Все структуры агрегации могут быть представлены в виде иерархий или как перекрестные продукты иерархий. Например, иерархический временной ряд может быть основан на географии: страна, штат, регион, магазин. Часто существует также отдельная иерархия продуктов: группы продуктов, типы продуктов, размер пакета. Требуются прогнозы для всех различных типов агрегации; например, тип продукта A в области X. Структура агрегации является перекрестным продуктом двух иерархий.

Эта структура включает даже явно неиерархические данные: рассмотрим простой случай временного ряда смертей, разделенных по полу и состоянию. Мы можем рассматривать пол и государство как две очень простые иерархии, каждая из которых имеет только один уровень. Затем мы хотим предсказать совокупности всех комбинаций двух иерархий.

Таким образом можно объединить любое количество отдельных иерархий. Неиерархические факторы, такие как пол, могут рассматриваться как одноуровневые иерархии.

Пакет hts хранит данные только на нижнем (наиболее дезагрегированном) уровне и записывает информацию о различных типах агрегатов, которые представляют интерес. Функция hts () подходит для отдельной иерархии (т. Е. Строго иерархических данных). Более сложные структуры агрегации можно указать с помощью более общей функции gts ().

Вот пример, основанный на вопросе, заданном на stackoverflow . Проблема включает в себя географическую иерархию и иерархию промышленной классификации.

Предположим, что есть два штата с четырьмя и пятью округами соответственно, и две отрасли с тремя и двумя подотраслями соответственно. Таким образом, существует ряд 9×5 на самом дезагрегированном уровне (комбинации подотраслей и округов). Я назову штаты А и В, а также округа А1, А2, А3, А4 и В1, В2, В3, В4, В5. Я назову отрасли X и Y с подотраслями Xa, Xb, Xc и Ya, Yb соответственно. Предположим, у вас есть ряд нижнего уровня (самый дезагрегированный уровень) в матрице y, с одним столбцом на серию и столбцами в следующем порядке:

 County A1, industry Xa
 County A1, industry Xb
 County A1, industry Xc
 County A1, industry Ya
 County A1, industry Yb
 County A2, industry Xa
 County A2, industry Xb
 County A2, industry Xc
 County A2, industry Ya
 County A2, industry Yb
...
 County B5, industry Xa
 County B5, industry Xb
 County B5, industry Xc
 County B5, industry Ya
 County B5, industry Yb

Так что у нас есть воспроизводимый пример, я создам yслучайным образом:

y <- ts(matrix(rnorm(900),ncol=45,nrow=20))

Затем мы можем построить метки для столбцов этой матрицы следующим образом:

blnames <- paste(c(rep("A",20),rep("B",25)), # State
             rep(1:9,each=5),                # County
             rep(c("X","X","X","Y","Y"),9),  # Industry
             rep(c("a","b","c","a","b"),9),  # Sub-industry
             sep="")
colnames(y) <- blnames

Например, первая серия в матрице имеет название, "A1Xa"означающее штат А, округ 1, отрасль Х, подотрасль а.

Затем мы можем легко создать сгруппированный объект временного ряда, используя

gy <- gts(y, characters=list(c(1,1),c(1,1)))

Только ряды нижнего уровня содержатся в y. Вид charactersаргумента, какие скопления представляют интерес. В этом случае charactersаргумент указывает, что есть две иерархии (два элемента в списке), и первая иерархия указывается первыми двумя символами, а вторая иерархия указывается следующими двумя символами. Каждый уровень каждой иерархии указывается с использованием одного символа (отсюда 1).

Немного более сложный, но аналогичный пример (с метками, принимающими более одного символа каждая) приведен в файле справки для gtsv4.3 htsпакета.

Можно указать структуру группировки без использования меток столбцов. Затем вы должны указать матрицу групп, которая определяет, какие агрегаты представляют интерес. В приведенном выше примере матрица групп задается как

gps <- rbind(
  c(rep(1,20),rep(2,25)), # State
  rep(1:9,each=5),        # County
  rep(c(1,1,1,2,2),9),    # Industry
  rep(1:5, 9),            # Sub-industry
  c(rep(c(1,1,1,2,2),4),rep(c(3,3,3,4,4),5)), # State x industry
  c(rep(1:5, 4),rep(6:10, 5)),                # State x Sub-industry
  rep(1:18, rep(c(3,2),9))                    # County x industry
)

Порядок строк не имеет значения. В каждой строке указывается совокупность ряда нижнего уровня, который представляет интерес.

потом

gy <- gts(y, groups=gps)

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

Как только gtsобъект был создан с помощью gts()функции, вы можете перейти к прогнозу. Например

fc <- forecast(gy)

будет генерировать прогнозы для всех рядов нижнего уровня и всех совокупных рядов, указанных в обращении к gts(). Затем он будет согласовывать прогнозы до тех пор, пока они не будут суммированы для всех указанных агрегаций, и, наконец, вернет только согласованный ряд нижнего уровня. Примиренные агрегированные ряды могут быть легко построены из них, когда они необходимы.