4

psych パッケージの principal() 関数が $score 要素を計算する方法を理解したいと思います。

相関行列ではなく共分散行列を試してみたい。

model <- principal(mtcars[8:11],nfactors=4, rotate='none', scores=T, cov=T)

基本的に、PCAのスコアは、重みとしてローディングマトリックスを使用して、元の中心データの線形結合である必要があるため、試しました:

test <- scale(mtcars[8:11], center=T, scale=F) %*% model$loadings / model$scores

principal()関数が負荷に何らかのスケーリングを使用することは理解していますが、比率は各列で同じである必要がありますが、ここではtest.

相関行列を使用すれば、これは問題になりません。例えば:

model <- principal(mtcars[8:11],nfactors=4, rotate='none', scores=T, cov=F)
test <- scale(mtcars[8:11], center=T, scale=T) %*% model$loadings / model$scores

ヘルプ ドキュメントでは、因子分析の用語が使用されているため、さらに混乱しました。誰かがここで私を啓発できることを願っています。

前もって感謝します!

4

1 に答える 1

1

psychパッケージにバグが発見されました。標準化されていない (共分散) ソリューションでは、スコアが正しく検出されません。これは次のリリースで修正される予定です (少なくとも 1 か月はリリースされません)。暫定的に、ローディング マトリックスと (中心化された) 生データを使用して手動でスコアを見つけることができます。

model <- principal(mtcars[8:11],nfactors=4, rotate='none', scores=T, cov=T)
L <- model$loadings            # Just get the loadings matrix
S <- model$scores              # This gives an incorrect answer in the current version

d <- mtcars[8:11]              # get your data
dc <- scale(d,scale=FALSE)     # center the data but do not standardize it
sc <- dc %*% L                 # scores are the centered data times the loadings
lowerCor(sc)                   #These scores, being principal components
                               # should be orthogonal 
    PC1 PC2 PC3 PC4
PC1 1              
PC2 0   1          
PC3 0   0   1      
PC4 0   0   0   1  

ここで解決されていない問題を見つけた場合はpsych、私 (パッケージ開発者) に連絡してください。

回転していないソリューションの場合、コンポーネントの負荷も直交していることに注意してください (そうあるべきです)。

factor.congruence(L,L)
    PC1 PC2 PC3 PC4
PC1   1   0   0   0
PC2   0   1   0   0
PC3   0   0   1   0
PC4   0   0   0   1 

(タッカーの係数としても知られる因子合同のバートの尺度は、(中心化されていない) 荷重の内積をとり、それぞれの列の二乗和で割ります)。ローディングの外積も見つけることができます

round( t(L) %*% L,3)
      PC1   PC2   PC3   PC4
PC1 2.742 0.000 0.000 0.000
PC2 0.000 0.721 0.000 0.000
PC3 0.000 0.000 0.142 0.000
PC4 0.000 0.000 0.000 0.051
于 2015-09-04T21:09:36.573 に答える