PyStan has an interface similar to that of RStan. For an introduction to Stan and RStan see http://mc-stan.org/ and RStan Getting Started.
PyStan aims to reproduce the functionality present in RStan. There are a few features present in RStan that have yet to be implemented in PyStan. If you find a feature missing that you use frequently please file a bug report so developers can better direct their efforts.
- Source code repo: https://github.com/stan-dev/pystan
- HTML documentation: https://pystan.readthedocs.org
- Issue tracker: https://github.com/stan-dev/pystan/issues
- Stan: http://mc-stan.org/
NumPy and Cython (version 0.19.1 or greater) are required. matplotlib is optional.
PyStan and the required packages may be installed from the Python Package Index using pip
.
pip install numpy Cython
pip install pystan
Alternatively, if Cython (version 0.19 or greater) and NumPy are already available, PyStan may be installed from source with the following commands
git clone https://github.com/stan-dev/pystan.git
cd pystan
python setup.py install
If you encounter an ImportError
after compiling from source, try changing out of the source directory before attempting import pystan
. For example, on Linux and OS X cd /tmp
would work.
import pystan
import numpy as np
schools_code = """
data {
int<lower=0> J; // number of schools
real y[J]; // estimated treatment effects
real<lower=0> sigma[J]; // s.e. of effect estimates
}
parameters {
real mu;
real<lower=0> tau;
real eta[J];
}
transformed parameters {
real theta[J];
for (j in 1:J)
theta[j] <- mu + tau * eta[j];
}
model {
eta ~ normal(0, 1);
y ~ normal(theta, sigma);
}
"""
schools_dat = {'J': 8,
'y': [28, 8, -3, 7, -1, 1, 18, 12],
'sigma': [15, 10, 16, 11, 9, 11, 10, 18]}
fit = pystan.stan(model_code=schools_code, data=schools_dat,
iter=1000, chains=4)
print(fit)
eta = fit.extract(permuted=True)['eta']
np.mean(eta, axis=0)
# if matplotlib is installed (optional, not required), a visual summary and
# traceplot are available
fit.plot()