Rのpsychパッケージのfa関数の引数のrotateで"Promax"と"promax"で結果が違うって知ってた?
自分は今まで知らなかった。
"Promax"のほうはpromax斜行回転して解をもとめる、"promax"のほうはカイザーの正規化しながらpromax斜行回転して解をもとめているとのこと。
なんで今さらそんなことに気づいたかというと、psychでfa関数を使うときに何も考えずにGPArotationパッケージをlibraryで読み込んでいたけど、これって毎度いるのか? と思ってソースコードを覗いていて
Promax = {pro <- Promax(loadings,...) #Promax without Kaiser normalization loadings <- pro$loadings Phi <- pro$Phi rot.mat <- pro$rotmat}, promax = {#pro <- stats::promax(loadings,...) #from stats pro <- kaiser(loadings,rotate="Promax",...) #calling promax will now do the Kaiser normalization before doing Promax rotation loadings <- pro$loadings rot.mat <- pro$rotmat # ui <- solve(rot.mat) # Phi <- cov2cor(ui %*% t(ui)) Phi <- pro$Phi },
と書いているのをみて、カイザー正規化……となって調べたらpsych::kaiserのドキュメントに
note Prepared in response to a question about why fa oblimin results are different from SPSS.
とあって、SPSSの結果と合わせるために"promax"の方では調整が入っている様子。
ちゃんとpsych::faのドキュメントのrotateのところにも
SPSS seems to do a Kaiser normalization before doing Promax, this is done here by the call to "promax" which does the normalization before calling Promax in GPArotation.
って書いてあって、ちゃんとドキュメント読もうと思った。でも、これだけではpromaxでSPSSの結果とは一致しない様子。
Rで因子分析 商用ソフトではできないあれこれ | Sunny side up! によると、共通性の平方根で重み付けていないためだそうで、結果を一致させるための関数 RでSPSSやSASのプロマックス回転と同じ結果を出す関数作りました | Sunny side up! も公開されている。
あと、当初調べていたGPArotationパッケージはlibrary("GPArotation")で呼び出さなくても行けそうだった。 GPArotationが必要な回転が選択された等の処理のときに、requireNamespace('GPArotation')されて、インストールされていないとエラーは返すし、libraryで呼び出されていないとgetFromNamespaceされるので結局、呼び出そうが呼び出さまいが名前空間的にはあんまり変わらないのかもしれない。