相関行列を計算する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 = {
n
Σ
i=1
(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マクロが完成する。