教育社会学の勉強・備忘録

教育社会学のお勉強メモ。Macユーザーのための記事もたまに書きます。

Rのpsychパッケージに含まれる探索的因子分析関数 fa() では不適解が発生しないらしい

2015/01/24追記:

現在のバージョン psych 1.5.1 では、Heywood case が検知されると Warning が出るようです。

とのこと、はてブコメントにてお知らせいただきました。コメントを下さったid:hoxo_m様、ありがとうございます。

したがって表題の問題は、最新バージョンでは発生しないものと思われます。

ただ古い文献などにはこの問題が載っている可能性があること、また別の問題の解決に役立つ可能性があることを考え、本記事は残しておきます。

本題

Rのpsychパッケージに含まれるfa関数で最尤法による探索的因子分析を行うと、本来不適解(Heywood Case)になるようなデータであっても不適解が発生しないようです。

不適解とはつまり、因子分析の結果、いずれかの独立変数の共通性(communarity)が1を超えることを言いますが、fa関数で因子分析を行った場合、共通性は0.995を超えない(=独自性(uniqueness)が0.005を下回らない)ようにバウンディング(値の丸め込み)が行われるようです。

したがって逆に言えば、共通性が0.995(=独自性が0.005)となっている独立変数が発見された場合、それは不適解が発生している可能性があるということになります(もしかすると実際に共通性が0.995であるかもしれないので注意が必要です。そんなことはあまりないかもしれませんが)。

またこの事実はどうやらfaのヘルプには書いていないようで、注意が必要です。ネット上でもいろいろ調べてみましたが、どこにも関連する情報は見当たりませんでした。

共通性が0.995を超えたらWarningを出すなり反復を停止するなりしてくれればいいんですが、どうもそうではないみたいで、しれっと結果を出すようです。

ちなみにこの事実は、「豊田秀樹編著、2012、『因子分析入門-Rで学ぶ最新データ解析』東京書籍」の第1章の章末演習問題(p.32)の脚注に、申し訳程度に書いてある部分から知りました。ふーむ。

SASSPSSといった統計ソフトウェアでは、共通性を求める最尤法の反復試行中に共通性が1を超えることがあった場合、ちゃんと警告が表示されるようです。

かわりに factanal を使う

Rでの最尤法による探索的因子分析は、statsパッケージのfactanal関数でも行うことができます。

fa関数との違いはfa関数のヘルプに書いてあるのでそちらに譲るとして、factanal関数ではfa関数で0.005と固定されていた独自性の丸め込みの下限値を、自分で指定できるようです。

指定の仕方は、これもヘルプを読めばわかりますが、factanal()の引数にcontrol = list(lower = 設定したい独自性の下限値)と追加してやるだけで大丈夫です。何も指定しない場合は、lower=0.005として処理されます。

ただこちらも、fa関数と同じく内部では最尤推定optim関数を用いているようで(optim関数については後述)、独自性がこの下限値になっても特にWarningを出したりはしないようです。

いちおう fa のソースを見てみる

現在のpsychパッケージの最新バージョン(1.3.10.12)のfa関数のソースを見てみましたが、どうやらfa関数内でコールされているfac関数の、さらにその中でコールされているoptim関数の引数として、独立性の下限値が0.005(=共通性の上限値が0.995)となるように固定されているようです。

optim関数は汎用最適化関数と呼ばれる代物で、この関数が因子分析の処理の中の共通性の最尤推定を担当しているようです。

fac関数はoptim関数をコールして最尤推定をしたりだとか、因子分析の全体の処理を担当しているようで、psychパッケージの内部関数のようです。普通にコンソールから呼ぶこともできます。

で、optim関数のヘルプを読んでみたところ、返り値として一応エラーメッセージが用意されているようでした。

このエラーメッセージをどうにかfa関数に届くように変えられれば、不適解であることがWarningとして表示できたりするのでしょうか。独立性が下限値を超えたときにエラーが出るのかどうかはちゃんとソースを読んでいないのでわかりませんが…

Rは勉強し始めたばかりでよくわからないので、もう少しちゃんとシンタックスを勉強したら取り組んでみようかな…それかお詳しい人、何か教えていただければ幸いです。