【问题标题】:Divergence between cutree and cluster branchescutree 和 cluster 分支之间的分歧
【发布时间】:2018-06-10 03:57:26
【问题描述】:

我有一个数据集,其中包含一些属于 4 种不同基因型的小鼠的每日饮水量。我正在尝试编写一个脚本,以便使用层次聚类分析根据它们的饮水模式对这些动物进行分类,然后创建一个纵向图,绘制每个聚类在几天内的平均饮水量。

为此,我首先创建分层集群集群,如下所示:

library("dendextend")
library("ggplot2")
library("reshape2")
data=read.csv("data.csv", header=T, row.names=1)
trimmed=data[, -ncol(data)]

 hc <- as.dendrogram(hclust(dist(trimmed)))
    labels.drk=data[,ncol(data)]
    groups.drk=labels.drk[order.dendrogram(hc)]
    genotypes=as.character(unique(data[,ncol(data)]))
    k=4
    cluster_cols=rainbow(k)

    hc <- hc %>%
      color_branches(k = k, col=cluster_cols) %>%

      set("branches_lwd", 1) %>%

      set("leaves_pch", rep(c(21, 19), length(genotypes))[groups.drk]) %>% 
      set("leaves_col", palette()[groups.drk]) 

    plot(hc, main="Total animals" ,horiz=T)

    legend("topleft", legend=genotypes,
           col=palette(), pch = rep(c(21,19), length(genotypes)),
           title="Genotypes")

    legend("bottomleft", legend=1:k,
           col=cluster_cols, lty = 1, lwd = 2,
           title="Drinking group")

然后我使用 cutree 函数来评估哪个动物属于哪个组,以绘制每组的平均饮水量。

groups<-cutree(hc, k=k, order_clusters_as_data = FALSE))
x<-cbind(data,groups)
intake_avg=aggregate(data[, -ncol(data)], list(x$groups), mean, header=T)

df <- melt(intake_avg, id.vars = "Group.1")
ggplot(df, aes(variable, value, group=factor(Group.1))) + geom_line(aes(color=factor(Group.1)))

问题是我从分层集群获得的数字与 cutree 函数分配的数字之间存在不一致。虽然集群正在从 1 到 4 对分支进行自下而上的排序,但 cutree 函数正在使用我不熟悉的其他一些排序参数。因此,聚类图中的标签和摄入图表中的标签不匹配。

我是编码的初学者,所以可以肯定我使用了太多的冗余行和循环,因此我的代码可以缩短,但如果你们能帮助我解决这个具体问题,我会很高兴。

Data set

集群:

摄入图

【问题讨论】:

  • “早午餐”[原文如此] 通常是这样订购的:早餐

标签: r cluster-analysis hclust dendextend


【解决方案1】:

要在树状图中绘制相同的簇,您需要使用:

groups <- dendextend:::cutree(hc, k=k, order_clusters_as_data = FALSE)
idx <- match(rownames(data), names(groups))
x <- cbind(data,groups[idx])
intake_avg <- aggregate(data[, -ncol(data)], list(x$groups), mean, header=T)

df <- melt(intake_avg, id.vars = "Group.1")
ggplot(df, aes(variable, value, group=factor(Group.1))) + 
 geom_line(aes(color=factor(Group.1)), lwd=1)

这是摄入量图表:

【讨论】:

  • 嗨,Marco,感谢您的回复,但我仍然得到错误的组。现在,这些组仅根据它们在原始数据集中出现的顺序进行分类,而不是更多地基于解程序。有什么线索吗?
  • 嗨,Marco,我使用的代码与我之前发布的代码相同,但添加了您建议的那一行。之前分类是对的,但是分配的数字被颠倒了,现在cutree创建的cluster与deprogram不同。这就是我现在使用的代码:pastebin.com/xYFxQrbb.
  • 太好了,马可!非常感谢。非常优雅的方法。实际上,这对于修复我在代码中遇到的另一个错误也很有用。非常感谢
猜你喜欢
  • 1970-01-01
  • 2013-03-27
  • 2018-05-10
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 2020-10-19
相关资源
最近更新 更多