C8H*_*4O2 5 r dendrogram hclust
是否有一种简单的方法来计算hin的最小值,以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
Run Code Online (Sandbox Code Playgroud)
由于分割的高度在中给出hc$height,因此我可以使用创建一组候选值hc$height + 0.00001,然后在每个分割处循环进行切割。不过,我不明白如何解析簇大小members出的dendrogram类。例如,cut(as.dendrogram(hc), h=3.80)$lower[[1]]$members返回NULL,而不是所需的66。
请注意,这是一个比使用包将树状图切成R中最小簇大小的n棵树更简单的问题dynamicTreeCut; 在这里,我没有指定树木的数量,而只是指定了最小的群集大小。TYVM。
这并不能回答问题,但members如果您决定循环遍历h.
从这里窃取并修改一些代码
# Unnest the list/dendogram structure
unnest <- function(x) {
if(is.null(names(x))) {
x
}
else {
c(list(all=unname(unlist(x))), do.call(c, lapply(x, unnest)))
}
}
# Extract the `members` attribute from each dendogram
lapply(X = unnest(cut(as.dendrogram(hc), h=3.8)), FUN = attr, which = "members")
Run Code Online (Sandbox Code Playgroud)
输出:
# Please don't ask me why there are 2 dendograms stored
# in the `$upper` list while `print` displays one
$upper1
[1] 2
$upper2
[1] 2
$lower1
[1] 66
$lower2
[1] 11
$lower3
[1] 24
$lower4
[1] 49
Run Code Online (Sandbox Code Playgroud)