基于HICP数据的Complete Linkage层次聚类树状图绘制及聚类划分求助
解决HICP数据层次聚类树状图问题
问题根源
你直接用原始长格式数据计算相异矩阵,导致dist()把每个时间点的观测当作样本,而非以国家为样本、时间序列为特征。这完全偏离了“按HICP趋势聚类国家”的目标,自然生成的树状图不符合预期。
解决步骤
1. 数据预处理:转换为宽格式
首先需要把长格式数据转换为宽格式,让每个国家作为一行,每个时间点的HICP数值作为列(即特征)。# 加载必要的包 library(tidyverse) # 假设你的原始数据框名为CP00 # 转换为宽格式:国家为行,时间为列,values为单元格值 CP00_wide <- CP00 %>% pivot_wider( id_cols = country, names_from = time, values_from = values ) %>% column_to_rownames(var = "country") # 将国家名设为行名,方便后续聚类 # 处理缺失值(如果有),这里用均值填充,也可以根据需求选择其他方法 CP00_wide <- CP00_wide %>% mutate(across(everything(), ~ ifelse(is.na(.), mean(., na.rm = TRUE), .)))2. 计算相异矩阵
现在用宽格式的数值矩阵计算国家间的相异度,这里推荐用欧氏距离(时间序列聚类常用),如果你坚持用Minkowski距离也可以保留:# 计算相异矩阵:仅对数值列计算,排除行名(此时行名是国家) CP00_dist <- dist(CP00_wide, method = "euclidean") # 替换为method = "minkowski", p = 1.5可保留你的原方法3. 层次聚类与树状图绘制
使用完全连接法聚类,然后绘制清晰的树状图,同时划分4个聚类:# 完全连接层次聚类 CP00_hclust <- hclust(CP00_dist, method = "complete") # 绘制树状图,优化可读性 plot( CP00_hclust, main = "基于HICP的国家聚类(完全连接法)", xlab = "", ylab = "相异度", cex = 0.8, # 调整标签字体大小 hang = -1 # 让标签对齐底部 ) # 用红色虚线标出4个聚类的划分线 rect.hclust(CP00_hclust, k = 4, border = "red") # 获取每个国家的聚类归属 cluster_assignments <- cutree(CP00_hclust, k = 4) print(cluster_assignments)
额外优化建议
- 如果时间序列长度很长,可以先对每个国家的HICP序列提取特征(如均值、标准差、趋势斜率),再用这些特征聚类,减少维度同时保留核心信息。
- 树状图标签重叠时,可以用
dendextend包旋转树状图或调整布局:library(dendextend) dend <- as.dendrogram(CP00_hclust) dend <- rotate(dend, order = order.dendrogram(dend)) plot(dend, main = "优化布局的聚类树状图") rect.dendrogram(dend, k = 4, border = "red")
内容的提问来源于stack exchange,提问作者JJ_Zero
相关产品推荐
相关产品推荐

