1

我搜索了很长时间,以寻找距离与相关双图的直接解释,以及如何转换 PCA 的标准输出以实现两个双图的解释。我看到的所有堆栈溢出解释1 2 3 4 都用数学术语让我大吃一惊。如何使用 R 的 prcomp 的输出创建距离双图和相关双图?

4

1 回答 1

1

我找到的最好的解释是来自蒙特利尔大学生物科学系 Pierre Legendre 的一些演讲幻灯片 ( http://biol09.biol.umontreal.ca/PLcourses/Ordination_section_1.1_PCA_Eng.pdf )。然而,虽然这些幻灯片确实展示了手动绘制距离和相关双图的方法,但它们没有展示如何根据 prcomp 的结果绘制距离和相关双图。

因此,我通过一个示例演示了如何使用 prcomp 的输出使其与上面 pdf 中的示例等效。我将这里留给像我这样想知道如何绘制距离与相关双图以及何时使用它们的未来人(根据 Pierre Legendre)

set.seed(1)

#Run standard PCA
pca_res <- prcomp(mtcars[, 1:7], center = TRUE, scale = TRUE, retx = TRUE)

#To print a distance biplot, simply plot pca_red$x as points and $rotation
#as vectors
library(ggplot2)

arrow_len <- 3 #arbitrary scaling of arrows so they're same mag as PC scores
ggplot(data = as.data.frame(pca_res$x), aes(x = PC1, y = PC2)) +
  geom_point() +
  geom_segment(data = as.data.frame(pca_res$rotation),
                    aes(x = 0, y = 0, yend = arrow_len*PC1, xend = arrow_len*PC2),
                    arrow = arrow(length = unit(0.02, "npc"))) +
  geom_text(data = as.data.frame(pca_res$rotation),
            mapping = aes(y = arrow_len*PC1, x = arrow_len*PC2,
                label = row.names(pca_res$rotation)))

#This is equivalent to the following steps:
Y_centered <- scale(mtcars[, 1:7], center = TRUE, scale = TRUE)
Y_eig <- eigen(cov(Y_centered)) 
#Note that Y_eig$vectors == pca_res$rotation ("rotations" or "loadings")
# and Y_eig$values (eigenvalues) == pca_res$sdev**2

#For a distance biplot
U_frame <- Y_eig$vectors
#F is your PC scores, achieved by multiplying your original data by the rotations
F_frame <- Y_centered %*% U_frame

#flipping constants if needed bc PC axis direction is arbitrary
x_flip = -1
y_flip = -1
ggplot(data = as.data.frame(F_frame), aes(x = x_flip*V1, y = y_flip*V2)) +
  geom_point() +
  geom_segment(data = as.data.frame(U_frame),
               aes(x = 0, y = 0, yend = y_flip*arrow_len*V1, xend = x_flip*arrow_len*V2),
               arrow = arrow(length = unit(0.02, "npc"))) +
  geom_text(data = as.data.frame(U_frame),
            mapping = aes(y = y_flip*arrow_len*V1, x = x_flip*arrow_len*V2,
                          label = colnames(Y_centered)))

#To print a correlation biplot, matrix multiply your rotations/loadings
# by the identity matrix times your PCA standard deviations 
# (equivalent to the sqrt of your eigen values)
U_frame_scaling2 <- U_frame %*% diag(Y_eig$values^(0.5))

#And divide your PC scores by your PCA standard deviations
# (equivalent to 1/sqrt(eigen values)
F_frame_scaling2 <- F_frame %*% diag(Y_eig$values^(-0.5))

#Plot
arrow_len <- 1.5 #arbitrary scaling of arrows so they're same mag as PC scores

ggplot(data = as.data.frame(pca_res$x %*% diag(1/pca_res$sdev)), 
       aes(x = V1, y = V2)) +
  geom_point() +
  geom_segment(data = as.data.frame(pca_res$rotation %*% diag(pca_res$sdev)),
               aes(x = 0, y = 0, yend = arrow_len*V1, xend = arrow_len*V2),
               arrow = arrow(length = unit(0.02, "npc"))) +
  geom_text(data = as.data.frame(pca_res$rotation %*% diag(pca_res$sdev)),
            mapping = aes(y = arrow_len*V1, x = arrow_len*V2,
                          label = row.names(pca_res$rotation)))

ggplot(data = as.data.frame(F_frame_scaling2), aes(x = x_flip*V1, y = y_flip*V2)) +
  geom_point() +
  geom_segment(data = as.data.frame(U_frame_scaling2),
               aes(x = 0, y = 0, yend = y_flip*arrow_len*V1, xend = x_flip*arrow_len*V2),
               arrow = arrow(length = unit(0.02, "npc"))) +
  geom_text(data = as.data.frame(U_frame_scaling2),
            mapping = aes(y = y_flip*arrow_len*V1, x = x_flip*arrow_len*V2,
                          label = colnames(Y_centered)))

至于两者之间的区别(以防上面的pdf在某些时候变得不可用):

缩放类型 1:距离双标图,当感兴趣的是对象相对于彼此的位置时使用。——</p>

  • 绘制矩阵 F 来表示对象,绘制矩阵 U 来表示变量。

缩放类型 2:相关双图,当主要关注变量之间的角度关系时使用。——</p>

  • 绘制矩阵 G 来表示对象,Usc2 表示变量,其中 G = FΛ–1/2 和 Usc2 = UΛ1/2。

在缩放 1(距离双标图)中,

  • 站点沿每个轴(或主成分)具有等于轴特征值(F 列)的方差;
  • 特征向量(U 的列)被规范为长度 = 1;
  • p维排序空间(U的行)中每个物种向量的长度(范数)为1。

在缩放 2(相关双标图)中,

  • 站点沿每个轴(G 列)具有单位方差;
  • 特征向量(Usc2 的列)被规范为长度 = sqrt(特征值);
  • p 维排序空间(Usc2 的行)中每个物种向量的范数是其标准差。

在缩放 1(距离双标图)中,

  1. 对象之间的距离近似于它们在完整多维空间中的欧几里得距离。
  2. 在描述符上以直角投影对象近似于对象沿该描述符的位置。
  3. 由于描述符在全维空间中具有相等的长度 1,因此描述符在缩减空间中的投影长度表明它对该空间的形成有多大贡献。
  4. 因此,缩放 1 双图显示了哪些变量在几个维度上对排序的贡献最大(另请参见:变量的平衡贡献部分)。
  5. 描述符轴在多维空间中彼此正交(90°)。这些直角投影在缩小的空间中,不反映变量的相关性。

在缩放 2(相关双标图)中,

  1. 对象之间的距离近似于它们在完整多维空间中的马氏距离。
  2. 在描述符上以直角投影对象近似于对象沿该描述符的位置。
  3. 由于描述符在全维空间中具有长度 sj,因此描述符 j 在缩减空间中的投影长度是其标准偏差 sj 的近似值。注:变量标准化后,sj 为 1。
  4. 双图中描述符之间的角度反映了它们的相关性。
  5. 当对象之间的距离关系对解释很重要时,这种类型的双标图是不合适的;应使用距离双标图。
于 2021-01-28T20:07:06.503 回答