2

データ行列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

ここで、PCA軸2の変数1のスコア(たとえば)は、pctest $ rotation[、2]のm1 [1、]の内積である必要があります。

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

pctest $ x [1,2]ではなく、-1.3265

これは単なるスケーリングの問題ですか、それとも$ xは元の変数のPCA軸への射影以外のものを返しますか?

4

1 に答える 1

3

ドキュメントを読んで、?prcompあなたの質問に答えてください。計算は、(中央に配置され、場合によってはスケーリングされた)データ行列の特異値分解によって行われます。

m1[1,]対応するPCAベクトルで乗算する前に、中央に配置してスケーリングする必要があります。centerこれは、引数とscale引数をFALSE後に設定することで簡単に確認できます。

all.equal(m1 %*% pctest$rotation, pctest$x)
[1] TRUE
于 2013-03-14T22:18:48.053 に答える