# \donttest{
library(bayesRecon)
if (requireNamespace("forecast", quietly = TRUE)) {
set.seed(1234)
n_obs <- 100
# Simulate 2 bottom series from AR(1) processes
y1 <- arima.sim(model = list(ar = 0.8), n = n_obs)
y2 <- arima.sim(model = list(ar = 0.5), n = n_obs)
y_upper <- y1 + y2 # upper series is the sum of the two bottoms
A <- matrix(c(1, 1), nrow = 1) # Aggregation matrix
# Fit additive ETS models
fit1 <- forecast::ets(y1, additive.only = TRUE)
fit2 <- forecast::ets(y2, additive.only = TRUE)
fit_upper <- forecast::ets(y_upper, additive.only = TRUE)
# Point forecasts (h = 1)
fc_upper <- as.numeric(forecast::forecast(fit_upper, h = 1)$mean)
fc1 <- as.numeric(forecast::forecast(fit1, h = 1)$mean)
fc2 <- as.numeric(forecast::forecast(fit2, h = 1)$mean)
base_fc_mean <- c(fc_upper, fc1, fc2)
# Residuals and training data (n_obs x n matrices, columns in same order as base_fc_mean)
res <- cbind(residuals(fit_upper), residuals(fit1), residuals(fit2))
y_train <- cbind(y_upper, y1, y2)
# --- 1) Generate joint reconciled samples ---
result <- reconc_t(A, base_fc_mean, y_train = y_train, residuals = res)
# Sample from the reconciled bottom-level t-distribution
n_samples <- 2000
L_chol <- t(chol(result$bottom_rec_scale_matrix))
z <- matrix(rt(ncol(A) * n_samples, df = result$bottom_rec_df), nrow = ncol(A))
bottom_samples <- result$bottom_rec_mean + L_chol %*% z # 2 x n_samples
# Aggregate bottom samples to get upper samples
upper_samples <- A %*% bottom_samples
joint_samples <- rbind(upper_samples, bottom_samples)
rownames(joint_samples) <- c("upper", "bottom_1", "bottom_2")
cat("Reconciled means (from samples):\n")
print(round(rowMeans(joint_samples), 3))
cat("Reconciled standard deviations (from samples):\n")
print(round(apply(joint_samples, 1, sd), 3))
# --- 2) 95% prediction intervals via t-distribution quantiles ---
result2 <- reconc_t(A, base_fc_mean, y_train = y_train,
residuals = res, return_upper = TRUE)
alpha <- 0.05
# Bottom series intervals
for (i in seq_len(ncol(A))) {
s_i <- sqrt(result2$bottom_rec_scale_matrix[i, i])
lo <- result2$bottom_rec_mean[i] + s_i * qt(alpha / 2, df = result2$bottom_rec_df)
hi <- result2$bottom_rec_mean[i] + s_i * qt(1 - alpha / 2, df = result2$bottom_rec_df)
cat(sprintf("Bottom %d: 95%% PI = [%.3f, %.3f]\n", i, lo, hi))
}
# Upper series interval
s_u <- sqrt(result2$upper_rec_scale_matrix[1, 1])
lo <- result2$upper_rec_mean[1] + s_u * qt(alpha / 2, df = result2$upper_rec_df)
hi <- result2$upper_rec_mean[1] + s_u * qt(1 - alpha / 2, df = result2$upper_rec_df)
cat(sprintf("Upper: 95%% PI = [%.3f, %.3f]\n", lo, hi))
}
# }
Run the code above in your browser using DataLab