見出し画像

【2回目】100日後にベイズ統計ができるゆーみん【28日目】

こんにちは!
今日はポアソン回帰の続きをやっていきます。

5.4.3 Stanで実装

↓モデル式の実装例
λ[n] = exp(b1+b2A[n]+b3Score[n]) n=1,...,N
M[n] ~ Poisson(λ[n]) n=1,...,N

data {
 int N;
 int<lower=0, upper=1> A[N];
 real<lower=0, upper=1> Score[N];
 int<lower=0> M[N];
}

parameters {
 real b[3];
}

transformed parameters {
 real lambda[N];
 for (n in 1:N)
   lambda[n] = exp(b[1] + b[2]*A[n] + b[3]*Score[n]);
}

model {
 for (n in 1:N)
   M[n] ~ poisson(lambda[n]);
}

generated quantities {
 int m_pred[N];
 for (n in 1:N)
   m_pred[n] = poisson_rng(lambda[n]);
}

二項ロジスティック回帰のコードから変更した部分を説明してくれています。

int<lower=0> M[N];

応答変数を授業回数Mに変更する。

lambda[n] = exp(b[1] + b[2]*A[n] + b[3]*Score[n]);

exp関数を用いて0以上に変換している。

M[n] ~ poisson(lambda[n]);
 m_pred[n] = poisson_rng(lambda[n]);

確率的な変動の部分をポアソン分布に変更している

ここで異なる方法が書かれていました!

Stanにはpoisson_log(x)という分布関数が用意されており、これはpoisson(exp(x))と等価であるそうです。

poisson_log_rng(x)を使った場合↓

data {
 int N;
 int<lower=0, upper=1> A[N];
 real<lower=0, upper=1> Score[N];
 int<lower=0> M[N];
}

parameters {
 real b[3];
}

transformed parameters {
 real lambda[N];
 for (n in 1:N)
   lambda[n] = b[1] + b[2]*A[n] + b[3]*Score[n];
}

model {
 for (n in 1:N)
   M[n] ~ poisson_log(lambda[n]);
}

generated quantities {
 int m_pred[N];
 for (n in 1:N)
   m_pred[n] = poisson_log_rng(lambda[n]);
}

今日はここまでです!

おそらく今日の夕刻ごろまたブログをアップするかと思われます。

またお会いしましょう〜


この記事が気に入ったらサポートをしてみませんか?