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

如何按时间序列聚合数据并构建27×27矩阵绘制树状图?

基于时间序列数据构建国家聚类树状图

问题背景

需要基于欧盟通胀率时间序列数据绘制树状图,要求构建27×27的国家间距离矩阵,仅使用R标准包、dplyr和ggplot2。此前用均值聚合数据生成的树状图不符合预期,需找到基于时间序列本身的聚类方法。

修正后的代码实现

library("eurostat")
library("ggplot2")
library("dplyr")

# 获取并过滤通胀率数据(CP00代表整体通胀)
d <- get_eurostat("prc_hicp_manr") %>%
  filter(coicop == "CP00")

# 转换为带标签的数据,并过滤时间范围和目标国家(修正拼写错误:Chechia → Czechia)
d2 <- label_eurostat(d) %>%
  filter(time %in% as.Date("2000-02-01"):as.Date("2022-09-30"), 
         geo %in% c("Austria", "Belgium", "Bulgaria", "Croatia", "Cyprus", "Czechia", "Denmark", "Estonia", "Finland", "France", "Germany", "Greece", "Hungary",
                    "Ireland", "Italy", "Latvia", "Lithuania", "Luxembourg", "Malta", "Netherlands", "Poland", "Portugal", "Romania", "Slovakia", "Slovenia", 
                    "Spain", "Sweden"))

# 将数据转换为宽格式:每行对应一个国家,每列对应一个时间点的通胀值
# 使用R标准包reshape函数(避免依赖tidyr)
d_wide <- reshape(d2[, c("geo", "time", "values")],
                  idvar = "geo",
                  timevar = "time",
                  direction = "wide")
# 设置国家名为行名,移除冗余列
rownames(d_wide) <- d_wide$geo
d_wide <- d_wide[, -1]

# 计算国家间的时间序列距离(使用指定的minkowski距离,p=1.5)
dist_matrix <- dist(d_wide, method = "minkowski", p = 1.5)

# 进行层次聚类(使用complete linkage)
hc_clust <- hclust(dist_matrix, method = "complete")

# 绘制树状图(基础绘图)
plot(as.dendrogram(hc_clust), main = "欧盟国家通胀时间序列聚类树状图")

关键说明

  • 数据格式转换:核心是将长格式的时间序列数据转为宽格式,让每个国家的完整时间序列作为一个向量,这样计算的距离是基于时间序列的整体相似性,而非单一均值的差异,这是匹配目标树状图的关键。
  • 距离计算:使用dist()函数对宽格式数据计算国家间的距离,这里采用了你指定的minkowski距离(p=1.5),也可根据需求尝试欧氏距离、曼哈顿距离等其他方法。
  • 聚类方法:当前使用complete linkage聚类方式,若目标树状图的聚类逻辑不同,可尝试method="ward.D2"、"average"等其他聚类方法。

内容的提问来源于stack exchange,提问作者Ola

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:15:34