r - 使用For循环对不同的链接进行层次聚类

标签 r function hierarchical-clustering

我正在尝试在各种距离矩阵上执行多个层次聚类,并使用不同的链接进行比较。

为了简化任务,我尝试创建一个函数来迭代一组链接方法以生成 agnes反对但无济于事。

这是该函数应该执行的操作的示例:

library(cluster)
Links <- c("single","average","ward") # vector of linkage methods
ClustH <- list() # list to hold HClusts
set.seed(123)
A <- rnorm(3, mean = 5, sd = 1)
B <- rnorm(3, mean = 2, sd = 1)
C <- rnorm(3, mean = 0, sd = 1)
DMat <- as.dist(cbind(A,B,C)) # distance matrix
for(i in 1:length(Links)){
 ClustH[i] <- agnes(DMat, method = Links[i])
}
ClustH[1]
#[[1]]
#[1] 1 2 3

它不是将整个 agnes 对象保存在列表的每个元素中,而是仅保存通过 <agnes object>$order 获得的对象的第一个元素(即顺序)。

我做错了什么?不能将列出的对象保存在列表中吗?有什么建议吗?

最佳答案

回答

修改循环以使用 [[ 而不是 [:

ClustH[[i]] <- agnes(DMat, method = Links[i])

基本原理

使用 [[[ 进行子集化时,列表具有特定行为。使用[,我们实际上获取给定长度的列表的子集。输出始终是一个列表,只是它的一个子集。使用[[,我们可以直接访问列表的一个元素。举个例子:

m <- list(1, 2, 3)
m[1]
#[[1]]
#[1] 1

m[[1]]
# [1] 1

由于 agnes 的输出实际上也是一个列表,它试图用 agnes 的元素覆盖 ClustH 的元素输出。由于 i 的长度为 1,因此它只会用 agnes 输出的第一个元素覆盖一个元素:

List of 8
 $ order    : int [1:3] 1 2 3
 $ height   : num [1:2] 4.77 3.72
 $ ac       : num 0.147
 $ merge    : int [1:2, 1:2] -2 -1 -3 1
 $ diss     : 'dissimilarity' num [1:3] 4.77 6.56 3.72
  ..- attr(*, "Labels")= chr [1:3] "A" "B" "C"
  ..- attr(*, "Size")= num 3
  ..- attr(*, "call")= language as.dist.default(m = cbind(A, B, C))
  ..- attr(*, "Diag")= logi FALSE
  ..- attr(*, "Upper")= logi FALSE
  ..- attr(*, "Metric")= chr "unspecified"
 $ call     : language agnes(x = DMat, method = Links[1])
 $ method   : chr "single"
 $ order.lab: chr [1:3] "A" "B" "C"
 - attr(*, "class")= chr [1:2] "agnes" "twins"

换句话说,整数向量1 2 3

建议

如果您想将列表作为输出,您还可以考虑切换到 lapply:

ClustH <- lapply(Links, function(x) agnes(DMat, methods = x))

# From R version 4.1 onwards, this also works
ClustH <- lapply(Links, \(x) agnes(DMat, methods = x))

关于r - 使用For循环对不同的链接进行层次聚类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67656517/

相关文章:

R 直方图显示每个 bin 所花费的时间

R 函数 read.csv 失败, "scan() expected ' 是一个真实的',得到......“消息

r - 使用 ggplot2 的累积直方图

javascript - 调用 Javascript 函数后的括号是做什么用的?

python - 在距离高度处从 SciPy 切割树状图/聚类树

python - Python 中的 SciPy 层次字符串聚类?

r - R 中的 Switch 语句(解包参数)

node.js - 如何从给定 ID 获取用户信息并使用 Node.js 和 EJS 显示它

python - 如何更改我的钢笔工具颜色?

r - 在 R 中编程层次聚类算法的教学方法