8

Rクラスターを識別する長方形を使用して、階層的クラスタリングの結果をデンドログラムとしてプロットしようとしています。

次のコードは、垂直樹状図のトリックを実行しますが、水平樹状図 ( horiz=TRUE) の場合、長方形は描画されません。水平デンドログラムでも同じことを行う方法はありますか。

library("cluster")
dst <- daisy(iris, metric = c("gower"), stand = FALSE)
hca <- hclust(dst, method = "average")
plot(as.dendrogram(hca), horiz = FALSE)
rect.hclust(hca, k = 3, border = "red")

さらに、希望の距離値で木を切るための線をプロットしたいと思います。Rでそれをプロットする方法.cutree関数はクラスターを返しますが、それをプロットすることも可能です.

cutree(hca, k = 3)

私が探している望ましい出力はこのようなものです。

デンドログラム

Rでこれを行うにはどうすればよいですか?

4

3 に答える 3

6

jlhoward と Backlin の両方の回答が適切です。

あなたが試すことができるのはdendextend、まさにこの種のもののために設計されたパッケージを使用することです. rect.dendrogramのように機能する関数がありrect.hclustますが、horiz パラメータがあります (さらに、rect の端の位置をさらに制御します)。関連する高さを見つけるには、関数を使用できます(パッケージheights_per_k.dendrogramも使用するとはるかに高速になります)dendextendRcpp

上記の例と同じ結果を得る方法の簡単な例を次に示します (楽しみのために、色付きの枝のボーナスが追加されています)。

install.packages("dendextend")
install.packages("dendextendRcpp")

library("dendextend")
library("dendextendRcpp")

# using piping to get the dend
dend <- iris[,-5] %>% dist %>% hclust %>% as.dendrogram

# plot + color the dend's branches before, based on 3 clusters:
dend %>% color_branches(k=3) %>% plot(horiz=TRUE, main = "The dendextend package \n Gives extended functionality to R's dendrogram object")

# add horiz rect
dend %>% rect.dendrogram(k=3,horiz=TRUE)

# add horiz (well, vertical) line:
abline(v = heights_per_k.dendrogram(dend)["3"] + .6, lwd = 2, lty = 2, col = "blue")

ここに画像の説明を入力

于 2014-08-11T08:38:27.340 に答える
4

ジョブを完了するには (非常に醜い方法ですが)、 in への呼び出しで座標を手動で交換するだけrectですrect.hclust

rhc <- function (tree, k = NULL, which = NULL, x = NULL, h = NULL, border = 2, 
    cluster = NULL) 
{
    if (length(h) > 1L | length(k) > 1L) 
        stop("'k' and 'h' must be a scalar")
    if (!is.null(h)) {
        if (!is.null(k)) 
            stop("specify exactly one of 'k' and 'h'")
        k <- min(which(rev(tree$height) < h))
        k <- max(k, 2)
    }
    else if (is.null(k)) 
        stop("specify exactly one of 'k' and 'h'")
    if (k < 2 | k > length(tree$height)) 
        stop(gettextf("k must be between 2 and %d", length(tree$height)), 
            domain = NA)
    if (is.null(cluster)) 
        cluster <- cutree(tree, k = k)
    clustab <- table(cluster)[unique(cluster[tree$order])]
    m <- c(0, cumsum(clustab))
    if (!is.null(x)) {
        if (!is.null(which)) 
            stop("specify exactly one of 'which' and 'x'")
        which <- x
        for (n in seq_along(x)) which[n] <- max(which(m < x[n]))
    }
    else if (is.null(which)) 
        which <- 1L:k
    if (any(which > k)) 
        stop(gettextf("all elements of 'which' must be between 1 and %d", 
            k), domain = NA)
    border <- rep_len(border, length(which))
    retval <- list()
    for (n in seq_along(which)) {
        rect(
             ybottom = m[which[n]] + 0.66,
             xright = par("usr")[3L],
             ytop = m[which[n] + 1] + 0.33,
             xleft = mean(rev(tree$height)[(k - 1):k]),
             border = border[n])
        retval[[n]] <- which(cluster == as.integer(names(clustab)[which[n]]))
    }
    invisible(retval)
}

そして、rhcあなたが呼んだように呼び出しますrect.hclust:

rhc(hca, k = 3, border = "red")

ここに画像の説明を入力

于 2014-06-10T12:33:23.563 に答える