R语言:构建适配hts()函数的多变量时间序列矩阵
没问题,我来帮你搞定这个分层时间序列(hts)的构建~ 我们需要把你的长格式数据框转换成包含**根节点(所有类别总和)和叶节点(各分类单独序列)**的多变量时间序列,具体实现步骤如下:
完整代码实现
首先确保你已经安装并加载了所需的包:
# 安装依赖包(如果未安装) install.packages(c("hts", "tidyr")) library(hts) library(tidyr)
先定义你提供的原始数据框:
telar <- data.frame( class = c("A","B","A","B"), date = as.Date(c("2019-01-01", "2019-01-01", "2019-02-01", "2019-02-01")), number = c(10, 20, 11, 21) )
步骤1:转换为宽格式数据
把长格式数据转成「日期为行、每个类别为列」的宽格式,方便后续生成时间序列:
wide_telar <- pivot_wider(telar, names_from = class, values_from = number)
步骤2:生成叶节点时间序列
将宽格式的分类数据转换为时间序列对象(这里是月度数据,频率设为12):
# 生成A、B两个类别的叶节点时间序列 leaf_ts <- ts(wide_telar[, c("A", "B")], start = c(2019, 1), frequency = 12)
步骤3:生成根节点时间序列
根节点是每个时间点所有类别的数值总和:
# 计算根节点的总和序列 root_ts <- rowSums(leaf_ts)
步骤4:组合成多变量时间序列矩阵
把根节点和叶节点的序列组合成hts函数需要的输入矩阵:
# 组合根节点(命名为Root)和叶节点 new_time_series_matrix <- cbind(Root = root_ts, leaf_ts)
步骤5:创建hts对象
按照你的代码框架定义节点结构,最终生成分层时间序列对象:
# 节点结构:根节点下包含2个叶节点(对应A、B类别) nodes <- list(length(unique(telar$class))) # 构建hts对象 my_hts <- hts(new_time_series_matrix, nodes = nodes)
验证结果
你可以用以下代码查看hts对象的结构和可视化效果:
# 查看hts对象的摘要信息 summary(my_hts) # 绘制分层时间序列图 plot(my_hts)
如果你不想使用tidyr包,也可以用基础R的reshape函数转换宽格式:
# 基础R方法转换宽格式 wide_telar_base <- reshape(telar, idvar = "date", timevar = "class", direction = "wide") colnames(wide_telar_base) <- c("date", "A", "B") # 重命名列,去掉默认前缀
后续步骤和上面完全一致即可。
内容的提问来源于stack exchange,提问作者Daniel Díez
相关产品推荐
相关产品推荐

