在排序上叠加聚类结果

Eli*_*eth 5 r cluster-analysis hclust vegan

我需要将通过将树状图切割成给定相似度级别而生成的聚类叠加到排序结果 (NMDS) 上。我一直在浏览 ade4 和 vegan,但没有找到任何明显的解决方案。

我目前正在使用 Primer-e(见下面的屏幕截图),但我发现图形有点有限。任何方向正确的点都非常感谢。

在此处输入图片说明

Rei*_*son 4

这对于素食主义者来说非常容易,我有一篇博客文章详细解释了其中的一些内容,但没有解释有关聚类的部分。

这是一个简单的示例,我假设您可以将其转换为您正在使用的任何包/代码。

加载包和数据集

require(vegan)
data(dune)
Run Code Online (Sandbox Code Playgroud)

计算相异矩阵并对其进行聚类,将树状图切割为 3 组

dij <- vegdist(dune) ## bray curtis dissimilarity
clu <- hclust(dij, method = "average")
grp <- cutree(clu, 3)
Run Code Online (Sandbox Code Playgroud)

看着grp

R> grp
 2 13  4 16  6  1  8  5 17 15 10 11  9 18  3 20 14 19 12  7 
 1  1  1  2  1  1  1  1  3  2  1  1  1  1  1  2  2  3  1  1
Run Code Online (Sandbox Code Playgroud)

请注意,现在为数据集中的每个样本(顶行)使用簇成员资格(第二行)。

接下来安装 NMDS

set.seed(2) ## setting a seed to make this reproducible
ord <- metaMDS(dune)
Run Code Online (Sandbox Code Playgroud)

在此示例中,我将根据集群成员资格对点进行着色,因此我需要定义一个颜色向量,每个集群一个

col <- c("red2", "green4", "mediumblue")
Run Code Online (Sandbox Code Playgroud)

我现在可以使用grpcol为我绘制的每个点(样本)生成颜色名称向量,通过col使用进行索引grp。例如:

R> col[grp]
 [1] "red2"       "red2"       "red2"       "green4"     "red2"      
 [6] "red2"       "red2"       "red2"       "mediumblue" "green4"    
[11] "red2"       "red2"       "red2"       "red2"       "red2"      
[16] "green4"     "green4"     "mediumblue" "red2"       "red2"
Run Code Online (Sandbox Code Playgroud)

剩下的工作就是绘制 NMDS 排序并添加点和图例。我抑制了调用中的任何绘图plot(),以便我可以更好地控制在下一行中添加点。第三行只是添加了一个图例。

plot(ord, type = "n", display = "sites")
points(ord, col = col[grp], bg = col[grp], pch = 21)
legend("topright", legend = paste("Cluster", 1:3),
       col = col, pt.bg = col, bty = "n", pch = 21)
Run Code Online (Sandbox Code Playgroud)

结果图应如下所示:

NMDS 图与覆盖的集群成员资格


更新:要将每个点簇的凸包添加到排序图,您可以使用该ordihull()函数。继续上面的示例,我们添加凸包如下

ordihull(ord, groups = grp, display = "sites")
Run Code Online (Sandbox Code Playgroud)

此时该图将如下所示

为集群添加凸包


注意vegan的高级plot()方法是专门设计的,旨在快速而肮脏地显示排序,因此不接受颜色向量或绘制字符。相反,我们希望您建立较低级别的绘图流方法,例如points()我在这里使用的方法。