首页 > 解决方案 > 比较 R 中的层次聚类

问题描述

我正在使用包dendextend和函数cor_cophenetic来计算 6 个层次集群之间的共同距离。其中 R 输出它们之间的相关性。

目前我使用的代码很简单:

cor_cophenetic(hcr1,hcr2)
cor_cophenetic(hcr1,hcr3)
cor_cophenetic(hcr1,hcr4)
cor_cophenetic(hcr1,hcr5)
cor_cophenetic(hcr1,hcr6)
cor_cophenetic(hcr2,hcr3)
            :
            :
cor_cophenetic(hcr4,hcr6)
cor_cophenetic(hcr5,hcr6)

它单独输出相关性。

我知道有一个功能outer可以做到这一点,但我不确定如何将此命令合并到其中。我试图将输出作为 15x15 矩阵。

这也只是计算相关性。有什么方法可以直观地比较两个树状图吗?

标签: rhierarchical-clusteringdendrogram

解决方案


进一步阅读后,我发现虽然cor_cophenetic()一次不能处理两个以上的树状列表元素,但cor.dendlist()可以并且将计算共生相关性(除其他外),这使事情变得简单得多。

names(dend.l) <- met
round(cor.dendlist(dend.l), 4)
#          complete single average centroid
# complete   1.0000 0.4925  0.6044   0.4822
# single     0.4925 1.0000  0.9851   0.9959
# average    0.6044 0.9851  1.0000   0.9871
# centroid   0.4822 0.9959  0.9871   1.0000

cor_cophenetic()使用示例数据的原始答案:

我不认为你可以outer()为此工作,因为它需要一个原子类型的对象(向量、矩阵或数组)。我们将不得不使用expand.grid()和滚动我们自己的apply()

library(dendextend)
library(magrittr)

# example data
set.seed(23235)
ss <- sample(1:150, 10 )

dend.l <- dendlist()
met <- c("complete", "single", "average", "centroid")

for (i in 1:length(met)) {
    dend <- iris[ss,-5] %>% dist %>% hclust(met[i])
    dend.l[[i]] <- as.dendrogram(dend)
}

ind <- expand.grid(1:length(dend.l), 1:length(dend.l))

# turns out cor_cophenetic has a method for dendlist where you can
# specify which elements you want to compare. Simplifies things a little
v <- apply(ind, 1, function(x) cor_cophenetic(dend.l, x))
m <- matrix(v, length(dend.l))
dimnames(m) <- list(met, met)

round(m, 4)
#          complete single average centroid
# complete   1.0000 0.4925  0.6044   0.4822
# single     0.4925 1.0000  0.9851   0.9959
# average    0.6044 0.9851  1.0000   0.9871
# centroid   0.4822 0.9959  0.9871   1.0000

如您所见,矩阵是对称的,所以我们可以combn()不用 代替expand.grid,这只会给我们一个三角形。

至于在视觉上比较两个树状图,请查看比较两个树状图的 Dendextend 介绍部分。



推荐阅读