【问题标题】:Comparing hierarchical clusterings in R比较 R 中的层次聚类
【发布时间】:2018-07-20 20:16:57
【问题描述】:

我正在使用包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 矩阵。

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

【问题讨论】:

  • 如果只有6个簇,为什么矩阵是15x15?
  • 比较集群 1&2、1&3、1&4、.....、5&6。共 15 个。

标签: r hierarchical-clustering dendrogram


【解决方案1】:

进一步阅读后,我发现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,这只会给我们一个三角形。

关于在视觉上比较两个树状图,请看Introduction to dendextend 比较两个树状图部分。


【讨论】:

  • 如果我错了,请纠正我,但这似乎是在比较一个集群的不同链接算法,该集群正在测试算法之间的相似性。如果我没记错的话,那么我最初的问题是相似的,但我不想比较算法,而是比较集群之间的相关性。
  • 衡量两个层次集群之间的相似性。您的代码显示了具有不同链接算法的一个集群的相似性。如果您只选择一种链接算法,假设complete 并比较两个或多个具有完整链接的集群。我使用的代码将执行此操作,而不是比较链接算法。即层次聚类已经应用了 6 次,产生了 6 个不同的层次聚类。我想找到这些之间的相关性。尽管您的代码在比较链接方面非常有帮助,这也是我的想法。
  • @Ali:当然,我改变了链接方法,因为我可以在不访问您的数据的情况下轻松生成一些不同的树作为示例。如果您想比较自己的树,您只需将它们收集到名为 dend.l 的 dendlist 对象中并运行代码。
  • @Ali:似乎您可以改用cor.dendlist() 来简化一些事情。在我发布的link 上找到它。
  • 感谢@AkselA 的回答,如果您可以更新您的回答以强调 cor.dendlist 应该解决问题,这将有助于将来遇到此线程的人:)跨度>
猜你喜欢
  • 2015-08-12
  • 2019-06-14
  • 2016-09-03
  • 2021-02-04
  • 1970-01-01
  • 2020-07-20
  • 2018-10-22
  • 2021-08-15
  • 2012-03-16
相关资源
最近更新 更多