top of page

From: Bayesian Models for Astrophysical Data, Cambridge Univ. Press

(c) 2017,  Joseph M. Hilbe, Rafael S. de Souza and Emille E. O. Ishida

you are kindly asked to include the complete citation if you used this material in a publication

â€‹

â€‹

Code 5.8 Log-gamma model in Python using Stan

================================================

import numpy as np
import pystan

from scipy.stats import uniform, gamma

â€‹

# Data
np.random.seed(33559)                                    # set seed to replicate example

nobs = 3000                                                      # number of obs in model
x1 = uniform.rvs(size=nobs)                            # random uniform variable
x2 = uniform.rvs(size=nobs)                            # second explanatory

â€‹

beta0 = 1.0                                                        # intercept
beta1 = 0.66                                                      # first linear coefficient
beta2 = -1.25                                                    # second linear coefficient

â€‹

eta = beta0 + beta1 * x1 + beta2 * x2              # linear predictor

mu = np.exp(eta)
y = gamma.rvs(mu)                                         # create y as adjusted

â€‹

# Fit
mydata = {}                                                     # build data dictionary
mydata['N'] = nobs                                          # sample size
mydata['x1'] = x1                                            # explanatory variable
mydata['x2'] = x2
mydata['y'] = y                                                # response variable

â€‹

# STAN code
stan_gamma = """
data{
int<lower=0> N;
vector[N] x1;
vector[N] x2;
vector[N] y;
}
parameters{
real beta0;
real beta1;
real beta2;
real<lower=0> r;
}
transformed parameters{
vector[N] eta;
vector[N] mu;
vector[N] lambda;

â€‹

for (i in 1:N){
eta[i] = beta0 + beta1 * x1[i] + beta2 * x2[i];
mu[i] = exp(eta[i]);
lambda[i] = r/mu[i];
}
}
model{
r ~ gamma(0.01, 0.01);
for (i in 1:N) y[i] ~ gamma(r, lambda[i]);
}
"""

â€‹

# Run mcmc
fit = pystan.stan(model_code=stan_gamma, data=mydata, iter=7000, chains=3,
warmup=6000, n_jobs=3)

â€‹

# Output
nlines = 9                                                        # number of lines in screen output

â€‹

output = str(fit).split('\n')
for item in output[:nlines]:
print(item)
================================================

Output on screen:

â€‹

Inference for Stan model: anon_model_3c824db1250f91b7962c170204aef856.
3 chains, each with iter=7000; warmup=6000; thin=1;
post-warmup draws per chain=1000, total post-warmup draws=3000.

â€‹

mean      se_mean           sd         2.5%         25%          50%          75%        97.5%        n_eff       Rhat
beta0          1.05          9.5e-4        0.03         0.98          1.02          1.05          1.07            1.11      1365.0         1.0
beta1          0.60          1.2e-3        0.05         0.51          0.57          0.60          0.63            0.69      1561.0         1.0
beta2         -1.28          1.1e-3        0.04       -1.37         -1.31        -1.28         -1.25           -1.19      1554.0         1.0
r                 1.83          9.7e-4        0.04         1.74          1.80          1.83          1.86            1.91      1915.0         1.0

bottom of page