比较 R 中的层次聚类
Comparing hierarchical clusterings in 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 矩阵。
此外,这只是计算相关性。有什么方法可以直观地比较两个树状图吗?
进一步阅读后,我发现虽然 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 部分比较两个树状图。
我正在使用包 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 矩阵。
此外,这只是计算相关性。有什么方法可以直观地比较两个树状图吗?
进一步阅读后,我发现虽然 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 部分比较两个树状图。