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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:10:17