如何在aheatmap中基于已有相似性矩阵进行层次聚类并搭配热图?
解决aheatmap基于相似性矩阵聚类的问题
我明白你的困扰——aheatmap(来自NMF包)默认会对输入矩阵的行/列计算距离来做层次聚类,但你已经有了现成的相似性矩阵,想要直接基于这个矩阵的数值来聚类样本,同时和热图联动展示。下面是具体的解决步骤:
核心逻辑
层次聚类算法(比如hclust)本质依赖距离矩阵(值越大表示样本越不相似),而你的相似性矩阵是反向的(值越大表示越相似)。所以我们需要先把相似性矩阵转换成符合聚类要求的距离矩阵,再手动生成聚类树,最后传给aheatmap指定聚类规则。
具体实现代码
假设你已经有了对称的相似性矩阵sim_mat(行和列都是样本,矩阵值是样本间的相似性):
# 加载依赖包 library(NMF) library(stats) # 1. 将相似性矩阵转换为距离矩阵 # 注意:这里的转换方式要匹配你的相似性取值范围 # - 如果相似性是0~1范围(比如余弦相似性): dist_mat <- as.dist(1 - sim_mat) # - 如果相似性是-1~1范围(比如皮尔逊相关系数): # dist_mat <- as.dist((1 - sim_mat)/2) # 2. 基于自定义距离矩阵生成层次聚类树 # 聚类方法可以根据需求选择:ward.D2、complete、average等 hc <- hclust(dist_mat, method = "ward.D2") # 3. 绘制热图并指定自定义聚类树 aheatmap( sim_mat, # 你的相似性矩阵,作为热图展示内容 Rowv = hc, # 指定行聚类使用我们生成的树 Colv = hc, # 因为是对称矩阵,列聚类和行一致,也可以设为NA或其他 scale = "none", # 相似性矩阵不需要缩放 main = "Similarity Matrix with Custom Hierarchical Clustering", color = colorRampPalette(c("white", "blue", "darkblue"))(100) # 自定义热图颜色,可选 )
关键细节说明
Rowv和Colv参数:这两个参数接受预先生成的聚类树(hclust对象),这样aheatmap就不会再自动计算行/列的距离,而是直接使用你提供的聚类结果。- 距离转换的合理性:转换后的矩阵必须满足距离的基本性质(非负、对称、自距离为0),上面的两种转换方式都符合这个要求,能保证相似性越高的样本,在距离矩阵中值越小,聚类时会被优先合并。
- 如果你的相似性矩阵取值范围特殊,可以调整转换公式,只要保证“相似→距离近”的逻辑即可。
这样就能实现基于你原有相似性矩阵的聚类,同时和热图完美联动展示了。
内容的提问来源于stack exchange,提问作者Keshav M
相关产品推荐
相关产品推荐

