2016-04-16 8 views
0

データセットUSArresstsを使用してprincomp()principal()を使用してRでPCAを実行しようとしました。しかし、ローディング/ローテーションとスコアの2つの異なる結果が得られました。princomp()とprincipal()でRでPCAを実行すると異なる結果

まず、元のデータフレームを中央に置き、正規化して、出力を比較しやすくしました。

princompPCA$loadings 
principalPCA$loadings 

あなたは差がある理由を説明するために私を助けてくださいでした:

library(psych) 

trans_func <- function(x){ 
    x <- (x-mean(x))/sd(x) 
    return(x) 
} 

A <- USArrests 
USArrests <- apply(USArrests, 2, trans_func) 

princompPCA <- princomp(USArrests, cor = TRUE) 
principalPCA <- principal(USArrests, nfactors=4 , scores=TRUE, rotate = "none",scale=TRUE) 

は、それから私は、次のコマンドを使用して負荷とスコアの結果を得ましたか。これらの結果をどのように解釈できますか?

+0

"原則として、princompとは異なり、これは最良のnfactorのサブセットを返します。" – chinsoon12

+0

さらに、回帰重みは、相関行列の逆数と成分負荷の積で求められます。これは、コンポーネントスコアが標準化された入力の標準スコア(平均= 0、sd = 1)であるという結果をもたらします。 princompのスコアはこの違いを示していますが、princompはデフォルトではデータマトリックスを標準化しておらず、コンポーネント自身も標準化されていません。 – chinsoon12

答えて

1

?principalのヘルプ文書の最後に:

「固有ベクトルは、因子分析におけるより一般的なコンポーネントの負荷を生成する固有値のsqrtによって再スケーリングされます。」

したがってprincipalは、スケールされた読み込みを返します。実際には、principalは主成分法で推定された因子モデルを生成します。

+0

あなたのデータ行列の名前が 'd'であるとします。次に、dの共分散行列を計算し、固有分解を行うことができます。対応する固有値の固有ベクトル時間sqrtの最初の列を使用すると、 'principal(d、rotate = "none"、covar = T)の同じ出力が得られます – ANuo

+0

thanks @Axeman – ANuo

関連する問題