人に聞けない痔の悩み、これでスッキリ >>

分散共分散行列のことを調べたのですが、参考になるものがあまり見つかりません。教えてください。
分散共分散行列とは、どのようなもののことを言うのでしょうか?
また、どうしてその行列が分散を表しているのでしょうか?
その、行列の行列式?が小さければ、分散が小さいといえるのでしょうか?
良く分からないので、詳しい方、ぜひぜひ教えてください。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

多変数の確率変数の特性値の一種です。

簡単のため、まず二変数の確率変数Z=(X,Y)について説明します。

一般に二つの確率変数X,Yがあったとき、cov(X,Y)=E[(X-E(X))(Y-E(Y))]をXとYの共分散と呼びます。共分散は正にも負にもなり、雑にいって正で大きいときはXとYは正の相関を、負で小さいときはXとYは負の相関を持ち、絶対値が小さいときは、XとYは無相関に近くなります。これらの用語はよく使われるので、また調べてみてください。さて、定義からcov(X,X)はXの分散に他なりません。つまり自分との共分散は分散になるというわけです。

そこで、1,1成分にcov(X,X)を、1,2成分にcov(X,Y)を、2,1成分にcov(Y,X)を、2,2成分にcov(Y,Y)を並べた2×2の行列をZ=(X,Y)の分散共分散行列と呼びます。これは正定値の対称行列です。正定値というのは、固有値が全部非負という意味であって、これは通常の分散が非負であることに対応しています。文字通り、分散(対角成分に)と共分散(非対角成分に)が並んだ行列な分けです。

n変数の確率変数Z=(X_1,…,X_n)のときは、i,j成分がcov(X_i,X_j)なるn×n行列を、Zの分散共分散行列と呼びます。

1変数の正規分布が平均と分散で完全に分布が決定されるように、多変数の正規分布は平均ベクトル(各成分の平均)と分散共分散行列で完全に分布が決まります。この意味で、まさに多変数の分散を表すものが、この分散共分散行列ということがお分かりだと思います。少し難しい言葉を使えば、多変数版の2次モーメントを決定するもの、といえます。
    • good
    • 1

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q分散共分散行列の逆行列

以下の行列を考えます.
行列X(M行N列,成分の値は分散1のガウスノイズ)
行列Xの分散共分散行列S(M行M列),
行列Sの逆行列Y(M行M列)

N=M+1のときはN≠M+1のときに比べて行列Yの各成分の大きさがかなり大きくなる,という結果が得られました.
(計算にはMATLABの関数covとpinvを用いました.)
これは数学的に正しいことなのでしょうか.
また,正しいとしたらどうしてこのようなことが起こるのでしょうか.

行列Yの計算結果の例を以下に示します.(行列Yを500回算出し,それらの平均値を示しています.)
http://wisteria.orz.ne.jp/download/pinvcovX.jpg
縦・横方向の軸は行列Yのインデックスを,高さ方向の軸は行列Yの成分の値を示しています.
上述した現象の原因についてご教授いただけると幸いです.

Aベストアンサー

Rで試してみたら同じような結果になりました。
その結果が添付画像です。
それぞれのz軸の上限は「z:上限」で表しています。

繰り返し回数を増やしたら各成分が小さくなると思っていたのですが、逆に大きくなりました。

Nが大きくなるにつれ、単位行列に近づいていくようです。
これ自体は分散共分散行列が単位行列に近づくことから当然ですか。

試したコード
func1 <- function(x, M)
{
y <- matrix(x, ncol = M)
z <- cov(y)
c(as.vector(z), as.vector(solve(z)))
}

func2 <- function(M = 20, N = 21, R = 500)
{
x <- matrix(rnorm(M*N*R), nrow = R)
y <- apply(x, 1, function(t) func1(t, M))
z <- rowMeans(y)
list(cov = matrix(z[1:(M*M)], ncol = M), covinv = matrix(z[(M*M+1):(2*M*M)], ncol = M))
}

x <- func2(20, 21, 10000)
y <- func2(20, 21, 500)
z <- func2(20, 22, 500)
w <- func2(20, 100, 500)

