在用于 PCA 的 ggfortify 中从自动绘图再现负载

Reproducing loadings from autoplot in ggfortify for PCA

我在 ggfortify 中使用 autoplot 来绘制 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 可以互换使用术语加载和特征向量,即使这并不精确。但是,即使手动实施 two questions 中详述的内容,我也无法生成 ggfortify 双标图。我也尝试寻找 ggfortify::autoplot.prcomp 的源代码,但没有成功。

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

谢谢!

转换发生在 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))