You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:15:27