【问题标题】:Hclust object from Factorminer does not cluster dendrogram in PheatmapFactorminer 的 Hclust 对象不会在 Pheatmap 中聚类树状图
【发布时间】:2020-07-18 18:41:42
【问题描述】:

交叉发布:https://www.biostars.org/p/450365/

我正在尝试使用pheatmap::pheatmap 创建一个包含 20 行和 10 列的矩阵的热图。为了对列进行聚类,我使用了在输入矩阵上运行 FactoMineR::HCPC 后获得的 hclust 对象。但是,当我使用 hclust 对象时,

这是我的代码:

library(tidyverse)
library(pheatmap)
library(FactoMineR)

# reproducible df of 20 rows and 10 columns
set.seed(100)
tmp <- matrix(rnorm(10000), nrow = 20, ncol = 10)
tmp <- as.data.frame(tmp)
colnames(tmp) <- paste0('col_', seq(1:ncol(tmp)))
rownames(tmp) <- paste0('row_', seq(1:nrow(tmp)))

# use FactoMineR HCPC for clustering data
res.pcahcpc <- FactoMineR::PCA(X = t(tmp), graph = F)
res.pcahcpc <- FactoMineR::HCPC(res.pcahcpc, nb.clust = 4, graph = F)

# get hclust object from FactoMineR::HCPC
pcahcpc.tree <- res.pcahcpc$call$t$tree

# hclust object
> pcahcpc.tree

Call:
flashClust::hclust(d = dissi, method = method, members = weight)

Cluster method   : ward 
Distance         : euclidean 
Number of objects: 10 

# get cluster information for heatmap annotation
res.pcahcpc <- res.pcahcpc$data.clust # clusters
colnames(res.pcahcpc)[ncol(res.pcahcpc)] <- "PCA_HCPC"
res.pcahcpc <- res.pcahcpc[,'PCA_HCPC', drop = F]

# clusters
> head(res.pcahcpc)
      PCA_HCPC
col_1        1
col_2        1
col_3        4
col_4        2
col_5        3
col_6        1

# create heatmap using PCA HCPC clustering
tmp %>%
  pheatmap(cellwidth = 15, cellheight = 15,
           annotation_col = res.pcahcpc,
           cluster_cols = pcahcpc.tree)

运行上面的代码给了我下面的热图,这很奇怪,因为它根本没有通过 FactorMiner PCA HCPC 对列进行聚类。有人能解释一下为什么吗?

【问题讨论】:

  • 图顶部的树状图似乎聚集了列,我错了吗?
  • @carlo_sguera 如果您查看相应的 PCA_HCPC 注释,它看起来不像根据 PCA_HCPC 树进行聚类。如果是这样,它应该显示组合在一起的颜色。
  • 现在我明白你的意思了。在res.pcahcpc &lt;- FactoMineR::HCPC(res.pcahcpc, nb.clust = 4, graph = F) 之后,plot(res.pcahcpc, choice = "tree") 就可以了。但是,它与pheatmap 的交互很奇怪,你是对的。我对pheatmap不熟悉,希望你能找到解决办法,祝你好运!

标签: r hclust pheatmap


【解决方案1】:

要得到正确的树状图,首先需要根据pcahcpc.tree$labels中给出的信息对tmp的列重新排序。

idx <- as.numeric(gsub("col_","", pcahcpc.tree$labels))
pheatmap(tmp[, idx], cellwidth=15, cellheight=12,
         annotation_col = res.pcahcpc,
         cluster_cols = pcahcpc.tree)

pheatmap 列的树状图现在与stats:::plot.hclust 给出的树状图相同

plot(pcahcpc.tree)

【讨论】:

  • 如果我将输入矩阵更改为这样,这将不起作用:set.seed(100) tmp &lt;- matrix(rnorm(11500), nrow = 115, ncol = 10)
  • 我在另一个数据集上使用此代码,但它不起作用,有什么方法可以与您分享吗?
  • 我在这里上传了输入数据和 R 脚本:drive.google.com/drive/folders/… 在脚本的最后,我正在创建一个热图,它似乎没有聚类。
  • 我看到您正在使用 cuttree 切割树,但是为什么 res.pcahcpc$call$X$clustres.pcahcpc$data.clust 有 106、1、7、1 而 cuttree 方法分配的是 107、1、6 , 1 到四个集群?
  • @KomalRathi 这是一个很好的问题。您需要更好地理解HCPC 的输出。也许你在这个函数中发现了一个错误。
猜你喜欢
  • 2015-11-05
  • 2011-01-19
  • 2020-06-20
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 2017-09-22
相关资源
最近更新 更多