在R的hts包中,如何用MinT调和非标准模型的层级预测
用hts包处理自定义预测的交叉分组调和(MinT方法)
步骤1:整理预测数据为标准ts对象
先确保预测数据是正确的时间序列对象,指定起始年份和频率(示例为年度数据,频率设为1):
library(hts) # 你的示例数据 forecasts <- rbind(c(1,1,1,1,2,3,3,4,6), c(1,1,2,1,3,4,3,2,7), c(0,1,0,1,3,2,2,3,6)) rownames(forecasts) <- c("2010","2011","2012") colnames(forecasts) <- c("uk_internal","eu_internal","uk_external","eu_external", "uk_total","eu_total","total_external","total_internal", "total_total") # 转换为ts对象,起始2010,年度频率 forecasts_ts <- ts(forecasts, start = 2010, frequency = 1)
步骤2:提取底层序列并定义分组结构
你的数据是交叉分组时间序列(维度:地区UK/EU、类型Internal/External),先提取4个最细粒度的底层序列,再定义分组维度:
# 提取底层序列 bottom_ts <- forecasts_ts[, c("uk_internal","eu_internal","uk_external","eu_external")] # 定义分组结构:每行对应一个底层序列的分组归属 # 第一列是地区(1=UK, 2=EU),第二列是类型(1=Internal, 2=External) groups_matrix <- matrix(c(1,1,2,2, 1,2,1,2), nrow = 4, byrow = FALSE) # 也可以用更直观的因子形式 groups_df <- data.frame(Region = rep(c("UK", "EU"), each=2), Type = rep(c("Internal", "External"), 2))
步骤3:构造gts对象并匹配预测列顺序
初始gts对象会自动生成所有聚合层级,需要将你已有的预测结果按gts的层级顺序对齐:
# 构造初始gts对象 my_gts <- gts(bottom_ts, groups = groups_matrix) # 查看gts的层级标签顺序,用于匹配预测列 labels(my_gts) # 输出:"UK-Internal" "EU-Internal" "UK-External" "EU-External" "UK" "EU" "Internal" "External" "Total" # 调整预测列顺序,匹配gts的标签顺序 forecasts_ordered <- forecasts_ts[, c("uk_internal","eu_internal","uk_external","eu_external", "uk_total","eu_total","total_internal","total_external", "total_total")] # 将对齐后的预测结果赋值给gts对象的forecasts属性 my_gts$forecasts <- forecasts_ordered
步骤4:用MinT方法调和预测
直接调用MinT()函数进行调和,支持OLS、WLS等多种方法:
# 使用OLS方法调和(默认) reconciled_forecasts <- MinT(my_gts, method = "ols") # 查看调和后的所有层级预测 forecast(reconciled_forecasts)
关键注意事项
- 尽量保证聚合预测逻辑自洽(比如
uk_total应等于uk_internal + uk_external),即使存在不一致,MinT也会自动修正。 - 如果是多步滚动预测,只需保证ts对象的行数对应预测期数即可。
- 分组结构的定义必须准确,否则gts无法正确识别聚合层级关系。
内容的提问来源于stack exchange,提问作者user456583
相关产品推荐
相关产品推荐

