StatModeling Memorandum

StatModeling Memorandum

StanとRとPythonでベイズ統計モデリングします. たまに書評.

確率変数の変数変換とヤコビアンに慣れる

確率変数の変数変換においてヤコビアンを使う場合を簡単にまとめてみました。

●Q1. 以下は1.00…が出力されます。なぜですか?
sum <- 0
max <- 10000
for(i in 1:max){ sum <- sum + var(rnorm(5)) }
print(sum/max)

10000回を十分大きな数とみなせば、これは変数f:id:StatModeling:20201114152451p:plainの平均値が出力されると解釈できます。ここでf:id:StatModeling:20201114152423p:plainは平均0, 標準偏差1の正規分布からランダムに抽出された5サンプルであることに注意して式変形すると、

f:id:StatModeling:20201114152426p:plain

となります。式の変形の途中にあるf:id:StatModeling:20201114152432p:plainは母集団の標準偏差を表します。今回は1です。ここで、f:id:StatModeling:20201114152436p:plainは教科書に載っているように自由度4のカイ2乗分布に従います(この証明もそんなに難しくなく重要ですが今回はパスします)。また、自由度4のカイ2乗分布の平均値は4です。よってf:id:StatModeling:20201114152440p:plainの平均値f:id:StatModeling:20201114152443p:plainは、

f:id:StatModeling:20201114152447p:plain

となります。Q1.の最終的な出力は1となります。

●Q2. 以下は0.94…が出力されます。なぜですか?
sum <- 0
max <- 10000
for(i in 1:max){ sum <- sum + sqrt(var(rnorm(5))) }
print(sum/max)

こちらも同様に変数f:id:StatModeling:20201114152451p:plainの平均値が出力されると解釈できます。まずQ1と同様に式変形をします。

f:id:StatModeling:20201114152455p:plain

すると、今回は[f:id:StatModeling:20201114152459p:plainの平均を取ることが簡単にはできません。ですのできちんとf:id:StatModeling:20201114152440p:plainの分布から計算します。さてf:id:StatModeling:20201114152436p:plainが自由度4のカイ2乗分布に従う時、f:id:StatModeling:20201114152440p:plainはどんな分布になるでしょうか?


この問いは「確率変数の変数変換」という確率・統計のオーソドックスな問題です。ちなみにカイ2乗分布やF分布やt分布やコーシー分布も、正規分布から抽出されたサンプルたちの、サンプルの値・サンプル数・母平均・母標準偏差・標本平均・標本標準偏差といったものを足したり引いたり掛けたり割ったりするうちにできた分布です。検定はそれらの分布を使っています。ただし、そのような変数変換はたいてい面倒くさいです。私のような実務家にとっては、目的はある問題を速く解くことにあります。その際は手計算などをすっとばしてブートストラップなどのシミュレーションでややこしい分布を求めることが一番よいこともしばしばです。しかし、今回のQ2.のようにしばしば“納得できない”ことがあります。そのような場合にはぜひ一度手計算で分布を求めてみるのがよいと思います。

変数変換のステップ

変数変換の基本アイデアは下の図のf:id:StatModeling:20201114152503p:plainが成り立つはずというものです。なので変換後の確率密度関数f:id:StatModeling:20201114152506p:plainになります。このf:id:StatModeling:20201114152510p:plainf:id:StatModeling:20201114152436p:plainの世界とf:id:StatModeling:20201114152440p:plainの世界の体積を測る目盛りの違いの補正のようなものです。ヤコビアン(Jacobian)と呼ばれます。

f:id:StatModeling:20201114152516p:plain

変数変換の具体的なステップですが以下のようになります。

  1. f:id:StatModeling:20201114152520p:plainであらわす(変換後を変換前で表す)

  2. f:id:StatModeling:20201114152524p:plainであらわす(変換前を変換後で表す)

  3. ヤコビアンf:id:StatModeling:20201114152527p:plainを求める。絶対値を取って正の値にします(正負の符号は座標軸の位置関係をあらわすものなので今は重要ではありません)。

  4. f:id:StatModeling:20201114152531p:plainを整理して終了。


では今回の場合の変数変換をやってみます。

  1. f:id:StatModeling:20201114152534p:plain

  2. f:id:StatModeling:20201114152539p:plain

  3. f:id:StatModeling:20201114152542p:plain

  4. f:id:StatModeling:20201114152436p:plainの分布が自由度4のカイ2乗分布:

f:id:StatModeling:20201114152546p:plain

なので、

f:id:StatModeling:20201114152550p:plain

で完成です(積分して1になることも示せます)。これがf:id:StatModeling:20201114152513p:plainの分布になります。下の図でが自由度4のカイ2乗分布、が自由度1のカイ2乗分布、f:id:StatModeling:20201114152553p:plainです。この図を見ると場合によっては正規分布で近似しても大丈夫そうなことも分かります。

さて最終的な出力はこのf:id:StatModeling:20201114152513p:plainの平均値なので、平均値の定義より以下のように積分すれば求まります。

f:id:StatModeling:20201114152601p:plain

途中のの式変形はガンマ関数の定義の形に持っていきたいために以下のような変数変換をしています。

f:id:StatModeling:20201114152605p:plain

f:id:StatModeling:20201114152608p:plain

f:id:StatModeling:20201114152613p:plain

途中のの式変形はガンマ関数の定義を参照してください。 最終的な出力はQ2.のRの実行結果と一致します。


変数変換のステップ(逆関数が多価関数の場合)

1変数の場合でも逆関数が多価関数になる(値の範囲によって複数の関数がある)場合は注意が必要です。その場合は、f:id:StatModeling:20201114152616p:plainf:id:StatModeling:20201114152620p:plainは全ての逆関数についての和)が成り立つと考えられるので、変数変換は、

