0

我正在使用autoplotinggfortify来绘制一个prcomp对象。我还想看看我是否可以手动重现情节。但是,当我这样做时,这两个图在如何绘制载荷方面似乎有所不同。请注意,此处未对数据集进行缩放。我实际上正在做这个练习的数据集对所有列都有相同的单位,我认为不缩放可能是必然的。

library(ggplot2)
library(ggfortify)
data(mtcars)
cars_pca = prcomp(mtcars, center = TRUE, scale. = FALSE)
autoplot(cars_pca, loadings = TRUE, loadings.label = TRUE)

plot(x = cars_pca$x[, 1], y = cars_pca$x[, 2])
text(x = cars_pca$rotation[, 1], 
     y = cars_pca$rotation[, 2],
     col = alpha('red', 0.7),
     cex = 1,
     labels = colnames(mtcars))

我读过它R可以互换使用术语加载和特征向量,即使这并不精确。ggfortify但是,即使手动实现这两个 问题中详述的内容,我也无法生成双图。我也尝试寻找源代码,ggfortify::autoplot.prcomp但没有运气。

有人可以给我一些关于如何重现ggfortify正在绘制的载荷的建议吗?我真的很想了解发生了什么。

谢谢!

4

1 回答 1

0

转换正在ggfortify::autoplot.prcomp函数中发生。由于您使用的是默认值,scale=1因此会调整这些值。以下是如何恢复在autoplot. 载荷在ggfortify::ggbiplot函数中转换

scaler <- cars_pca$sdev[c(1,2)] * sqrt(nrow(cars_pca$x))
trans <- t(t(cars_pca$x[, 1:2]) / scaler)
scaler2 <- min(max(abs(trans[, 1L])) / max(abs(cars_pca$rotation[, 1L])),
              max(abs(trans[, 2L])) / max(abs(cars_pca$rotation[, 2L])))
trans2 <- cars_pca$rotation[, 1L:2L] * scaler2 * 0.8

plot(x = trans[, 1], y = trans[, 2])
text(x = trans2[, 1], 
     y = trans2[, 2],
     col = alpha('red', 0.7),
     cex = 1,
     labels = colnames(mtcars))

在此处输入图像描述

于 2020-09-08T03:12:08.367 回答