Excel VBAで偏相関係数を求める関数を作ってみた3
Excel VBAで偏相関係数を求める関数を作ってみた2 - 静粛に、只今統計勉強中で4変数以上の偏相関係数の計算方法がわかったので、さっそくユーザー定義関数を作りました。
'偏相関係数を求める Function P_Correl(参照, 列番号1, 列番号2) Dim i, j Dim Cols '変数の数 Dim Mat1(), Mat2 '相関行列・逆行列 Dim Rng1, Rng2 '相関係数を計算するセル範囲 Cols = 参照.Columns.Count '変数の数 ReDim Mat1(1 To Cols, 1 To Cols) '変数の数×変数の数の配列(相関行列) 'Mat1(相関行列)に各列の相関係数を代入 For i = 1 To Cols Rng1 = 参照.Offset(, i - 1).Resize(, 1) For j = 1 To Cols Rng2 = 参照.Offset(, j - 1).Resize(, 1) Mat1(i, j) = WorksheetFunction.Correl(Rng1, Rng2) Next Next Mat2 = WorksheetFunction.MInverse(Mat1) 'Mat2に相関行列の逆行列を代入 '逆行列の要素を2つの対角要素の積の平方根で割り,符号を逆転する P_Correl = (Mat2(列番号1, 列番号2) / _ Sqr(Mat2(列番号1, 列番号1) * Mat2(列番号2, 列番号2))) * -1 End Function
計算の仕方を調べるのにめちゃめちゃ手こずったのに、それがわかってみれば実にあっけなかったです。
3変数で試してみたら、当たり前かもですがExcel VBAで偏相関係数を求める関数を作ってみた1 - 静粛に、只今統計勉強中で作った3変数専用の関数と戻り値が一致しました。
というわけで、3変数専用の関数はお払い箱ですね。
では、架空のデータで使い方を説明しつつ、擬似相関・多重共線性・間接効果について確認してみたいと思います。
サンプル1
データは『統計学がわかる【回帰分析・因子分析編】』の第5章にある最低気温・最高気温・客数(n=20)を拝借しています。
任意のセルに P_Correl([参照],[列番号1],[列番号2])を入力します。
上の例では最低気温と客数の偏相関係数を求めています。
で、3変数全てについて計算すると、
となりました。
これをどう解釈するかですが、因果の順は、最低気温→最高気温→客数と考えるのが自然です。あくまでも説明の便宜上ですが*1、最低気温と客数の偏相関係数が相関係数より値が小さいので、最低気温の客数への影響は最高気温が媒介している(間接効果がある)可能性があります。
「最低気温が高い日は最高気温も高いことが多い→最高気温が高い日はアイスクリームが売れる。」という解釈は、そんなに不自然ではないですね。
サンプル2
上のデータを少し弄って、ウィキペディアでもおなじみ「アイスクリームの売上と水難」の架空データを作ってみました。
溺死者数が多いほど売り上げが上がる!? と思ったら、どちらも最高気温と相関があるだけで、最高気温の影響を除いた溺死者数と売り上げの偏相関係数はほとんど0でした。
これは疑似相関のパターンですね。
サンプル3
最後は「数学・物理の小テストの点数と評定平均」の架空データです(n=100)。
それほど強くはないですが、数学の点数と評定平均、物理の点数と評定平均の間には正の相関があります。そして、数学と物理には強い相関があります。
ところが、数学と評定平均、物理と評定平均の偏相関係数は、共に0.1ポイント台まで下がってしまいました。それもそのはず、数学も物理も評定平均への影響を互いに打ち消し合って算出されるのが偏相関係数なのですから。
どうやら、この3つの変数をもって(目的変数:評定平均、説明変数:数学と物理の点数にして)重回帰分析をすると、多重共線性の問題が発生してしまいそうです。
今回、偏相関係数を求める関数を作り、実際に計算してみることで、重回帰分析の説明変数が互いに独立でなければならないことが多少なりとも実感できた気がします。
*1:最低気温-客数、最低気温-最高気温のいずれも無相関検定で有意ではないので、実際は最低気温を変数から除外するのが妥当と思います。