首页 > 解决方案 > 使用连续数据和分类数据的分层树状图

问题描述

所以我有一个数据集,其中有 90 个左右的样本,每个样本都有它们所属的进化枝,以及从线的长度计算的 5 个数据点(这在这里并不重要)。我的目标是创建一个树状图,该树状图基本上计算差异并将其显示为图表,但是我想这样做,以便代码将样本按各自的进化枝分离到它们自己的集群中,然后查看它们的相似度/不相似度,但我不太确定如何处理这个问题。我愿意使用任何可用的 r 工具来这样做,因此将不胜感激。数据集的一个简短示例将在下面以表格的形式格式化。

姓名 类型 长度_1 长度_2 长度_3 长度_4 长度_5
规格1 小号 10 -15 -5 5 10
规格2 20 6 6 -5 -10
规格3 22 7 10 -3 -7
规格4 小号 6 6 -10 -5 3
规格5 54 -20 -20 9 9
规格5 25 -20 -10 5 9

这是一张现场制作的表格,但代表了我的数据通常的样子。类型是指进化枝,长度是通过将分段图拆分为 5 个部分并找到每个线段的平均斜边来计算的。我想确定这些线对于它们各自进化枝中的每个物种的相似程度(将 S 与其他 S 分组并查看差异)。还有一种方法可以使用这些树状图来转换数据并绘制系统发育(这只是一个额外的问题,如果未知则不需要回答)。感谢您阅读本文,我的 r 编码仍在进行中,因此为什么这些问题对某些人来说似乎很简单。

标签: rhierarchical-clustering

解决方案


您的问题似乎是关于由分类变量定义的组的层次聚类,而不是连续数据和分类数据的层次聚类。层次聚类涉及一系列关于如何缩放数据、如何计算距离以及如何根据这些差异创建聚类的决策,因此本示例将使用默认选项。使用irisR自带的数据集:

data(iris)
iris.sub <- iris[c(1:15, 51:65, 101:115), ]
str(iris.sub)
# 'data.frame': 45 obs. of  5 variables:
#  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
#  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
#  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
#  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

数据包括对三种不同虹膜的 4 次测量。我们将使用每个物种中的 15 个作为示例。现在我们将通过转换为 Z 分数来缩放数据,以便较大的测量值不会比较小的测量值更具影响力,并计算物种均值:

iris.z <- scale(iris.sub[ , 1:4])
iris.agg <- aggregate(iris.z, list(iris.sub$Species), mean)
iris.agg
#      Group.1 Sepal.Length Sepal.Width Petal.Length Petal.Width
# 1     setosa   -0.9871973   0.7967458   -1.2887187  -1.2543022
# 2 versicolor    0.2171329  -0.5487521    0.2754513   0.1735865
# 3  virginica    0.7700644  -0.2479937    1.0132674   1.0807157

接下来是平均值之间的距离:

iris.gdst <- dist(iris.agg[, -1])
iris.gdst
#          1        2
# 2 2.783212         
# 3 3.864052 1.327948

最后是聚类分析和树状图:

iris.hcl <- hclust(iris.gdst, members=table(iris.sub$Species))
plot(iris.hcl, labels=iris.agg$Group.1)

有关各种功能的详细信息,请阅读手册页?scale?aggregate?dist?hclust

树状图

您可以计算所有数值变量的树状图并按物种标记结果,如下所示:

iris.dst <- dist(iris.z)
iris.all.hcl <- hclust(iris.dst)
plot(iris.all.hcl, labels=iris.sub$Species)
rect.hclust(iris.hcl.all, 3)

请注意,setosa 很好分离,但不是 versicolor 和 virginica。

树状图 2

如果我们将 setosa、versicolor 和 virginica 编码为 -2, 0, 2 并将其添加到距离矩阵中:

iris.sp.dst <- dist(cbind(iris.z, 2*(as.numeric(iris.sub$Species) - 2)))
iris.sp.hcl <- hclust(iris.sp.dst)
plot(iris.sp.hcl, labels=iris.sub$Species)
rect.hclust(iris.sp.hcl, 3)

请注意,Virginica 和 versicolor 仍然混合在一起。

树状图 3

如果我们将物种的范围任意增加到-3, 0, +3 那么物种就会被分离,但这只是因为我们增加了物种变量的大小。


推荐阅读