そこそこＲを使えるようになるための練習帳：Mac 版
2019

11 日目：因子分析（１）
今日は，いよいよ因子分析をやってみます。とはいっても，命令はそれほど難しいものではありません。ただ，手間と時間がかかります…
まず因子分析の第 1 ステップは，固有値を求めて，抽出因子数の目処を立てることです。
固有値の推移をみるためには，いくつかのコマンドがありますが，そのうちの２つを紹介しておきます。なお，データは昨日からのものを使います。xb には b1 から b20 までの変数だけを集めてあります。
まずは固有値の算出と，その推移の確認を行ってみます。シンプルなやり方なら，psychパッケージにある VSS.scree( )を使います。psych パッケージを呼び出しておいて，VSS.scree(xb)
これで以下のようなスクリープロットを表示してくれます。
なお，VSS.scree(x[5:24])という指定も可能です。

65432
10

Eigen values of components

7scree plot

51015component number

11-1

20そこそこＲを使えるようになるための練習帳：Mac 版
2019

ご丁寧に，固有値１のところに線を引いてくれているので，見やすいと思います。今回のデータならば，６つが 1 を超えています。固有値の推移から判断すると３因子も考えられます。
スクリープロットは目で推移を確認するにはよいのですが，固有値の正確な値も必要でしょう。固有値の計算には，eigen( )という関数が準備されています。これは相関マトリックスから計算するようなので，まずは cor で相関マトリックスを準備しておいて，それをeigen( )に渡すという手順でやります。なお eigen( )は，$values と$vectors という２つの結果を表示しますが，固有値は$values の方です。
xb.cor <- cor(xb, use="complete.obs")
eigen(xb.cor)
プロットと対比すると，確かに固有値がプロットされていることが確認できると思います。
さて，抽出する因子数に目処をつけるもう１つの方法として，平行分析というものを紹介しておこうと思います。これも psych パッケージに入っているものです。以下の命令を出してみてください。
fa.parallel(xb)fa.parallel(x[5:24]) も可
場合によって…
Loading required package: MASSというメッセージが出るかもしれませんが，これは気にしなくてよいです。MASS というパッケージも利用するので，それを組み込みましたということです。どうも R は，パッケージを読み込んでいなければエラーを表示する場合と，自動的に読み込んでくれる場合があるようです。
さらに続けてParallel analysis suggests that the number of factors = 6 and thenumber of components = 3という表示が R コンソールに出てきて，Quartz に新しい図が描かれます。
R コンソールの表示の方は訳すまでもないでしょうが，「平行分析では，６因子，および３成分が示唆されます」くらいでしょうか。
11-2

7Parallel Analysis Scree Plots

123456

PC Actual Data
PC Simulated Data
PC Resampled Data
FA Actual Data
FA Simulated Data
FA Resampled Data

0eigenvalues of principal components and factor analysis

そこそこＲを使えるようになるための練習帳：Mac 版
20195101520

Factor Number

さてこの平行分析ですが，イメージとしては，分析するデータと同じ変数の数，同じサンプル数の乱数行列を作り，そこから相関行列を導き固有値を求めるという作業を行っています。このランダムな状況から生じた固有値の推移と，分析データの推移を比較し，ランダムなものよりも大きい固有値の個数だけ因子を抽出しようという考え方です。出力される図の中で赤の波線になっている部分が，乱数から作られた固有値の推移です。
fa.parallel(xb) は ， こ の平 行分 析 を 2 種 類 や っ て くれ ま す。 先 に やっ た
VSS.scree(xb) の結果と見比べると，PC Actual Data という「× 」マークがVSS.scree(xb)の結果と同じことがわかります。論文で一般的に固有値として言及されるものは，この「×」マークの方です。これの推移を赤い点線の推移と比較すると，３つ目までは「×」が上に，それ以下は「×」が下に位置しています。ここから，３つの因子をとり出すことが適当という示唆を得ることができます。
もうひとつの「△」の方が因子分析による固有値ですが，私も今一つこの値を理解できていません…。
さて，抽出する因子数に目処が立ったなら，次に因子分析に入ります。

11-3そこそこＲを使えるようになるための練習帳：Mac 版
2019

f1 <- fa(xb, nfactors=3, fm="pa", rotate="promax")
print(f1, sort=TRUE, digit=3)
たとえばこんな感じです。因子分析は fa()という関数になりますが，この結果を一度何かに保存して，print で出力をコントロールするという方法をとる方がやりやすいでしょう。
fa(xb, nfactors=3, fm="pa", rotate="promax")だけでも結果を返してくれますが，因子パターンによる並び替えをしてくれないので，結果を読み取りにくいです。
fa()の中身はというと，まずデータを示す xb（x[5:24]も可），nfactors=で抽出する因子数を，fm=で因子抽出方法を，rotate=で回転の種類を指定します。因子抽出方法としては，"minres"でミンレス法（最小残差法），"pa"で主因子法，"ml"で再尤法，"gls"で一般化最小二乗法などと指定できます。回転については，プロマックス回転の"promax"，バリマックス回転の"varimax"など様々な指定ができます。回転をしない場合は"none"です。ヘルプを参照するとこれらの選択肢はとても多いことがわかるでしょう。論文やネット情報をあたれば，それぞれの方法の特徴もつかめると思います。適切な解を求めて，いろいろと試してください。
print の方はだいたい見当がつくと思います。sort=TRUE は並び替えをするかどうか，digit=は負荷量（パターン）の表示桁数をコントロールします。

本日はここまでにしますので，いろいろな手法の分析を試してみてください。そして，抽出する因子数，抽出方法や回転方法が違えば，結果が少し，場合によってはかなり変わってくることを確認してください。

★時に，SPSS など他の分析ソフトでの結果と R の結果，まれに R の Win，Mac 間でも，「結果が同じにならない」ことが起きます。今回の因子分析でも因子抽出法に最尤法を選択した
場合などは，わずかな違いとは言えないような違いが生じることもあります。これは，計算過程のアルゴリズムや設定などいろいろな原因があるようです。このような差は生じうるものなので，論文や報告書には使った分析ソフトの情報を記入しておきます。

11-4