R 計算メモ(行列を使った分散、共分散の計算)

行列計算で分散、共分散を求める方法のメモ。

前回使った2変数データ(xとy、サンプル数5)を以下のとおり行列で表現する。
(各変数は、列ベクトルでなく、行ベクトルで表現していることに注意)
f:id:ichou1:20180930102827p:plain

元データ
# 変数x
xvar
[1] 50 60 70 80 90

# 変数y
yvar
[1]  40 70 90 60 100

センタリングする(偏差に置き換える)
f:id:ichou1:20180930103412p:plain

この行列をAと置く。

行列表現(センタリング後)
A <- matrix(c(scale(xvar, scale=F), scale(yvar, scale=F)), nrow=2, ncol=5,  byrow=TRUE)
     [,1] [,2] [,3] [,4] [,5]
[1,]  -20  -10    0   10   20
[2,]  -32   -2   18  -12   28

以下の計算により(標本)分散共分散行列が求まる。

標本分散共分散行列(各変数が行データとして表現される場合)

f:id:ichou1:20180930104835p:plain
Nはサンプル数、Tは転置行列を表す

行列計算(標本分散共分散行列を求める、行ベクトル表現)
(1 / ncol(A) ) * ( A %*% t(A)) 
     [,1] [,2]
[1,]  200  220
[2,]  220  456

N-1で割れば、不偏分散共分散行列が求まる。

行列計算(不偏分散共分散行列を求める)
(1 / (ncol(A)-1) ) * ( A %*% t(A)) 
     [,1] [,2]
[1,]  250  275
[2,]  275  570


ある論文を見ていると、「uncentered covariance matrix」という言葉が出てきた。
センタリングしないで求めた分散共分散行列のようだが、その性質を確認してみる。

センタリングしない行列をBとおく。

行列表現(センタリング無し)
     [,1] [,2] [,3] [,4] [,5]
[1,]   50   60   70   80   90
[2,]   40   70   90   60  100
行列計算(標本分散共分散行列を求める)
obs_cov <- (1 / ncol(B)) * ( B %*% t(B))  
     [,1] [,2]
[1,] 5100 5260
[2,] 5260 5640

このデータを使って標本分散を求める。

# xの標本分散
obs_cov[1,][1] - mean(xvar)^2
[1] 200

# yの標本分散
obs_cov[2,][2] - mean(yvar)^2
[1] 456

センタリングしたもの、しないものとで、xの標本分散、yの標本分散、xyの共分散の大小関係は保たれる模様だし、分散の大小関係が分かれば良いようなケースで使うものだろうか。


尚、各変数を列ベクトルで表現する場合、行列計算は以下のとおりとなる。

標本分散共分散行列(各変数が列データとして表現される場合)

f:id:ichou1:20180930115239p:plain

行列表現(センタリング後)
A <- matrix(c(scale(xvar, scale=F), scale(yvar, scale=F)), nrow=5, ncol=2,  byrow=FALSE)
     [,1] [,2]
[1,]  -20  -32
[2,]  -10   -2
[3,]    0   18
[4,]   10  -12
[5,]   20   28
行列計算(標本分散共分散行列を求める、列ベクトル表現)
(1 / nrow(A)) * ( t(A) %*% A) 
     [,1] [,2]
[1,]  200  220
[2,]  220  456