相関行列を計算するEXCELマクロ
相関行列とは、相関係数を並べたものであり、その意味から対称行列になる。
相関係数は、2つの系列の似ている度合いを測る尺度のことで、-1〜1の間の値をとる。2つの系列
は要素が同数でなければならず、系列それぞれをベクトルとみなしたとき、両ベクトルが同じ向き(一
方のベクトルを正の定数倍したとき他方のベクトルになる。)の場合相関係数が1、逆の向きの場合相
関係数が−1になり、両ベクトルが直交している場合相関係数が0になる。
2つの系列の要素がX1、X2、・・・、Xn とY1、Y2、・・・、Yn であるとしたとき、相関係数 rXY は次式で計
算される。
rXY = vXY / sXsY
ただし、vXY は X と Y の共分散であり、sX とsY はそれぞれ系列 X と Y の標準偏差である。さらに、
共分散 vXY は次式で計算されるものである。
vXY = { | | (Xi-X#)(Yi-Y#)} / n |
X# とY# はそれぞれ系列XとYの平均である。Xi-X# と Yi-Y# はそれぞれ系列XとYの偏差であるので、
共分散 vXY は系列XとYの偏差の積 (Xi-X#)(Yi-Y#) の平均である。Xi=Yi (i=1,2,・・・,n)であるとき、
共分散は分散に等しくなり、相関係数 rXY = rYX は1になる。また、XとYを入れ替えても計算結果が
変わらないので
rXY = rYX , vXY = vYX
となる。
系列がX、Y、Zと3つあるときには、相関係数はrXY = rYX、rXZ= rZX、rYZ= rZYだけあることになり、こ
れらを次のように行列で表したものが相関行列Rである
┌rXX rXY rXZ┐ ┌ 1 rXY rXZ┐
R =│rYX rYY rYZ│=│rXY 1 rYZ│
└rZX rZY rZZ┘ └rXZ rYZ 1┘
|
同じように共分散を行列で表したものもよく用いられ、分散共分散行列と呼ばれる。
┌ vXX vXY vXZ ┐ ┌ vXX vXY vXZ ┐
V =│ vYX vYY vYZ │=│ vXY vYY vYZ │
└ vZX vZY vZZ ┘ └ vXZ vYZ vZZ ┘
|
この行列は、分散vXX、vYY、vZZと共分散vXY、vXZ、vYZ等が共に含まれているため、このように呼
ばれる。相関行列Rと分散共分散行列Vの間には次の関係がある。
┌ sX 0 0 ┐-1
R =│ 0 sY 0 │
└ 0 0 sZ┘
|
|
┌ sX 0 0 ┐-1
V│ 0 sY 0 │
└ 0 0 sZ┘
|
|
┌ 1/sX 0 0 ┐ ┌ 1/sX 0 0 ┐
=│ 0 1/sY 0 │V│ 0 1/sY 0 │
└ 0 0 1/sZ┘ └ 0 0 1/sZ┘
|
|
相関行列を求める手順としてはいくつかのものが考えられるが、ここでは、まず分散共分散行列Vを
求め、次に上式を用いて相関行列Rを求める手順を用いる。
以下では、相関行列を計算するExcelマクロを考える。
プログラムを一般化するために、系列の個数はkであり、それぞれの要素(データ)数がnであるも
のとする。さらに、大きさn×kの配列Xを用意し、Xの第i列に第i系列のデータを代入する
ものとする。
【手順1】系列毎の平均を計算する。
平均を代入するための大きさkの配列bを用意し、配列bの第i要素に第i系列の平均を代入するこ
とにする。
ReDim b(k)
For i = 1 To k
b(i) = 0
For j = 1 To n: b(i) = b(i) + X(j, i): Next j
b(i) = b(i) / n
Next i
【手順2】各平均を対応する系列の要素から引き、偏差系列を求める。
大きさn×kの配列Yを用意し、偏差を代入することにする。
ReDim Y(n, k)
For i = 1 To k
For j = 1 To n: Y(j, i) = X(j, i) - b(i): Next j
Next i
【手順3】YTY を計算し、結果の全要素をnで割ったものが分散共分散行列になる。各自で確認しな
さい。
大きさk×kの配列Vを用意し、分散共分散行列を代入することにする。
ReDim V(k, k)
For i = 1 To k
For j = 1 To k
d = 0
For c = 1 To n: d = d + Y(c, i) * Y(c, j): Next c
V(i, j) = d / n
Next j
Next i
ここで変数名cやdを用いているのは、変数名kとsが他で使われているためである。
【手順4】分散共分散行列から相関行列を求めるためには、標準偏差(分散の平方根)が必要である
が、分散共分散行列の対角要素が分散であるので、これらを用いて標準偏差を求める。
大きさkの配列sを用意し、標準偏差を代入することにする。
ReDim s(k)
For i = 1 To k
s(i) = Sqr(V(i, i))
Next i
Sqr()は、VBで平方根を計算する関数である。
【手順5】分散共分散行列Vの第i列をi番目の標準偏差s(i)で割り、第j列をj番目の標準偏差s(j)で割
ることで相関行列Rを求めることができる。
ReDim R(k, k)
For i = 1 To k
For j = 1 To k
R(i, j) = V(i, j) / s(i) / s(j)
Next j
Next i
これらのプログラムの前に、系列の個数k、データ数n、データXを読み込む部分を追加し、後ろに求
められた相関行列Rを出力する部分を追加することで、相関行列を計算するExcelマクロが完成する。
|