【问题标题】:clusplot - showing variablesclusplot - 显示变量
【发布时间】:2015-06-28 12:23:18
【问题描述】:

我想将用于 pca 的变量添加到 clusplot 图中作为箭头。我不确定是否已经实现了一种方法(我在文档中找不到任何内容)。

我制作了一个如下所示的 clusplot:

使用 princomp 包,我可以在类似的表示空间中独立绘制观察结果,变量(列)作为箭头:

有没有办法同时做这两件事,通过在同一张图上显示 pca 的集群和变量?

【问题讨论】:

  • 这个问题可能更适合 Cross Validated。

标签: r cluster-analysis pca


【解决方案1】:

我今天想和 OP 做同样的事情,最后把 clusplotbiplot 的部分放在一起。如果您想做同样的事情,这个结果可能会很有用:

clusplot2 <- function(dat, clustering, ...) {
    clusplot(dat, clustering, ...)

    ##  this is from clusplot.default
    pca <- princomp(dat, scores = TRUE, cor = (ncol(dat) != 2))

    ##  this is (adapted) from biplot.princomp 
    directions <- t(t(pca$loadings[, 1:2]) * pca$sdev[1:2]) * sqrt(pca$n.obs)

    ##  all below is (adapted) from biplot.default
    unsigned.range <- function(x) c(-abs(min(x, na.rm = TRUE)), 
                                    abs(max(x, na.rm = TRUE)))
    x <- predict(pca)[, 1:2]
    y <- directions
    rangx1 <- unsigned.range(x[, 1L])
    rangx2 <- unsigned.range(x[, 2L])
    rangy1 <- unsigned.range(y[, 1L])
    rangy2 <- unsigned.range(y[, 2L])
    xlim <- ylim <- rangx1 <- rangx2 <- range(rangx1, rangx2)
    ratio <- max(rangy1/rangx1, rangy2/rangx2)
    par(new = T)
    col <- par("col")
    if (!is.numeric(col)) 
        col <- match(col, palette(), nomatch = 1L)
    col <- c(col, col + 1L)
    cex <- rep(par("cex"), 2)
    plot(y, axes = FALSE, type = "n", xlim = xlim * ratio, ylim = ylim * 
             ratio, xlab = "", ylab = "", col = col[1L])
    axis(3, col = col[2L])
    axis(4, col = col[2L])
    box(col = col[1L])
    text(y, labels = names(dat), cex = cex[2L], col = col[2L])
    arrows(0, 0, y[, 1L] * 0.8, y[, 2L] * 0.8, col = col[2L], 
           length = 0.1)
}

############################################################

library(cluster)

dat <- iris[, 1:4]

clus <- pam(dat, k = 3)
clusplot2(dat, clus$clustering, main = "Test")

当然还有很大的改进空间(因为这是一起复制的),但我认为任何人都可以在需要时轻松调整它。

如果你想知道为什么箭头 (loadings * sdev) 用 0.8 * sqrt(n) 缩放:我完全不知道。我会绘制 loadings * sdev 这应该类似于主成分和变量之间的相关性,但这就是 biplot 的做法。

无论如何,这应该会产生与 biplot.princomp 相同的箭头,并使用与 clusplot 相同的 pca,这是我的主要目标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-29
    • 2020-08-23
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    相关资源
    最近更新 更多