r - 使用连续数据和分类数据的分层树状图
问题描述
所以我有一个数据集,其中有 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 编码仍在进行中,因此为什么这些问题对某些人来说似乎很简单。
解决方案
您的问题似乎是关于由分类变量定义的组的层次聚类,而不是连续数据和分类数据的层次聚类。层次聚类涉及一系列关于如何缩放数据、如何计算距离以及如何根据这些差异创建聚类的决策,因此本示例将使用默认选项。使用iris
R自带的数据集:
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。
如果我们将 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, 0, +3 那么物种就会被分离,但这只是因为我们增加了物种变量的大小。
推荐阅读
- google-cloud-platform - 在 Big Query 的特定列中查找所有具有 Null 值的行
- css - CSS自定义属性依赖没有解决,为什么?另外,我是否发现了无证行为?
- matlab - 读入带有音频的 mp4 视频文件,编辑帧并将它们写入带有音频的新文件
- twilio-studio - 如何在 Twilio Studio 中创建呼叫筛选
- c++ - 如何根据某些字符拆分字符串?经度和纬度
- python - 当一组任务依赖于另一组时,如何在 python 中同时完成两组任务?
- windows - C# Windows IoT Core 后台应用程序程序集绑定重定向
- django - Django - 如何在生效日期之前查询最近的不同行?
- node.js - NodeJS 服务器回复 twilio 自动驾驶助手的消息
- ruby-on-rails - 如何从 Rails 应用程序触发 BAT 文件在远程 Windows 服务器上运行?