我有这个数据集:
> dput(mdata2)
structure(list(EE = c(3.3221428469822, 3.62699732299098, 1.75430154205983,
0.809228977410138, 1.24117055233438, 2.93403148663873, 4.01630566539058,
1.5334176884274, 0.598331636908125, 0.793972781447563), MI = c(3.20812756072619,
3.73729312689288, 2.32268411219261, 1.16578395871478, 2.02899881030574,
2.43723772029964, 3.98855299963887, 1.76088057576795, 0.684310806612439,
1.512739619069), PI = c(2.97858874003521, 3.77000551572515, 2.82873533944253,
2.17460752133963, 2.81526651451227, 2.31001492452861, 4.0325069645006,
2.35155407135517, 1.41519706213454, 2.62939873195416)), row.names = c("A",
"B", "C", "D", "E", "F", "G", "H", "I", "J"), class = "data.frame")
列是 PI、MI 和 EE。 我正在尝试创建一个热图,为此我执行以下操作:
pheatmap(mdata2, cluster_cols = TRUE, clustering_method = "ward.D")
这将创建此图像:
我的问题是,其中一列的位置对我来说没有意义。 如果我看看 EE 和 MI 之间的几何距离,我会得到
sum((mdata2[, "EE"] - mdata2[,"MI"])^2)
1.91936
然后在EE和PI之间
sum((mdata2[, "EE"] - mdata2[,"PI"])^2)
10.72999
最后在 MI 和 PI 之间
sum((mdata2[, "MI"] - mdata2[,"PI"])^2)
4.093923
因此,聚类将 EE 和 MI 放在一起是正确的,因为它们的距离也是最小的。 但为什么它会放在左边的 PI 上呢? 既然它们的距离比 PI 和 MI 之间的距离小,那么它不应该靠近 MI 吗? 我想保留列的聚类,但同时让 MI 和 PI 靠近,因为它们的距离很短。 请记住,我需要将其应用于其他数据,因此我需要一个通用答案,而不是仅针对此示例的“临时”答案。 谢谢。
原来这里已经有人问过类似的问题了: pheatmap:手动重新排序树状图中的叶子
对我来说这有效:
callback = function(hc, mat){
sv = svd(t(mat))$v[,c(2)]
dend = reorder(as.dendrogram(hc), wts = sv)
as.hclust(dend)
}
pheatmap(mdata2, clustering_callback = callback)