いきなり因子分析(その2):MAPやBICや平行分析による因子数の決定
以前に書いた記事の続き。
nekomosyakushimo.hatenablog.com
前回は固有値を求めスクリープロットを書いて因子数を決定したが、因子数の決め方にも色々あるらしいので、それを試してみる。参考にしたのは関西学院大の清水先生の次のスライド。この記事の内容はほぼスライドにしたがっただけなので、詳しい解説が読みたい方はスライドをみると良い。
あと、これらの方法の説明については堀先生による次の論文も参考にした。
因子数の決め方いろいろ
因子数を決める基準も様々にあるそうだ。前回の記事では、ガットマン基準とスクリープロット基準の合わせ技のような感じで決めたと思う。
カイザー・ガットマン基準
相関行列の固有値が1を超えるものを選ぶ方法。
スクリープロット基準
固有値をプロットして、大きさの変化がなだらかになる直前の因子数を選ぶもの。
MAP基準
MAPとはMinimum Average Partialの略で日本語にすると最小偏相関平均らしい。主成分を統制変数におき、観測変数間の偏相関係数を求めて、その2乗平均を最小にする主成分数を因子数にするものらしい。
情報量基準
ざっくりと言えばモデルのデータへのあてはまりとモデルの単純さを組み合わせたものが情報量基準。データにほどよくあてはまってほしいけれど、複雑になりすぎてほしくないみたいな話。AICだのBICだの色々あるのだけれど、スライドだとBICをオススメしている。(BICの方がパラメータ数のペナルティが大きいようだ)
平行分析
アイディアとしてはカイザー・ガットマン基準の改定。これはデータと同じサンプルサイズと変数の数で乱数を発生させて、その相関行列の固有値の推定を行い、乱数データの固有値の方が大きくなる一つ前の因子までとる方法らしい。乱数データを扱うことで、標本誤差の影響を考慮できるそうだ。
MAPとBICを算出
という訳で実際にやってみる。使用するデータは前回と同じでHolzingerSwineford1939
を使用する。
MAPで求めるときにはpsych
パッケージのvss()
という関数を使うらしい。引数にはデータと、推定する因子数を予想より多めに入力するそうだ。
library(psych) vss(dat[,7:15], n=8)
まずMAPについてだが、中断のあたりにThe Velicer MAP achieves a minimum of 0.06 with 2 factors と書いてありMAP基準だと2因子を提案している。
そのすぐ下にBIC achieves a minimum of NA with 3 factorsと書いてありBICによる情報量基準だと3因子が提案されている。
下の方には、因子数ごとのガチャガチャとした統計量が出ているが、MAPという列に注目すると、たしかに因子数2の行が最小の値になっている。また、BICという列に注目すると因子数3の行がやはり最小になっている。
平行分析
こんどは平行分析の方をやってみる。fa.parallel()
という関数を使う。スライドをみると、引数にリストワイズしたサンプルサイズを指定する必要があるそうだが、使っているデータは欠損を含まないので、そのままサンプルサイズの301を入力する。n.iter
というところはとりあえずスライドと同じ50にしておいた。関数のhelpをみるとデフォルトは20。
fa.parallel(cor(dat[,7:15]), n.obs=301, n.iter=50 )
コンソール画面にはシンプルに推奨する因子数がでてくる。
そして、前回の記事に書いたスクリープロットにいくらか線が加わったものが作図される。PCというのが主成分分析でFAというのが因子分析の結果である。赤い色の点線と交差した、1つ前の因子数/主成分数が提案される数ということで、今回の場合にはどちらも3つを提案している。
ちなみに、主成分のACUTUAL DATAの線は前回、固有値をプロットしたスクリープロットと全く同じである。
因子数の決定基準
様々な基準があったが推奨する因子数が全て一致すればそれを採用すれば良いらしい。違う場合には、MAPはマイナー因子を拾わない傾向があり、平行分析はやや多めに因子数を提案するようなので、理論や解釈可能性をベースにその間で決めていくと良いらしい。
ちなみに今回の分析をまとめると次の表のようになるので、このデータについては因子数3を採用するのが良いと言えそうである。
基準 | 因子数 |
---|---|
ガットマン | 3 |
スクリー | 3 |
MAP | 2 |
BIC | 3 |
平行分析 | 3 |