Stan は MCMC を利用して確率モデルのパラメーター分布を推測するための確率的プログラミング言語の一つである。C/C++、Java や Python などといった汎用的プログラミング言語の文法とは大きく異なっている。
Stan の文法では、確率モデルを簡単に記述するために作られている。確率モデルを記述するためには、最低限、入力データ、確率モデルのパラメーター、そして確率モデルの尤度式が必要である。この 3 項目を記述するためには、Stan では data
、parameters
および model
ブロックが用意されている。例えば、y = ax + b という回帰モデルにおいて、入力データは N セット (x, y) であり、パラメーターは a と b であり、そしてモデルの尤度式は y ~ N(ax + b, σ) である。これを Stan 文法で記述すると次のようになる。
data {
int<lower=0> N;
vector[N] x;
vector[N] y;
}
parameters {
real a;
real b;
real<lower=0> sigma;
}
model {
y ~ normal(a * x + b, sigma);
}
モデルを記述するために必要最低限の data
、parameters
および model
ブロックの他にも、いくつかの便利なブロックが用意されている。
data | モデル式に含まれる入力データ(変数)を定義するブロック。R 側または Python 側から Stan 側に渡すデータをこのブロックで定義する。この際に、データの型(int, real)なども合わせて定義する。 |
transformed data | data ブロックで定義されている変数を線形変換などを施す場合は、transformed data ブロックで、変換方法などを定義する。 |
parameters | モデル式に含まれるパラメーターを定義するブロック。これから MCMC を通して求めたいパラメーターをこのブロックで定義する。この際に、パラメーターのデータ型(int, real)も合わせて定義する必要がある。また、制約条件(最大値あるか、正の数なのか)などを必要に応じて定義する。 |
transformed parameters | parameters ブロックで定義されているパラメーターを線形変換などを施す場合は、transformed parameters ブロックで、変換方法などを定義する。 |
generated quantities | サンプリングで得られたパラメーターを利用して、さらに何かの計算を行う場合は、generated quantities ブロックに記述する。例えば、サンプリングで得られたパラメーターで、事後分布に従う乱数を生成したい場合は、ここに記述する。 |
model | data や parameters などのブロックで定義された変数を利用して、モデル式を記述するためのんブロック。Stan は、model ブロックに記述されるモデル式に基づいて、サンプリングによりパラメーターを推定する。 |
References
- Overview of Stan’s Program Blocks. Stan Reference Manual