I’m trying to convert this model PYMC code on github but I’m having errors with initialization on PyStan.
Stan code for the model:
data {
int<lower=1> teams; // number of different teams
int<lower=1> matches; // number of matches
int<lower=1> indicator_home[matches];
int<lower=1> indicator_away[matches];
int<lower=0> goals_home[matches];
int<lower=0> goals_away[matches];
real home_adv_mu;
real<lower=0> home_adv_std;
real intercept_mu;
real<lower=0> intercept_std;
vector[teams] o_mu; // prior values for offence
vector<lower=0>[teams] o_std; // prior values for offence std
vector[teams] d_mu;
vector<lower=0>[teams] d_std;
real<lower=0> delta_sigma; // random walk strength
}
parameters {
real h; // home advantage
real i; // league intercept
vector[teams] o_star_init; // starting values for offence
vector[teams] d_star_init;
vector[teams] delta_o; // change to offence
vector[teams] delta_d;
}
transformed parameters {
vector[teams] o_star;
vector[teams] d_star;
vector[matches] lambda_h;
vector[matches] lambda_a;
vector[teams] o;
vector[teams] d;
o_star = o_star_init + delta_o;
d_star = d_star_init + delta_d;
o = o_star - mean(o_star);
d = d_star - mean(d_star);
lambda_h = exp(i + h + o[indicator_home] - d[indicator_away]);
lambda_h = exp(i + o[indicator_away] - d[indicator_home]);
}
model {
h ~ normal(home_adv_mu, home_adv_std);
i ~ normal(intercept_mu, intercept_std);
o_star_init ~ normal(o_mu, o_std);
d_star_init ~ normal(d_mu, d_std);
delta_o ~ normal(0, delta_sigma);
delta_d ~ normal(0, delta_sigma);
goals_home ~ poisson(lambda_h);
goals_away ~ poisson(lambda_a);
}
Error specification:
---------------------------------------------------------------------------
RemoteTraceback Traceback (most recent call last)
RemoteTraceback:
"""
Traceback (most recent call last):
File "/home/user/anaconda3/lib/python3.7/multiprocessing/pool.py", line 121, in worker
result = (True, func(*args, **kwds))
File "/home/user/anaconda3/lib/python3.7/multiprocessing/pool.py", line 44, in mapstar
return list(map(*args))
File "stanfit4anon_model_0a54c9f449e3546ae0105072cd640fa2_7260738033343356474.pyx", line 373, in stanfit4anon_model_0a54c9f449e3546ae0105072cd640fa2_7260738033343356474._call_sampler_star
File "stanfit4anon_model_0a54c9f449e3546ae0105072cd640fa2_7260738033343356474.pyx", line 406, in stanfit4anon_model_0a54c9f449e3546ae0105072cd640fa2_7260738033343356474._call_sampler
RuntimeError: Initialization failed.
"""
The above exception was the direct cause of the following exception:
RuntimeError Traceback (most recent call last)
<ipython-input-247-fa30fd0e626f> in <module>
16 "delta_sigma": 0.01
17 }
---> 18 fit = model.sampling(data=data, iter=1000, chains=4)
~/anaconda3/lib/python3.7/site-packages/pystan/model.py in sampling(self, data, pars, chains, iter, warmup, thin, seed, init, sample_file, diagnostic_file, verbose, algorithm, control, n_jobs, **kwargs)
811 call_sampler_args = izip(itertools.repeat(data), args_list, itertools.repeat(pars))
812 call_sampler_star = self.module._call_sampler_star
--> 813 ret_and_samples = _map_parallel(call_sampler_star, call_sampler_args, n_jobs)
814 samples = [smpl for _, smpl in ret_and_samples]
815
~/anaconda3/lib/python3.7/site-packages/pystan/model.py in _map_parallel(function, args, n_jobs)
83 try:
84 pool = multiprocessing.Pool(processes=n_jobs)
---> 85 map_result = pool.map(function, args)
86 finally:
87 pool.close()
~/anaconda3/lib/python3.7/multiprocessing/pool.py in map(self, func, iterable, chunksize)
266 in a list that is returned.
267 '''
--> 268 return self._map_async(func, iterable, mapstar, chunksize).get()
269
270 def starmap(self, func, iterable, chunksize=None):
~/anaconda3/lib/python3.7/multiprocessing/pool.py in get(self, timeout)
655 return self._value
656 else:
--> 657 raise self._value
658
659 def _set(self, i, obj):
RuntimeError: Initialization failed.
Code for reproducible error:
import numpy as np
data = {
"teams": 10,
"matches": 3,
"indicator_home": np.asarray([1, 4, 6]),
"indicator_away": np.asarray([2, 3, 7]),
"goals_home": np.asarray([1, 0, 3]),
"goals_away": np.asarray([0, 2, 5]),
"home_adv_mu": 0,
"home_adv_std": 0.5,
"intercept_mu": 0,
"intercept_std": 0.5,
"o_mu": np.zeros(10),
"d_mu": np.zeros(10),
"o_std": np.ones(10),
"d_std": np.ones(10),
"delta_sigma": 0.01
}
fit = model.sampling(data=data, iter=1000, chains=4)