【问题标题】:Unexpected PCA scores in RR中意外的PCA分数
【发布时间】:2013-03-14 22:16:54
【问题描述】:

给定一个数据矩阵 M,pc=prcomp(M) 提供 pc$rotation(特征向量矩阵)和 pc$x,即原始变量在 pca 空间中的得分。但是,我获得的分数与“手动”计算的内积不匹配。

例如,如果我有矩阵

m1=matrix(c(1,2,3,4,4,8,7,9,5,3,2,11),byrow=TRUE,nrow=3)

pctest=prcomp(m1) 分别为 pctest$x、pctest$rotation 返回以下内容:

Rotation:
          PC1        PC2        PC3
    [1,] -0.3751603  0.3133237 -0.5240612
    [2,] -0.5810952 -0.4802203  0.5681371
    [3,] -0.3471051 -0.5836868 -0.6211215
    [4,] -0.6333255  0.5749142  0.1295694


pctest$x
           PC1       PC2           PC3
     [1,]  5.11167 -1.326545 -1.110223e-16
     [2,] -4.05543 -2.728072 -1.942890e-15
     [3,] -1.05624  4.054616  2.831069e-15

现在,变量 1 在 PCA 轴 2 上的得分(例如)应该只是 m1[1,] 在 pctest$rotation[,2] 上的内积,即

        m1[1,]%*%pctest$rotation[,2]
        [,1]
        [1,] -0.09852071

而不是pctest$x[1,2],即-1.3265

这只是缩放问题,还是 $x 返回的不是原始变量在 PCA 轴上的投影?

【问题讨论】:

  • +1 以获得清晰简洁的问题,并提供可重现的代码。

标签: r pca


【解决方案1】:

阅读?prcomp 的文档可以回答您的问题:计算是通过(居中和可能缩放的)数据矩阵的奇异值分解来完成的......

您需要先将 m1[1,] 居中并缩放,然后才能将其与相应的 PCA 向量相乘。这可以通过将 centerscale 参数设置为 FALSE 来轻松观察到,之后:

all.equal(m1 %*% pctest$rotation, pctest$x)
[1] TRUE

【讨论】:

  • 如果您将此作为答案,则更中肯的答案会更合适。正如您已经做过的那样,像这样更模糊的提示最适合作为评论。
  • 这并不能真正回答我的问题。每个变量的分数仍然应该是它在 PCA 向量上的投影。当我取 m 中的变量(例如,m1[1,])和相应的 PCA 向量(不管它是特征向量还是从 SVA 分解计算得出)的内积时,我没有得到 pca$x 中的分数。
  • @user1815498:关键是计算是在居中并可能缩放数据矩阵上完成的。您必须先将 m1[1,] 居中并缩放,然后才能将其与相应的 PCA 向量相乘。
  • 我赞成@PaulHiemstra 的回答,尤其是FASLE。 :)
  • @JoshuaUlrich 我们可以分享代表吗?我应该得到至少 23.1% 的编辑我的东西 :)。还有什么比将FASLE 用于FALSE 更好的方法,比如使用保险库来解决故障。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 2018-04-28
相关资源
最近更新 更多