par(mfrow = c(2, 2))
persp(x$covinv, zlim = c(-0.5, 10^10), xlab = "x", main = "M = 20, N = 21, 10000回の平均, z:10^10")
persp(y$covinv, zlim = c(-0.5, 10^5), xlab = "x", main = "M = 20, N = 21, 500回の平均, z:10^5")
persp(z$covinv, zlim = c(-0.5, 10^3), xlab = "x", main = "M = 20, N = 22, 500回の平均, z:10^3")
persp(w$covinv, zlim = c(-0.5, 10), xlab = "x", main = "M = 20, N = 100, 500回の平均, z:10")
par(mfrow = c(1, 1))

Rで試してみたら同じような結果になりました。
その結果が添付画像です。
それぞれのz軸の上限は「z:上限」で表しています。

繰り返し回数を増やしたら各成分が小さくなると思っていたのですが、逆に大きくなりました。

Nが大きくなるにつれ、単位行列に近づいていくようです。
これ自体は分散共分散行列が単位行列に近づくことから当然ですか。

試したコード
func1 <- function(x, M)
{
y <- matrix(x, ncol = M)
z <- cov(y)
c(as.vector(z), as.vector(solve(z)))
}

func2 <- function(M = 20, N = 21, R =...続きを読む

Q分散共分散行列は半正定値?

らしいのですが、その証明がわかりません。

参考になる本でも構いませんので、
どなたかよろしくお願いします。

Aベストアンサー

平均と分散が存在する(すなわち二次モーメントまで存在を仮定する)確率変数Yに対して
E[Y^2]≧E[Y]^2
が成り立ちます。これは左辺-右辺=E[(Y-E[Y])^2]≧0から明らかでしょう。分散が非負であることと同一です。実はこれからすぐにn次(ベクトル値)確率変数X=(X_1,X_2,…,X_n)の分散共分散行列が半正定値であることが分かります。

まず任意のn次元ベクトルv=(v_1,v_2,…,v_n)に対して、Y=v_1X_1+v_2X_2+…+v_nX_nとおきます。Yは1次元の通常の確率変数ですから、E[Y^2]≧E[Y]^2です。両辺を展開すれば、
ΣΣ{v_iv_jE[X_iX_j]}≧ΣΣ{v_iE[X_i]}{v_jE[X_j]}
となります。ただしΣはそれぞれ、i,jに関して1からnまでの和をとります。またv_i,v_jはただの実数値の定数だから期待値の前に出しています。この左辺から右辺をひくと、
ΣΣ{E[X_iX_j]-E[X_i]E[X_j]}v_iv_j≧0
となりますが、左辺は(,)を内積として、(v,Av)という形をしています。ただしAは分散共分散行列(第ij成分がE[X_iX_j]-E[X_i]E[X_j]の行列)です。vは任意だったのだから、これはAが半正定値であることを示しています。

結局、直感的には分散のn次元への一般化である分散共分散行列は、分散が非負であるのと同様に、半正定値である、というわけです。証明もほとんど同じですよね。

平均と分散が存在する(すなわち二次モーメントまで存在を仮定する)確率変数Yに対して
E[Y^2]≧E[Y]^2
が成り立ちます。これは左辺-右辺=E[(Y-E[Y])^2]≧0から明らかでしょう。分散が非負であることと同一です。実はこれからすぐにn次(ベクトル値)確率変数X=(X_1,X_2,…,X_n)の分散共分散行列が半正定値であることが分かります。

まず任意のn次元ベクトルv=(v_1,v_2,…,v_n)に対して、Y=v_1X_1+v_2X_2+…+v_nX_nとおきます。Yは1次元の通常の確率変数ですから、E[Y^2]≧E[Y]^2です。両辺を展開すれば、
ΣΣ{v_iv_j...続きを読む

Q分散共分散行列を簡単に手っ取り早く求めたい

株価データを使ってポートフォリオの収益率の分散を求めようとしています。(エクセルを使ってます)その過程で分散共分散行列が必要です。

個別銘柄を50社選び、それぞれの銘柄の月次終値を5年分用意し、それら変化率を求めました。〔(終値t+1)-(終値t)〕÷(終値t)のような感じで変化率を出しました。次にエクセルの共分散を求める関数COVARを使い、共分散を一つ一つ計算しようと思ったんですが、さすがに50社もあるのでできません。

楽に分散共分散行列を求められる方法はないのでしょうか。
また、数学は苦手ですし、プログラミングもやったことすらありませんので、簡単に求められる方法を教えてください。お願いします。

Aベストアンサー

「ツール」メニューの「分析ツール」に「共分散」があります.
「ツール」メニューに「分析ツール」が見当たらない場合は,
「ツール」「アドイン」で「分析ツール」にチェックを入れれば,
次から「分析ツール」が表示されます.
分散共分散行列が下三角行列の形で出力されます.

Q共分散行列の固有値・固有ベクトルの行列

以下のようなデータを用いて、共分散行列を生成するとします。
(各No.にはそれぞれx1~x5の5つのデータ)
x1 x2 x3 x4 x5
No.1 [2 4 5 2 1]
No.2 [3 10 8 7 9]
No.3 [11 3 2 1 6]

すると、共分散行列は3×3の正方行列になり、その固有値も3つ求まりますよね。
しかし、固有ベクトルに関してはデータがx1,x2,..,x5と5次元で考えているので、
ひとつの固有値に対して5つの成分を持つ固有ベクトルが求まりますよね。
よって、共分散行列の固有値行列は必ず正方行列になりますが、固有ベクトルの
行列は上の例の場合なら5×3行列(列は対応する固有値の数、行はベクトルの成分の数)となり、
必ずしも正方行列にはなりませんよね?そのあたりを教えて頂きたいと思います。
よろしくお願いします。

Aベストアンサー

共分散行列のik成分をA_ikと書くと,
A_ik=(1/N)Σ[j=1 to N](xij-μi)(xkj-μk)
となります。Nはデータ件数,xijはj件目のデータにおける第i変数の値,
jはデータ件数を走る添え字,
i,kは変数次元を走る添え字で,μkは第k変数の平均値
を表します。
(例で言うと,Nは生徒の人数,jは出席番号,μ1は英語の平均点,μ2は国語の平均点etc)

>共分散行列 = E[(x-E[x])(x-E[x])^t] ^tは転置 Eは期待値(平均値)
の表記に合わせると,xは列ベクトルで
2   3    11
4   10   3
5とか,8とか,2
2   7    1
1   9    6
です。
期待値をとるE{}演算は,データ件数について加えて平均することになります。

期待値の操作を行列でやりたいとすると,

>No.1の行の平均をμ1, No.2の行の平均をμ2, No.3の行の平均をμ3とします。)
>[ 2-μ1 3-μ2 11-μ3 ]
>[ 4-μ1 10-μ2 3-μ3 ]
>[ 5-μ1 8-μ2 2-μ3 ]
>[ 2-μ1 7-μ2 1-μ3 ]
>[ 1-μ1 9-μ2 6-μ3 ]
はすこし違います。平均値は,
データ件数個つくるの(生徒毎の平均)ではなく,
変数次元個つくります(科目毎の平均)。

μ1=(2+3+11)/3 第1科目(英語?)の平均点
μ2=(4+10+3)/3 第2科目(国語?)の平均点
μ3=(5+8+2)/3 第3科目の平均点
μ4=(2+7+1)/3 第4科目の平均点
μ5=(1+9+6)/3 第5科目の平均点
とした上で,
[ 2-μ1 3-μ1 11-μ1 ]
[ 4-μ2 10-μ2 3-μ2 ]
[ 5-μ3 8-μ3 2-μ3 ]
[ 2-μ4 7-μ4 1-μ4 ]
[ 1-μ5 9-μ5 6-μ5 ]
すなわち,縦に科目番号,横に生徒の出席番号で並べた行列をつくり,これを左から
転置した行列を右から掛け算します。
結果として,変数次元×変数次元の正方行列ができ,その各要素はデータ件数分を平均した値です。

共分散行列のik成分をA_ikと書くと,
A_ik=(1/N)Σ[j=1 to N](xij-μi)(xkj-μk)
となります。Nはデータ件数,xijはj件目のデータにおける第i変数の値,
jはデータ件数を走る添え字,
i,kは変数次元を走る添え字で,μkは第k変数の平均値
を表します。
(例で言うと,Nは生徒の人数,jは出席番号,μ1は英語の平均点,μ2は国語の平均点etc)

>共分散行列 = E[(x-E[x])(x-E[x])^t] ^tは転置 Eは期待値(平均値)
の表記に合わせると,xは列ベクトルで
2   3    11
4   10   3
5とか,8とか,2
2   7  ...続きを読む


人気Q&Aランキング