R 計算メモ(行列を使った分散、共分散の計算)
行列計算で分散、共分散を求める方法のメモ。
前回使った2変数データ(xとy、サンプル数5)を以下のとおり行列で表現する。
(各変数は、列ベクトルでなく、行ベクトルで表現していることに注意)
元データ
# 変数x xvar [1] 50 60 70 80 90 # 変数y yvar [1] 40 70 90 60 100
センタリングする(偏差に置き換える)
この行列を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
以下の計算により(標本)分散共分散行列が求まる。
標本分散共分散行列(各変数が行データとして表現される場合)
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の共分散の大小関係は保たれる模様だし、分散の大小関係が分かれば良いようなケースで使うものだろうか。
尚、各変数を列ベクトルで表現する場合、行列計算は以下のとおりとなる。
標本分散共分散行列(各変数が列データとして表現される場合)
行列表現(センタリング後)
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