f:id:StatModeling:20201114152624p:plain

となります。

例として、f:id:StatModeling:20201114152629p:plainが平均0・標準偏差1の正規分布に従うとき、f:id:StatModeling:20201114152634p:plainの分布の計算は以下のようになります。

f:id:StatModeling:20201114152637p:plain

f:id:StatModeling:20201114152641p:plain

最終的に自由度1のカイ2乗分布となります。

多価関数の例ではないですが、もう一つ調子に乗ってf:id:StatModeling:20201114152644p:plainが任意の分布である時に、f:id:StatModeling:20201114152649p:plainで移した分布はどうなるでしょうか?

上記のステップに従って変換すると、

f:id:StatModeling:20201114152652p:plain

となり、f:id:StatModeling:20201114152656p:plainは [0,1]の一様分布 になることが分かります。さてここでf:id:StatModeling:20201114152700p:plainはp値と解釈できることを考えると、p値の分布は[0,1]の一様分布になることが分かります。この事実は多重検定の補正などに使われます(例えば測定項目が多い場合、p値をソートして横軸に順位、縦軸にp値をplotしてみて、p値が低い方の直線から外れているところからが本当に意味があるところと考えたりします)。


変数変換のステップ(2変数の場合)

2変数の場合のステップは以下のようになります。f:id:StatModeling:20201114152704p:plain というf:id:StatModeling:20201114152629p:plainf:id:StatModeling:20201114152708p:plainの同時分布が分かっているものとします。

  1. f:id:StatModeling:20201114152712p:plain(変換後を変換前で表す)

  2. f:id:StatModeling:20201114152717p:plain(変換前を変換後で表す)

  3. ヤコビアン(の絶対値)を求める。ヤコビ行列f:id:StatModeling:20201114152721p:plain行列式(の絶対値)になります。

f:id:StatModeling:20201114152726p:plain

  1. f:id:StatModeling:20201114152730p:plainを整理する。f:id:StatModeling:20201114152513p:plainf:id:StatModeling:20201114152734p:plainの同時分布f:id:StatModeling:20201114152738p:plainが得られる。

  2. f:id:StatModeling:20201114152513p:plainだけの分布が欲しいような場合はf:id:StatModeling:20201114152738p:plainについて残りの変数を積分して消して終了。

最後の例として、大砲が弾をうってどれくらい遠くまで発射できるかの確率分布を求める問題を解いてみます。 出典:Stochastic Processes in Physics and Chemistry, Third Edition (North-Holland Personal Library) I.5節にある練習問題(p.19)

Q. 初速度f:id:StatModeling:20201114152743p:plain、仰角f:id:StatModeling:20201114152747p:plainで大砲から弾を発射します。ここで、速度・仰角ともに、それぞれf:id:StatModeling:20201114152305p:plainf:id:StatModeling:20201114152309p:plainの周りに鋭い正規分布を取るとします(よって、負の値などは無視できるとします)。また空気の抵抗は無視できるとします。この時、弾の到達距離の分布はどのようなものになるでしょうか?

Answer. 垂直軸の移動距離の式f:id:StatModeling:20201114152313p:plainを解くと、着弾するまでの時間はf:id:StatModeling:20201114152317p:plainと分かります。すると、到達距離はf:id:StatModeling:20201114152321p:plainとなります。よって、以下のような変数変換をします。

f:id:StatModeling:20201114152326p:plain

変換前を変換後で表すと、

f:id:StatModeling:20201114152330p:plain

ここで、 f:id:StatModeling:20201114152333p:plainです。微分の公式などがありますので使うと便利な時があります。

ヤコビアンは以下になります。

f:id:StatModeling:20201114152337p:plain

いま f:id:StatModeling:20201114152743p:plainf:id:StatModeling:20201114152747p:plainが独立と考えられるので、f:id:StatModeling:20201114152341p:plainの同時分布は、f:id:StatModeling:20201114152345p:plainになります。 よってf:id:StatModeling:20201114152349p:plainの同時分布は、

f:id:StatModeling:20201114152354p:plain

になります。最終的に求めたいf:id:StatModeling:20201114152440p:plainの分布は、ここからf:id:StatModeling:20201114152734p:plain積分して消去します。

f:id:StatModeling:20201114152357p:plain

この積分は解析的には(≒手計算では)解けませんので数値的に積分します。ここで、f:id:StatModeling:20201114152401p:plainとして実行した結果が以下になります。横軸が到達距離f:id:StatModeling:20201114152513p:plain、縦軸(奥行き)がパラメータf:id:StatModeling:20201114152405p:plainf:id:StatModeling:20201114152409p:plainの範囲で変えたもの、垂直軸(高さ)がf:id:StatModeling:20201114152405p:plainを決めたときの到達距離の確率分布をあらわします。f:id:StatModeling:20201114152412p:plainで最も遠くまで飛ぶのはいつも通りですが、分布が少し右に尾を引いているのが分かります。

f:id:StatModeling:20201114152416p:plain