如何按时间序列聚合数据并构建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
相关产品推荐
相关产品推荐

