2015-04-21 10 views
7

Ich möchte zu einem clusplot die für pca als Pfeile verwendeten Variablen hinzufügen. Ich bin mir nicht sicher, ob ein Weg eingeschlagen wurde (ich kann in der Dokumentation nichts finden).clusplot - Anzeigen von Variablen

Ich habe eine clusplot erzeugt, der wie folgt aussieht:

clusters produced with clusplot

Mit dem Paket princomp I kann unabhängig voneinander die Beobachtungen in analogem Raum der Darstellung Grundstück, mit den Variablen (Spalten) als Pfeile:

enter image description here

gibt es eine Möglichkeit, die zwei Dinge zur gleichen Zeit zu tun, indem Sie die Cluster zeigen, und die Variablen von PKA auf dem sam Das Diagramm?

+0

Diese Frage kann bei Cross Validated besser geeignet sein. –

Antwort

1

Ich wollte zu der gleichen Sache wie OP heute und landete Stücke von clusplot und biplot zusammen setzen. Dies ist das Ergebnis, die nützlich sein können, wenn Sie die gleiche Sache zu tun:

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") 

Natürlich gibt es viel Raum für Verbesserungen (wie dies nur zusammen kopiert wird), aber ich denke, jeder kann es leicht anpassen, wenn nötig .

Wenn Sie sich fragen, warum die Pfeile (Ladungen * Sdev) mit 0,8 * sqrt (n) skaliert sind: Ich habe absolut keine Ahnung. Ich hätte Ladevorgänge * sdev gezeichnet, die der Korrelation zwischen den Hauptkomponenten und den Variablen ähneln sollten, aber das ist, wie biplot es tut.

Wie auch immer, sollte dies die gleichen Pfeile wie biplot.princomp produzieren und das gleiche pca wie clusplot verwenden, was das primäre Ziel für mich war.

Verwandte Themen