More Related Content More from Shushi Namba (15) Rでベイズをやってみよう!(コワい本1章)@BCM勉強会15. 事後分布=知りたいパラメータの不確実性記述
& 確率的予測や逐次更新に有用
尤度(データ)が二項分布に従う場合:一様事前=ベータ
分布(α=1、β=1)とデータを組み合わせる→事後もま
たベータ分布(α+k、β+n-k)
それらのような単一の結合例だと、事前と事後は同じ分
布になるけど、多くの場合そう都合よくならないよね。
→ 複雑なデータには対応できない?
つまり上記の例は
単純すぎるって話
16. Markov Chain Monte Carlo
(上の例の)事後分布は比較的単純データに対してしか使えない
= 現実の複雑なモデルはベイズ的解釈を使えなかった
上記の現状を打破したのがマルコフ連鎖モンテカルロ法と呼ばれる発
展的コンピュータ駆動のサンプリング手法(通称MCMC)
→ Gibbs サンプリング、Metropolis-Hastingsアルゴリズムのような
MCMCを使い、事後分布を抽出可能に!
いまや“Bayesian models are limited only by the user’s
imagination.”
19. Stan vs BUGS
ここがすごいよStanくん!
No-U-Turn Sampler(NUTS)を利用:階層モデル、混合モデル、潜在
変数モデルなど変数間の相関が高くなる複雑なモデル向き
※BUGSはGibs Sampler, Metropolis-Hastingsアルゴリズム利用
さらにStanではBUGSでは許されない非正則な事前分布利用可能
+Shinystanなど関連する開発がいまもなお活発
心理データへの実用性が
高いということ
23. 続き
library(rstan)
datas <- list(n=10, k=9)
# parameters to be monitored:
parameters <- c("theta")
# The following command calls Stan with specific options.
samples <- stan(model_code=stancode,
data=datas, pars=parameters,
iter=20000, chains=2, thin=1,
# warmup = 100, # Default = iter/2
# seed = 123 # Setting seed; Default is random seed
)
24. Stan modelのすっごい適当な説明
stancode<- “
data { #ここのdataは実際に存在するデータを定義
int<lower=1> n; #問題の数nをつっこんでくれって意味:lowerは下限
int<lower=0> k; #正解数kを〃
}
parameters { #知りたいパラメータ(データ上観察しえない)を定義
real<lower=0,upper=1> theta; #real=実数いれてやで+<>内=下限~上限 → 能力θ
}
model { #分布の設定
theta ~ beta(1, 1); #事前分布:一様分布である(1,1)のβ分布
// Observed Counts
k ~ binomial(n, theta); }” #正解数はパラメータ(n, θ)の二項分布に従うよ
25. Stan codeのすっごい適当な説明
samples <- stan(model_code=stancode, (さっき書いたモデル)
data=datas, pars=parameters,
iter=20000, #サンプリング数のこと。適切な数はデータによる
chains=2, #ランダムサンプリングを行う回数
thin=1, #はしょる数:全部取り出すと多いのでiterを1つ飛びで抽出
# warmup = 100, #burn out期間:最初の方は収束してないのよね
# Default = iter/2 #default
# seed = 123 #乱数の指定; Default is random seed(=これでいい)
)
26. # The commands below are useful for a quick overview:
print(samples)
print(summary(samples))
公式HPにはさらに結果
を見るためいろんなコ
ードが実際にのってる
けどそんな煩雑なこと
をしなくてもShinystan
というパッケージを使
えば結果がきれいに見れます (例)公式HPの全然関係ないデータ
32. Code:長いから覚悟しろよ!
※ “” はコピペすると以下略
model <- " // Pearson Correlation
data {
int<lower=0> n;
vector[2] x[n];
}
parameters {
vector[2] mu;
vector<lower=0>[2] lambda;
real<lower=-1,upper=1> r;
}
transformed parameters {
vector<lower=0>[2] sigma;
cov_matrix[2] T;
Stan内の多変量正規分布は分散共分散行列
の代わりに共分散行列利用:多変量正規分布
は変数をベクトル化する必要がある。
33. // Reparameterization
sigma[1] <- inv_sqrt(lambda[1]);
sigma[2] <- inv_sqrt(lambda[2]);
T[1,1] <- square(sigma[1]);
T[1,2] <- r * sigma[1] * sigma[2];
T[2,1] <- r * sigma[1] * sigma[2];
T[2,2] <- square(sigma[2]);
}
model {
// Priors
mu ~ normal(0, inv_sqrt(.001));
lambda ~ gamma(.001, .001);
// Data
x ~ multi_normal(mu, T);
}"
λの逆平方根=σ
逆平方Gamma分布をモデルで
は仮定してた:逆平方根の処理
をしてからGamma関数仮定
※豆知識:Gamma分布
=発生率1/βの事象が複数(α)
回起きるまでの待ち時間分布
34. Data
x <- matrix(c( .8, 102, 1.0, 98,
.5, 100, .9, 105,
.7, 103, .4, 110,
1.2, 99, 1.4, 87,
.6, 113, 1.1, 89,
1.3, 93), nrow=11, ncol=2, byrow=T)
行・列の指定
35. n <- nrow(x) # number of people/units measured
data <- list(x=x, n=n) # to be passed on to Stan
myinits <- list(
list(r=0, mu=c(0, 0), lambda=c(1, 1)))
# parameters to be monitored:
parameters <- c("r", "mu", "sigma")
# The following command calls Stan with specific options.
# For a detailed description type "?rstan".
samples <- stan(model_code=model,
data=data,
init=myinits, # If not specified, gives random inits
pars=parameters, iter=10000,
chains=1, thin=1,
# warmup = 100, # Stands for burn-in; Default = iter/2
# seed = 123 # Setting seed; Default is random seed
)
Init=ランダムサンプリングす
る時の最初の値の決定