空間構造のある階層ベイズモデル:より詳細な理解へ

確率と情報の科学:データ解析のための統計モデリング入門:久保拓弥、岩波書店
第11章 空間構造のある階層ベイズモデル
???????????
場所差の空間相関(spatial correlation)を考慮する統計モデリング。
http://hosho.ees.hokudai.ac.jp/~kubo/ce/CarNormalExample.html

11.1 例題:一次空間上の個体数分布
調査区画を50個設定し、それが一本の直線上に等間隔で配置されるとする。
調整区画の番号jは、左から1,2,….,50とする。

ここでは架空のデータ{yi}は場所jごとに平均の異なるポアソン乱数として発生させたもの。

http://hosho.ees.hokudai.ac.jp/~kubo/stat/iwanamibook/fig/spatial/m1/model.bug.txt

11.2 階層ベイズモデルに空間構造をくみこむ
まずとっかかりとして、個体数yiがすべての区間で共通する平均値λのポアソン分布に従うとする。
データは過分散であり、区画jごとに平均λjが異なっているとする。

平均値λjを線形予測子と対数リンク関数を用いて、
logλj = β + ri
とする。
この線形予測子は、切片β(大域パラメータ)と場所差rj(局所パラメータ)で構成されている。
βには、無情報事前分布を、{rj}には階層事前分布を与える。

11.2.1 空間構造のない階層事前分布

P(rj|s) = 1/√2πs^2exp(-rj^2/2s^2)

11.2.1 空間構造のある階層事前分布
以下の仮定を設ける

区間の場所差は「近傍区間の場所差にしか影響しない
区画jの近傍の個体数njは有限であり、その区画が近傍であるかはモデル設計者が指定する。
近傍の直接の影響はそれも等しく1/nj

さらに簡略化して、この一時空間モデルでは、ある区画はその隣接している区画とだけ相互作用を持つ。
したがって、近傍数njは2で、左右の両端(n1,n50)では1。

