SSブログ

階層ベイズで作成したパラメータのシミュレーションについて その2 [階層ベイズ]

里村先生の『マーケティング・モデル』をベースに、階層ベイズのモデルを作り、シミュレーションを行いました。


マーケティング・モデル 第2版 (Rで学ぶデータサイエンス 13)

マーケティング・モデル 第2版 (Rで学ぶデータサイエンス 13)

  • 作者: 里村 卓也
  • 出版社/メーカー: 共立出版
  • 発売日: 2015/04/09
  • メディア: 単行本



階層ベイズで作成したパラメータのシミュレーションについて その1
http://skellington.blog.so-net.ne.jp/2018-05-31

こちらの続き

階層ベイズモデルを予測で使う場合についてです。

1) まず、階層ベイズモデルで予測した人の別の観測データを用いて予測をする場合。
つまり、MCMCで求めたベータを使える場合です。

2) 次に、階層ベイズモデルで用いなかった新しいIDに対して予測をする場合。
こちらは、個人ごとのベータは推定できていません。
なので、Delta(階層部分のパラメータ)から個人ごとのベータを推定する必要があります。

## 1) 階層ベイズモデルで予測した人の別の観測データを用いて予測をする場合
org.beta <- matrix(0,nrow=hh,ncol=nvar)
for (i in 1:hh) {
 org.beta[i,] <- hhdata[[i]]$beta
}
 
z <- cbind(org.beta,beta.mean)
psych::pairs.panels(z, pch=".")
 
## 2) 階層ベイズモデルで用いなかった新しいIDに対して予測をする場合
# 個人のβの平均値を計算(MCMCより)
beta.mean <- matrix(0,nrow=hh,ncol=nvar)
 
for(j in 1:nvar){
 for(i in 1:hh){beta.mean[i,j] <- mean(betadraw[i,j,R0:R1])}
}
 
# 個人のβの平均値を計算2(階層部分より)
beta2.mean <- matrix(0,nrow=hh,ncol=nvar)
Delta2 <- matrix(apply(Deltadraw[R0:R1,],2,mean),nz,nvar)
 
for (i in 1:hh) {
 beta2.mean[i,] <- t(Delta2)%*%Z[i,]+as.vector(t(chol(Vbeta))%*%rnorm(nvar))
}
 
# beta.mean と beta2.mean の散布図
x <- cbind(beta.mean,beta2.mean)
psych::pairs.panels(x, pch=".")


まず、階層部分のパラメータですが、
真の値(実際には不明)
[,1] [,2]
[1,] -2 1
[2,] -1 2

シミュレーションで求めた値
[,1] [,2]
[1,] -2.04 1.00
[2,] -1.03 2.00
ということで、非常に良い当てはまりになっています。

一方で、ベータの値を比較してみると、
1) 階層ベイズモデルで予測した人の別の観測データを用いて予測をする場合

真のベータと強い相関があることが分かります。
つまり、良い予測をすることが分かりました。

2) 階層ベイズモデルで用いなかった新しいIDに対して予測をする場合

相関係数が低いです。
つまり、このままでは、良い予測ができないことが分かりました。

いくつか原因を考えてみると、観測モデルのベータを推定する際に階層モデルのパラメータに誤差を加えるのですが、この分散が大きいことが原因だと思われます。

実際は、全くの未知というわけではなく、未知のIDに対しても、それなりの情報を持っているわけで、この辺りの情報を上手くベイズ的に与えることができれば、良いかと思われますが、この辺りは、自分の限界なので、研究していきたいと思います。

nice!(5)  コメント(0) 
共通テーマ:学問

nice! 5

コメント 0