7
我想添加到一個clusplot
作爲箭頭繪製用於pca的變量。我不確定一種方法已經實現(我在文檔中找不到任何東西)。clusplot - 顯示變量
我已經產生了clusplot看起來像這樣:
隨着包princomp
我可以獨立地繪製的意見中表示的類似的空間,與變量(列)爲箭頭:
有沒有辦法做到在同一時間的兩件事情,通過展示集羣和PCA對SAM變量電子圖?
我想添加到一個clusplot
作爲箭頭繪製用於pca的變量。我不確定一種方法已經實現(我在文檔中找不到任何東西)。clusplot - 顯示變量
我已經產生了clusplot看起來像這樣:
隨着包princomp
我可以獨立地繪製的意見中表示的類似的空間,與變量(列)爲箭頭:
有沒有辦法做到在同一時間的兩件事情,通過展示集羣和PCA對SAM變量電子圖?
我想和今天的OP一樣,最後把clusplot
和biplot
放在一起。這是,如果你想要做同樣的事情,這可能是有用的結果:
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")
當然有很大的提升空間(因爲這只是一起復制),但我想任何人都可以很容易地適應它,如果需要的。
如果你想知道爲什麼箭頭(加載* sdev)與0.8 * sqrt(n)成比例:我完全不知道。我會繪製加載* sdev這應該類似於主要組件和變量之間的相關性,但這是如何biplot
它。
無論如何,這應該產生與biplot.princomp
相同的箭頭,並使用與我的主要目標相同的pca作爲clusplot
。
此問題可能更適合交叉驗證。 –