p(rj|μj,s) = √(nj/2πs^2exp(-(rj-μj)^2/2s^2/nj)

μj = (rj-1+rj+1)/2、ただし左右の両端j=1とJ=50では、 μ1 = r2, μ50 = r49

このような事前分布は、条件付き自己回帰(conditional auto regressive, CAR)モデルと呼ばれる。
このモデルのようにさまざまの制約をつけて簡単にしたものはintrinsic Gaussian CARモデルと分類される。

この場所差{rj} = {r1,r2,….r50}全体の事前分布である同時分布p){rj}|s)は以下のようになる。
p({rj}|s) ∝ exp(^1/2s^2Σ(rj-rj’)^2

11.3 空間統計モデルをデータにあてはめる

事後分布は、

p(β,s,{rj}|Y) ∝ p({rj}|s)p(s)p(β)Πp(yi|λi)

データyjが得られる確率p(yj|λj)は平均λj=exp(β+rj)のポアソン分布とする。
大域的なパラメータβには、無情報事前分布p(β)を指定する。
局所的なパラメータである場所差rjの事前分布は、空間相関を考慮した階層事前分布として、同時分布p({rj}|s)を使っている。MCMCサンプリングでは、個々のrjの条件付き事前分布p(rj|μ,s)を使用し、これは平均μjで標準偏差s/√njの正規分布、sの事前分布p(s)は無情報事前分布であるとする。

http://hosho.ees.hokudai.ac.jp/~kubo/stat/iwanamibook/fig/spatial/m1/model.bug.txt

BUGSコードでの注意点は、
r[1:N.site]~car.normal(Adj[], Weights[], Num[], tau)
で、car.normal()関数は、intrinsic Gaussian CARモデルから[rj}のMCMCサンプルを発生させる関数。Adj[]は隣接する場所の番号j、Weights[]はAdj[]に対応する重み、Num[]はそれぞれの区画に隣接する場所の数nj、tauは分散の逆数、つまり1/s^2。

http://hosho.ees.hokudai.ac.jp/~kubo/stat/iwanamibook/fig/spatial/m2/model.bug.txt

GLMM model の例 (11.2.1 項, 11.5 節)

http://hosho.ees.hokudai.ac.jp/~kubo/stat/iwanamibook/fig/spatial/model.bug.txt

> Adj <- c(sapply(2:(N.site - 1), function(a) c(a - 1, a + 1))) #Adj 隣接する場所の番号:function(a)を2:49繰り返す。 > set.data(“Adj”, c(2, Adj, N.site – 1))
> Adj
[1] 2 1 3 2 4 3 5 4 6 5 7 6 8 7 9 8 10 9 11 10 12 11 13 12 14 13 15 14 16 15
[31] 17 16 18 17 19 18 20 19 21 20 22 21 23 22 24 23 25 24 26 25 27 26 28 27 29 28 30 29 31 30
[61] 32 31 33 32 34 33 35 34 36 35 37 36 38 37 39 38 40 39 41 40 42 41 43 42 44 43 45 44 46 45
[91] 47 46 48 47 49 48 50 49

> set.data(“Weights”, rep(1, 2 * N.site – 2))
#Weights[] は Adj[]に対応する重み
> Weights
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[47] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[93] 1 1 1 1 1 1

> set.data(“Num”, c(1, rep(2, N.site – 2), 1))
#Numは、それぞれの区画に隣接する場所の数
> Num
[1] 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[47] 2 2 2 1

11.4 空間統計モデルが作り出す確率場

隣同士の相互作用をするrjの一次元ならびである{r1,r2,…r50}の関係を決めるために、intrinsic Gaussian CARモデルを部品として用いた。
一般に相互作用をする確率変数でうめつくされた空間は確率場random fieldと呼ばれる。ばらつきパラメータsの大小が確率場{rj}にあたえる影響を見ると、大域的なパラメータβを適当に固定して、sを0.0316, 0.224, 10.0とした。sが小さいときは両隣の平均と似た、rj全体のばらつきは小さくなり、sが大きいと全体にぎざぎざしたばらつきの大きい確率場となる。

11.5 空間相関モデルと欠測のある観測データ
空間相関を組み込んだ階層ベイズモデルでは「欠測データ」に対して、より良い予測が得られる。

全部まとめて推定 (欠測あり・なし,CAR と GLMM)
http://hosho.ees.hokudai.ac.jp/~kubo/stat/iwanamibook/fig/spatial/model.bug.txt

全部まとめて推定 (欠測あり・なし,CAR と GLMM)

post.bugsには、4種類(欠損なしGLMM、欠損ありGLMM、欠損なしCarモデル、欠損ありCarモデル)の分析結果βとr[i]が含まれている。
それぞれを順番に取り出して、λi = exp(β + ri)を計算する。

Yに対して欠損データYnoを作成するためのコードを以下に示す。
http://hosho.ees.hokudai.ac.jp/~kubo/stat/iwanamibook/fig/spatial/set.data.R

欠損データあるなし、およびGLMMもしくはCarモデルの通りを上記BUGSモデルと、欠損データを作成するRを読み込んで、以下のように実行する。
http://hosho.ees.hokudai.ac.jp/~kubo/stat/iwanamibook/fig/spatial/runbugs.R

ここでは、
post.bugs <- call.bugs(n.iter = 10100, n.burnin = 100, n.thin = 10) で指定されているように、10100回のサンプリング、burn-inの100回、10個ごとの間引きで、1ループで1000個のデータが生成される。デフォルトで3ループ繰り返されるので、3000データが生成されて、post.listには1000個づつx3ループ、post.mcmcには3000行のデータxパラメータ数列となる。

ここで注意点はpost.mcmcのデータ構造

つまり、上記のようにβ[1]からβ[4],r[i,j], s[1]からs[4]までが、[1,]から[4,]行で表示されている。実際には[ reached getOption(“max.print”) — omitted 2996 rows ]とされているように3000行ある。
もともとMCMCでは、
post.bugs <- call.bugs(n.iter = 10100, n.burnin = 100, n.thin = 10) でpost.bugsが生成されているので、burn-inが100回、MCMCのサンプリングが10100回で、burn-inの100回を除くと10000回。それをn.thinで10回に一回の間引きすると一回のループで1000個のデータが得られる。さらにdefaultで3回回転させるので、データ量は1ループで1000個、3ループで3000個となる。 よって、post.mcmcには3000行、post.listは3ループ、それぞれ1000行のサンプルとなる。 以下のプログラムを参考:

post.mcmcのr[i]のデータからquantile()関数を用いて、mre[1]に中位点、mre[2]に2.5%位点、mre[3]に97.5%位点を求めている。 今回の分析では、4つの異なる条件(欠損データあるなし、GLMMかCarモデルか)がまとめてpost.bugsに収められており、個体差のデータr[i]も二次元r[j,i]となっているために"r[%i]"を"r[j,%i]とする。また欠損なしのデータYに対して、欠損ありデータYnoを指定し、またパラメータbetaには、beta[1]?beta[4]を指定する。 http://hosho.ees.hokudai.ac.jp/~kubo/stat/iwanamibook/fig/spatial/m1/fig11_04.R

上記プログラムの3箇所:
?plot(
v, Y,
xlab = “location”,
ylab = “y_i”,
ylim = c(0, y.max)
)
1.Y
2.Yno
3.Y
4.Yno
?v, function(i) quantile(
post.mcmc[, sprintf(“r[%i]“, i)],
probs = c(0.5, 0.025, 0.975)
)
1.r[%i]r[1,%i]
2.r[%i]r[2,%i]
3.r[%i]r[3,%i]
4.r[%i]r[4,%i]

?b <- median(post.mcmc[,"beta“])
1. betabeta[1]
2. betabeta[2]
3. betabeta[3]
4. betabeta[4]

> post.mcmc[, sprintf(“r[1,%i]”, 1)]
Markov Chain Monte Carlo (MCMC) output:
Start = 1
End = 3000
Thinning interval = 1
[1] -0.18400 -0.67500 -1.42200 -0.50450 -0.63360 -1.10700 -0.35370 -0.83640 -1.30700 -0.98050
[11] -1.26100 -0.72610 -0.86080 -0.90290 -0.39940 -0.86940 -0.34790 -0.76790 -1.27100 -0.80690
[21] -0.98250 -0.70730 -1.56600 -1.41300 -0.92780 -0.18960 -0.75360 -0.75330 -0.88030 -1.12000
……
[981] -0.63590 -0.89070 -0.57660 -1.04800 -0.38740 -0.61560 -1.01800 -0.63090 -0.70580 -0.41810
[991] -1.13800 -0.62850 -0.70830 -0.29860 -0.92840 -1.29800 -0.36910 -1.56400 -0.84220 -0.97500
[ reached getOption(“max.print”) — omitted 2000 entries ]

1. 欠損なし、GLMMモデル


95%信用区間を描画する。

2.欠損あり、GLMMモデル


95%信用区間を描画する。


3. 欠損なし、Carモデル


95%信用区間を描画する。


4. 欠損あり、Carモデル


95%信用区間を描画する。


—————————
http://hosho.ees.hokudai.ac.jp/~kubo/ce/2008/car/model1.bug.txt

plotcar.R

以下、ウェブサイトを参考に動かしてみた。
モデルは
http://hosho.ees.hokudai.ac.jp/~kubo/ce/2008/car/model1.bug.txt
model
{
Tau.noninformative <- 1.0E-2 P.gamma <- 1.0E-2 for (i in 1:N.site) { Y[i] ~ dpois(mean[i]) log(mean[i]) <- beta + re[i] } re[1:N.site] ~ car.normal(Adj[], Weights[], Num[], tau) beta ~ dnorm(0, Tau.noninformative) tau ~ dgamma(P.gamma, P.gamma) } http://hosho.ees.hokudai.ac.jp/~kubo/ce/2008/car/runbugs2.R
source(“R2WBwrapper.R”)
clear.data.param() # for initialization

# set data
load(“Y.RData”)

v.na <- c(6, 9, 12, 13, 26:30) YwithNA <- Y YwithNA[v.na] <- NA set.data("N.site", length(YwithNA)) set.data("Y", YwithNA) Adj <- c(sapply(2:(N.site - 1), function(a) c(a - 1, a + 1))) set.data("Adj", c(2, Adj, N.site - 1)) set.data("Weights", rep(1, 2 * N.site - 2)) set.data("Num", c(1, rep(2, N.site - 2), 1)) # set parameter set.param("beta", 0) set.param("re", rnorm(N.site, 0, 0.1)) set.param("tau", 1) post.bugs2 <- call.bugs( file.bug = "model1.bug.txt", n.iter = 300, n.burnin = 100, n.thin = 1 ) > source(“R2WBwrapper.R”)
# reading “R2WBwrapper.R” (written by kubo@ees.hokudai.ac.jp)…
> clear.data.param() # for initialization
>
> # set data
> load(“Y.RData”)
>
> v.na <- c(6, 9, 12, 13, 26:30) > YwithNA <- Y > YwithNA[v.na] <- NA >
> set.data(“N.site”, length(YwithNA))
> set.data(“Y”, YwithNA)
>
> Adj <- c(sapply(2:(N.site - 1), function(a) c(a - 1, a + 1))) > set.data(“Adj”, c(2, Adj, N.site – 1))
> set.data(“Weights”, rep(1, 2 * N.site – 2))
> set.data(“Num”, c(1, rep(2, N.site – 2), 1))
>
> # set parameter
> set.param(“beta”, 0)
> set.param(“re”, rnorm(N.site, 0, 0.1))
> set.param(“tau”, 1)
>
> post.bugs2 <- call.bugs( + file = "model1.bug.txt",  #.bugを外す。 + n.iter = 300, n.burnin = 100, n.thin = 1 + ) > source(“plotcar.R”)
# reading “R2WBwrapper.R” (written by kubo@ees.hokudai.ac.jp)…
> plotcar(post.bugs2,v.na=v.na)
Hit to see next plot:

> plotcar(post.bugs2)

11.6 この章のまとめ
空間構造のあるデータを統計モデル化する場合、近傍とは似ているけれど遠方とは似ていないといった空間相関を考慮しなければならない。

空間相関のある場所差を生成するintrinsic Gaussian CARモデルはWinBUGSで簡単に扱える。

空間相関のある場所差は確率場を使って表現できる

空間相関を考慮した階層ベイズモデルでは、観測データの欠損部分をよそくするような用途にも使える。