fable パッケージを使用して、階層的な時系列のセットに関する予測を取得しています。すべてのノードで同じ深さを持たない階層を指定したいと思います。
現実的な例:
- 時系列 B1 と B2 は、時系列 M1 に合計されます。
- 時系列 M1 と M2 は、階層の最上位にある時系列 T に合計されます。
- 時系列 M2 は一連の時系列の合計ではありません。それはそれ自身の時系列です。
tsibble
次の形式で小さなランダム データ セットを作成します。
library(dplyr)
library(tsibble)
library(fable)
set.seed(1)
B1 <- rnorm(12, mean = 5) + (1:12)
B2 <- rnorm(12, mean = 5)
M2 <- rnorm(12, mean = 25)
ts_data <- tibble(value = c(B1, B2, M2),
month = rep(yearmonth(paste("2020", 1:12, sep="-")), 3),
B = c(rep("B1", 12), rep("B2", 12), rep("B3", 12)),
M = c(rep("M1", 24), rep("M2", 12))) %>%
as_tsibble(key = c("B", "M"), index = month)
3 つの時系列のそれぞれについて個別の ARIMA モデルを推定し、集計および予測します。
fcsts <- ts_data %>%
# Specify hierarchy
aggregate_key(M / B, value = sum(value)) %>%
# Fit models
model(arima = ARIMA(value)) %>%
# Set up reconciliation
mutate(mint = min_trace(arima)) %>%
# Produce the forecasts
forecast(h = 1)
結果が間違っているのではないかと心配する理由は、実際の集計がなくても、調整によって信頼区間が小さくなるという病的な例を作成できるからです。
病理学的例:
- 時系列 B3 は、T の子である M2 の子です。
前のデータセットをサブセット化して、この例のデータセットを作成します。
ts_data_2 <- ts_data %>%
filter(B == "B3")
別々の ARIMA モデルを再び推定し、集計して予測します。
fcsts_2 <- ts_data_2 %>%
# Specify hierarchy
aggregate_key(M / B, value = sum(value)) %>%
# Fit models
model(arima = ARIMA(value)) %>%
# Set up reconciliation
mutate(mint = min_trace(arima)) %>%
# Produce the forecasts
forecast(h = 6)
結果は次のとおりです。
> fcsts_2
# A fable: 6 x 6 [1M]
# Key: M, B, .model [6]
M B .model month value .distribution
<chr> <chr> <chr> <mth> <dbl> <dist>
1 M2 B3 arima 2021 Jan 24.9 N(25, 0.63)
2 M2 <aggregated> arima 2021 Jan 24.9 N(25, 0.63)
3 <aggregated> <aggregated> arima 2021 Jan 24.9 N(25, 0.63)
4 M2 B3 mint 2021 Jan 24.9 N(25, 0.21)
5 M2 <aggregated> mint 2021 Jan 24.9 N(25, 0.21)
6 <aggregated> <aggregated> mint 2021 Jan 24.9 N(25, 0.21)
実際の集計がない場合でも、分散は元の ARIMA モデルの 0.63 から 0.21 に減少します。もちろん、これは照合をまったく使用すべきではない例ですが、ここで分散が減少するという事実は、実際の例では照合が正しく機能しないことを心配させます。
B3 から M2 までの集約を避けるために、現実的な例でモデルを指定する方法はありますか? (B列のレベル「B3」の代わりにNAを使ってみましたが、うまくいきません。)