因子分析の<沼>に片足だけ突っ込んでみた7
『マンガでわかる統計学 因子分析編』で解説される手順をエクセルExcelで確かめながら行う、因子分析の学習の続きです。
前回は、Step16まで進めましたが、その次のバリマックス回転のやり方がわからなくて、さあ困った。
というところで終わりました。
いつもどおり、困ったときのgoogle頼みで探したら、割とあっさり見つかりましたよ。
基準化バリマックス回転の数理と計算例がかなり詳しく説明されていますので、これならなんとかなりそうです♪ ほんとにありがたいことです。
というわけで、計算を再開してみましょう。
(1) 因子負荷量を基準化する
因子負荷量を基準化するためには、共通性の平方根で割る由ですので、以下の式で共通性を計算します。(「Ctrl + Shift + Enter」をお忘れなく。)
次に、因子負荷量を共通性の平方根で割りますが、因子負荷量と共通性の対応は、以下のとおり行ごとになります。
(2) 第k因子と第k'因子を組にして回転角θを求める
数理の説明が理解できていないので、計算だけなぞっています。
上図のE列には、G列の数式が入力されています。
見慣れない数式が並んでいるかと思いますが、SUMX2MY2とSUMPRODUCTはワークシート関数ですので、知らない方はググってみてください。
その下の3つの関数(SUM_X2MY2_2,SUM_XY_2,SUM_X2MY2_XY)は自作のユーザー定義関数です。
ソースコードはこちら。
'二つの配列で対応する配列要素の平方差の二乗を合計する
Function SUM_X2MY2_2(参照1, 参照2)
Dim i, Tmp
If 参照1.Rows.Count = 参照2.Rows.Count Then
For i = 1 To 参照1.Rows.Count
Tmp = Tmp + (参照1(i) ^ 2 - 参照2(i) ^ 2) ^ 2
Next
SUM_X2MY2_2 = Tmp
Else
SUM_X2MY2_2 = CVErr(xlErrNA)
End If
End Function
'二つの配列で対応する配列要素の積の二乗を合計する
Function SUM_XY_2(参照1, 参照2)
Dim i, Tmp
If 参照1.Rows.Count = 参照2.Rows.Count Then
For i = 1 To 参照1.Rows.Count
Tmp = Tmp + (参照1(i) * 参照2(i)) ^ 2
Next
SUM_XY_2 = Tmp
Else
SUM_XY_2 = CVErr(xlErrNA)
End If
End Function
'二つの配列で対応する配列要素の平方差と配列要素の積を合計する
Function SUM_X2MY2_XY(参照1, 参照2)
Dim i, Tmp
If 参照1.Rows.Count = 参照2.Rows.Count Then
For i = 1 To 参照1.Rows.Count
Tmp = Tmp + (参照1(i) ^ 2 - 参照2(i) ^ 2) * 参照1(i) * 参照2(i)
Next
SUM_X2MY2_XY = Tmp
Else
SUM_X2MY2_XY = CVErr(xlErrNA)
End If
End Function
こんな調子で、tan(4θ) までは順調に計算できたのですが、
分子と分母の符号から表17.2.4に従って-π<4θ<πを選び、θを決定する。
!?
計算例を見ると の逆正接から を引いて4で割っていますが、どうやらそれは、分母も分子も-だから、のようです。
分母 | |||
---|---|---|---|
- | + | ||
分子 | + | 第2象限 | 第1象限 |
- | 第3象限 | 第4象限 |
今回は、分子が+で分母が-の第2象限ですから、計算例そのままというわけには行きません。
いよいよ手詰まりか。
とも思いましたが、『マンガでわかる統計学 因子分析編』には
-36°という答えがあらかじめ示されていますので、答えに合わせて数式を弄ってみることにしました。
何パターンか試していたら、割とすぐ =-(ATAN(E46)+PI())/4 が見つかりました。これでぴったり-36°。
このときは、リバース・エンジニアリングだぜ、うぇ~い!
とか言って、快哉を叫んだのですが・・・