gpt4 book ai didi

R将树状图切割成最小尺寸的组

转载 作者:行者123 更新时间:2023-12-04 11:28:08 26 4
gpt4 key购买 nike

有没有一种简单的方法来计算 h 的最小值?在 cut产生给定最小大小的分组?

在这个例子中,如果我想要每个集群至少有十个成员,我应该选择 h = 3.80 :

# using iris data simply for reproducible example
data(iris)
d <- data.frame(scale(iris[,1:4]))
hc <- hclust(dist(d))
plot(hc)

cut(as.dendrogram(hc), h=3.79) # produces 5 groups; group 4 has 7 members

cut(as.dendrogram(hc), h=3.80) # produces 4 groups; no group has <10 members

由于分割的高度在 hc$height 中给出,我可以使用 hc$height + 0.00001 创建一组候选值然后循环遍历它们中的每一个。但是,我不知道如何解析集群大小 members出了 dendrogram类(class)。例如, cut(as.dendrogram(hc), h=3.80)$lower[[1]]$members返回 NULL , 不是 66 所期望的。

请注意,这是一个比 Cutting dendrogram into n trees with minimum cluster size in R 更简单的问题使用包 dynamicTreeCut ;在这里我没有指定树的数量,只是最小的集群大小。 TYVM。

最佳答案

感谢@Vlo 和@lukeA,我能够实现一个循环。但是,我只是将其发布为一个起点,并且肯定会采用更优雅的解决方案。

unnest <- function(x) { # from Vlo's answer
if(is.null(names(x))) x
else c(list(all=unname(unlist(x))), do.call(c, lapply(x, unnest)))
}

cuts <- hc$height + 1e-9

min_size <- 10
smallest <- 0
i <- 0

while(smallest < min_size & i <= length(cuts)){
h_i <- cuts[i <- i+1]
if(i > length(cuts)){
warning("Couldn't find a cluster big enough.")
}
else smallest <-
Reduce(min,
lapply(X = unnest(cut(as.dendrogram(hc), h=h_i)$lower),
FUN = attr, which = "members") ) # from lukeA's comment
}
h_i # returns desired output: [1] 3.79211

关于R将树状图切割成最小尺寸的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31124810/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com