进一步阅读后,我发现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 比较两个树状图部分。