您如何比较两个树状图(在 R 中)之间的“相似性”?

Posted

技术标签:

【中文标题】您如何比较两个树状图(在 R 中)之间的“相似性”?【英文标题】:How do you compare the "similarity" between two dendrograms (in R)? 【发布时间】:2010-02-07 21:23:28 【问题描述】:

我有两个树状图,我希望将它们相互比较,以了解它们有多“相似”。但我不知道有任何方法可以做到这一点(更不用说实现它的代码,比如在 R 中)。

有什么线索吗?

更新(2014-09-13):

自从提出这个问题后,我编写了一个名为dendextend 的 R 包,用于树状图的可视化、操作和比较。该软件包位于CRAN 上,并附带detailed vignette。包括cor_copheneticcor_bakers_gammaBk/Bk_plot等功能。以及用于直观比较两棵树的tanglegram 函数。

【问题讨论】:

::looks up dendrogram:: 现在你让我好奇了。这种比较首先存在什么指标? 您确定要这样做吗?树状图只是数据的表示。我认为(直接)比较这两个树状图中划分的数据会提供更多信息。 【参考方案1】:

比较树状图与比较层次聚类并不完全相同,因为前者包括分支的长度以及分裂,但我也认为这是一个好的开始。我建议您阅读 E. B. Fowlkes & C. L. Mallows (1983)。 “一种比较两个层次聚类的方法”。美国统计协会杂志 78 (383): 553–584 (link)。

他们的方法是基于在每个级别 k 切割树,得到一个度量 Bk,将分组比较到 k 个集群中,以及然后检查 Bk vs k 图。 Bk 度量是基于查看成对的对象并查看它们是否属于同一个集群。

我确信可以基于这种方法编写代码,但首先我们需要知道树状图在 R 中是如何表示的。

【讨论】:

这对 Aniko 很有帮助 - 谢谢!我将进一步阅读。 亲爱的 Aniko, 自从我开始这个话题以来,我已经编写了一个名为 dendextend 的 R 包,其中包含多个用于比较树状图的函数。具体来说:cor_copheneticcor_bakers_gammaBk / Bk_plot。该软件包还附带一个详细说明这些功能的小插图。 小插图链接:cran.r-project.org/web/packages/dendextend/vignettes/…【参考方案2】:

如您所知,Dendrograms 源于层次聚类 - 所以您真正要问的是如何比较两个层次聚类运行的结果。我知道没有标准指标,但我会查看找到的集群数量并比较类似集群之间的成员相似性。 Here 是我同事写的关于聚类苏格兰威士忌的层次聚类的一个很好的概述。

【讨论】:

嗨,保罗,谢谢你的回答,我稍后会通读。谢谢,塔尔【参考方案3】:

看看this page:

我也有类似的问题问here

似乎我们可以使用 cophenetic correlation 来衡量两个树状图之间的相似性。但目前 R 中似乎没有用于此目的的功能。

于 2014 年 9 月 18 日编辑: stats 包中的 cophenetic 函数能够计算并列相异矩阵。并且可以使用cor函数计算相关性。正如@Tal 指出的那样,as.dendrogram 函数返回了不同顺序的树,如果我们根据树状图结果计算相关性,则会导致错误的结果。如dendextend包中的函数cor_cophenetic函数示例所示:

set.seed(23235)
ss <- sample(1:150, 10 )
hc1 <- iris[ss,-5] %>% dist %>% hclust("com")
hc2 <- iris[ss,-5] %>% dist %>% hclust("single")
dend1 <- as.dendrogram(hc1)
dend2 <- as.dendrogram(hc2)
# cutree(dend1)
cophenetic(hc1)
cophenetic(hc2)
# notice how the dist matrix for the dendrograms have different orders:
cophenetic(dend1)
cophenetic(dend2)
cor(cophenetic(hc1), cophenetic(hc2)) # 0.874
cor(cophenetic(dend1), cophenetic(dend2)) # 0.16
# the difference is becasue the order of the distance table in the case of
# stats:::cophenetic.dendrogram will change between dendrograms!

【讨论】:

亲爱的@pengchy - 在 R 中有一个类似的函数。它是 cor_cophenetic 函数,来自 dendextend 包。【参考方案4】:

如果您可以访问生成每个树状图的基础距离矩阵(如果您在 R 中生成树状图,您可能会这样做),您不能只使用两个矩阵的对应值之间的相关性吗?我知道这并没有解决您所要求的内容,但它是您所要求的精神的一个很好的解决方案。

【讨论】:

嗨 dsimcha,感谢您的想法。在我的特殊情况下,我只有两者之一的距离矩阵。所以你的解决方案不适用。但再次感谢!【参考方案5】:

查看this 页面,该页面包含大量有关处理树木的软件的信息,包括树状图。我注意到几个处理树比较的工具,虽然我还没有亲自使用过它们中的任何一个。那里还引用了许多参考文献。

【讨论】:

【参考方案6】:

在系统发育学社区中有大量关于树距离度量的文献,但从计算机科学的角度来看,这些文献似乎被忽视了。请参阅 ape 包的 dist.topo 了解两个树距离度量和几个引用(Penny 和 Hardy 1985,Kuhner 和 Felsenstein 1994),它们考虑了树分区的相似性,以及 Robinson-Foulds metric 在phangorn 包。

一个问题是这些指标没有固定的比例,因此它们仅在 1) 树比较或 2) 与某些生成的基线比较的情况下有用,可能通过他出色的 dendextend 包中的permutation tests similar to what Tal has done with Baker's Gamma 进行比较。

如果您有从 R 层次聚类生成的 hclust 或树状图对象,则使用 ape 包中的 as.phylo 会将您的树状图转换为系统发育树,以便在这些函数中使用。

【讨论】:

以上是关于您如何比较两个树状图(在 R 中)之间的“相似性”?的主要内容,如果未能解决你的问题,请参考以下文章

手动创建树状图 r

改变树状图的分 支长度(秘籍图)

如何在 Python 中比较两个字符串(英语除外)之间的相似性

防止标签在 hclust/树状图中剪裁

Python使用matplotlib可视化树状图层次聚类系统树图树状图根据给定的距离度量将相似点分组在一起并根据点的相似性将它们组织成树状图链接起来(Dendrogram)

如何手动创建树状图(或“hclust”)对象? (在 R 中)