2015-04-21 18 views
7

Chciałbym dodać do clusplot wykreślić zmienne używane jako strzałki jako pca. Nie jestem pewien, czy został wprowadzony sposób (nie mogę znaleźć niczego w dokumentacji).clusplot - wyświetlanie zmiennych

I przyniosły clusplot, który wygląda tak:

clusters produced with clusplot

Z pakietem princomp mogę niezależnie wykreślić obserwacje w analogiczny przestrzeni reprezentacji, ze zmiennych (kolumn) jako strzałki:

enter image description here

Czy istnieje sposób, aby zrobić dwie rzeczy w tym samym czasie, pokazując klastrów i zmienne PCA na sam e diagram?

+0

To pytanie może być lepiej dostosowane do Cross Validated. –

Odpowiedz

1

Chciałem zrobić to samo, co OP dzisiaj i skończyłem stawiając kawałki od clusplot i biplot razem. Jest to wynik, który może być przydatny, jeśli chcesz zrobić to samo:

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

Oczywiście jest wiele do zrobienia (jak to jest po prostu skopiowane razem), ale myślę, że każdy może łatwo dostosować go w razie potrzeby .

Jeśli zastanawiasz się, dlaczego strzałki (loadings * sdev) są skalowane z 0,8 * sqrt (n): Nie mam absolutnie żadnego pojęcia. Skopiowałbym loadings * sdev, który powinien przypominać korelację między głównymi komponentami i zmiennymi, ale tak robi to biplot.

W każdym razie, powinno to dać te same strzałki, co biplot.princomp i używać tego samego pliku, co clusplot, co było dla mnie głównym celem.