PCAまたはFAのスコアまたは負荷のサインには意味がありますか?記号を逆にすることはできますか?


37

2つの異なる関数(prcompおよびprincomp)を使用してRで主成分分析(PCA)を実行し、PCAスコアの符号が異なることを観察しました。どうすればいいの?

このことを考慮:

set.seed(999)
prcomp(data.frame(1:10,rnorm(10)))$x

            PC1        PC2
 [1,] -4.508620 -0.2567655
 [2,] -3.373772 -1.1369417
 [3,] -2.679669  1.0903445
 [4,] -1.615837  0.7108631
 [5,] -0.548879  0.3093389
 [6,]  0.481756  0.1639112
 [7,]  1.656178 -0.9952875
 [8,]  2.560345 -0.2490548
 [9,]  3.508442  0.1874520
[10,]  4.520055  0.1761397

set.seed(999)
princomp(data.frame(1:10,rnorm(10)))$scores
         Comp.1     Comp.2
 [1,]  4.508620  0.2567655
 [2,]  3.373772  1.1369417
 [3,]  2.679669 -1.0903445
 [4,]  1.615837 -0.7108631
 [5,]  0.548879 -0.3093389
 [6,] -0.481756 -0.1639112
 [7,] -1.656178  0.9952875
 [8,] -2.560345  0.2490548
 [9,] -3.508442 -0.1874520
[10,] -4.520055 -0.1761397

+/-2つの分析で符号()が異なるのはなぜですか?私は、主要なコンポーネントを使用していた場合PC1PC2回帰における予測因子として、すなわちlm(y ~ PC1 + PC2)、これは完全に私の二つの変数の影響についての理解を変更しますy私が使用した方法に応じて!どうすれば、PC1たとえば肯定的な効果がyあり、PC2たとえば否定的な効果があると言えyますか?


さらに、PCAコンポーネントの符号に意味がない場合、これは因子分析(FA)にも当てはまりますか?個々のPCA / FAコンポーネントスコア(またはローディングマトリックスの列としてのローディング)の符号を反転(反転)することは可能ですか?


10
+1。この質問は尋ねますがたくさん(因子分析については、時々 、時々 PCAについて)さまざまなバリエーションでは、このフォーラムに。これは、問題をカバーする最も人気のあるスレッドです(@Januaryの優れた回答のおかげです)。したがって、他の既存の質問と将来の質問をこの質問の重複としてマークすると便利です。タイトルを変更し、最後に因子分析に言及することで、あなたの質問をもう少し一般的なものにする自由を取りました。気にしないでください。追加の回答も提供しました。
アメーバは、モニカーを復活させる

1
符号は任意です。実質的な意味は論理的に記号に依存します。「X」というラベルの付いた要素の符号を常に反対の符号に変更し、「Xの反対側」というラベルを付けることができます。ローディング、スコアについても同様です。いくつかの実装では、便宜上、係数の符号を変更して、その中の正の値(スコアまたは負荷)が支配的になるようにします。他の実装は何もせず、あなたのサインを逆にするかどうかの決定を残します-気にするなら。統計的意味(効果の強さなど)は、その「方向」が逆転する以外は変化しません。
ttnphns

回答:


38

PCAは単純な数学的変換です。コンポーネントの符号を変更しても、最初のコンポーネントに含まれる分散は変更しません。さらに、符号を変更すると、重み(prcomp( ... )$rotation)も符号を変更するため、解釈はまったく同じままになります。

set.seed( 999 )
a <- data.frame(1:10,rnorm(10))
pca1 <- prcomp( a )
pca2 <- princomp( a )
pca1$rotation

ショー

                 PC1       PC2
X1.10      0.9900908 0.1404287
rnorm.10. -0.1404287 0.9900908

そしてpca2$loadingsショー

Loadings:
          Comp.1 Comp.2
X1.10     -0.99  -0.14 
rnorm.10.  0.14  -0.99 

               Comp.1 Comp.2
SS loadings       1.0    1.0
Proportion Var    0.5    0.5
Cumulative Var    0.5    1.0

それでは、なぜ解釈が同じままなのでしょうか?

yコンポーネント1 でPCA回帰を実行します。最初のバージョン(prcomp)では、係数が正であると言います。コンポーネント1が大きいほどyが大きくなります。元の変数に関してはどういう意味ですか?変数1(1:10a内)の重みは正であるため、変数1が大きいほどyが大きいことを示しています。

次に、2番目のバージョン(princomp)を使用します。コンポーネントの符号が変更されているため、yが大きいほど、コンポーネント1は小さくなります。PC1上のy <の係数は負になります。ただし、変数1のロードも同様です。つまり、変数1が大きくなると、コンポーネント1が小さくなり、yが大きくなります。解釈は同じです。

おそらく、それを確認する最も簡単な方法はバイプロットを使用することです。

library( pca3d )
pca2d( pca1, biplot= TRUE, shape= 19, col= "black"  )

ショー

ここに画像の説明を入力してください

2番目のバリアントの同じバイプロットは、

pca2d( pca2$scores, biplot= pca2$loadings[,], shape= 19, col= "black" )

ご覧のとおり、画像は180°回転しています。ただし、重量/荷重(赤い矢印)とデータポイント(黒い点)の関係はまったく同じです。したがって、コンポーネントの解釈は変更されません。

ここに画像の説明を入力してください


私も写真を追加しました:-)
1月

1
これは本当ですが、PCAの予測はどうですか?私は自分でPCAをコーディングしていますが、MATLABビルトインと比較すると、固有ベクトルの一部が反転していprincompます。そのため、投影中に、一部のディメンションで投影データも符号が反転します。私の目標は、係数の分類を行うことです。ここでサインは関係ありませんか?
シブスギャンブル

それで、単に私のPCをより簡単に理解するために、スコアのサインを交換したい場合、それは有効ですか?

13

この質問はこのフォーラムでよく聞かれるので、@ Januaryの優れた答えをもう少し一般的な考慮事項で補足したいと思います。

x1,x2,...xdz1,z2,...zkx1z1z2x12z1+3z223

OriginalvariablesScoresLoadings.

z1

11=1.

結論は、各PCAまたはFAコンポーネントについて、そのスコアと負荷の符号はarbitrary意的で無意味であるということです。スコアと負荷の両方の符号が同時に反転する場合のみ、それを反転できます。


これは本当ですが、PCAの予測はどうですか?私は自分でPCAをコーディングしていますが、MATLABビルトインと比較すると、固有ベクトルの一部が反転していprincompます。そのため、投影中に、投影されたデータもいくつかの次元で符号が反転します。私の目標は、係数の分類を行うことです。ここでサインは関係ありませんか?
シブスギャンブル

1
まだ問題ではありません。なぜだろうか?フリップされたデータは、分類を含むあらゆる目的で、フリップされていないデータとまったく同じです。
アメーバは、モニカーを復活させる

まあ、すべての目的ではありません。アルゴリズム間の一貫性のために、私も符号を一致させたいと思っています。ただし、コンポーネントを見るときにすべてが反転しているわけではありません。私が同じことができるように、Rはどのようにサインを選択していますか?
ミョーチ

1
@Myoch Rが何をしているのかを理解しようとするのではなく、独自の規約を発明してどこにでも適用することをお勧めします。あなたは、最初の値が正であること、または値の半分以上はなど、肯定的であるような記号を選択することができます
アメーバが復活モニカ言う

1
@user_anon逆関数はありません。
アメーバは、モニカを復活させる

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.