Weitere ähnliche Inhalte
Mehr von Hiroshi Shimizu (17)
rstanで簡単にGLMMができるglmmstan()を作ってみた
- 12. GLMMってなんだっけ
• Generalized Linear Mixed Modeling
– 一般化線形混合モデル
– 線形モデル+指数分布族+変量効果
• どういうときにGLMMを使うのか?
– データが離散分布に従うが,過分散が生じるとき
• 個体差が大きい場合
– データがネストされた構造になっていて,グルー
プごとに効果が異なるとき
- 19. WAICかわいいよWAIC
• 広く使える情報量規準
– Widely Applicable information Criterion
– Watanabe Akaike Information Criterionとも
• WAICの利点(渡辺先生のWebサイトから)
– 真の分布・事前分布がどのような場合でも使える
– 事後分布が正規分布でなくても使える
• 仮に正規分布で近似できても従来法より正確
– 正則モデルでなくても使える
– 簡単に計算できる
- 31. 使える分布
• 正規分布(”gaussian” or “normal”)
• ベルヌーイ分布(”bernoulli”) ロジットリンク
• 二項分布(”binomial”) ロジットリンク
• ポアソン分布(”poisson”) 対数リンク
• 負の二項分布(”nbinomial”) 対数リンク
• ガンマ分布(”gamma”) 対数リンク
• 対数正規分布(”lognormal”) 対数リンク
• ベータ分布(”beta”) ロジットリンク
• 順序カテゴリカル(”ordered”) ロジットリンク
- 35. glmmstan()の使いかた
• 基本的な使いかたはglmerと同じ
• 必須の引数
– formula:式を書く glmerと同じ文法
– data:データフレームを指定
– family:使用する分布を入力 デフォルトは正規分布
• 戻り値
– stanfitクラスのオブジェクトを返す
– なので,rstanの出力関数が使える
fit <- glmmstan(salary ~ HR+(1+HR|team), data=dat,
family="gaussian")
- 38. glmmstanのstanコード例
data{
int<lower=1> N;
int<lower=1> P;
row_vector[P] x[N];
int<lower=1> R;
int<lower=1> G[R];
int<lower=1> Q[R];
real y[N];
int<lower=1> id1[N];
row_vector[Q[1]] z1[N];
}
transformed data{
vector[Q[1]] mu1;
for(q in 1:Q[1]) mu1[q] <- 0;
}
parameters{
vector[P] beta;
vector[Q[1]] r1[G[1]];
vector<lower=0>[Q[1]] tau_sd1;
corr_matrix[Q[1]] tau_corr1;
real<lower=0> s;
}
transformed parameters{
real<lower=0> sigma;
cov_matrix[Q[1]] tau1;
sigma <- s^2;
tau1 <- quad_form_diag(tau_corr1,tau_sd1);
}
model{
real predict[N];
beta ~ normal(0,1000);
r1 ~ multi_normal(mu1,tau1);
tau_sd1 ~ cauchy(0,2.5);
tau_corr1 ~ lkj_corr(2);
s ~ cauchy(0,2.5);
for(n in 1:N){
predict[n] <- x[n]*beta+z1[n]*r1[id1[n]];
}
y ~ normal(predict, s);
}
generated quantities{
real log_lik[N];
real predict[N];
for(n in 1:N){
predict[n] <- x[n]*beta+z1[n]*r1[id1[n]];
log_lik[n] <- normal_log(y[n], predict[n], s);
}
}
- 39. その他の機能
• 交互作用項と単純効果の分析
• オフセット項を追加できる
– 今のところポアソンか負の二項分布の場合のみ
fit <- glmmstan(salary ~ HR*AVG+(1+HR|team), data=dat,
family="poisson",
center = TRUE,
slice="AVG")
fit <- glmmstan(salary ~ HR+(1+HR|team),data=dat,
family="poisson",
offset = "ATbase") ※Log()をつけなくてもいい
- 40. 並列化処理
• chainごとに並列化したほうが計算が速い
– parallel = Tと書けば並列化可能
– あるいは,Pglmmstan()関数を使ってもよい
– コア数はcores=で指定
• デフォルトはchainsと同じ
fit <- Pglmmstan(salary ~ HR+(1+HR|team),data=dat,
family="gaussian",
chains = 4,
cores = 4)
- 43. stanに関する引数
• MCMCについての引数
– iter:サンプリング回数 デフォルトは2000
– warmup:バーンイン期間 デフォルトはiterの半分
– chains:マルコフ連鎖の数 デフォルトは2
– thin:何回おきに採用するか デフォルトは1
• stanにいれる便利な引数
– stancode:いじったstanコードを入力する
– standata:いじったstanにいれるdataを入力する
– stanmodel:コンパイル済みのモデルを入力する
– stanfit:stanの出力を入力する(コンパイルを避ける)
- 44. その他の引数
• Stanに入れるためのオブジェクトを返す
– codeonly: TRUEでstanコードだけを返す
– dataonly: TRUEでstan用のデータだけを返す
– modelonly: TRUEでコンパイル済みのモデルを返す
• 推定のオプション
– center: TRUEで説明変数を平均値で中心化する
– slice: 単純効果をみるときのスライス変数を指定
– offset: オフセット項わざを使うときの変数を指定