在用于 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))
我在 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))