pystan.StanModel RuntimeError: Ошибка инициализации при попытке подгонки - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь подобрать модель lotka-volterra stan, определяемую как:

functions{
    real[] dz_dt(real t, real[] z, real[] theta,real[] x_r, int[] x_i){

        real u = z[1];
        real v = z[2];

        real alpha = theta[1];
        real beta = theta[2];
        real gamma = theta[3];
        real delta = theta[4];

        real du_dt = (alpha - beta * v) * u;
        real dv_dt = (-gamma + delta * u) * v;
        return { du_dt, dv_dt };
    }
}

data {
    int<lower = 0> N;           // num measurements
    real ts[N];                 // measurement times > 0
    real y_init[2];             // initial measured population
    real<lower = 0> y[N, 2];    // measured population at measurement times
}

parameters {
    real<lower = 0> theta[4];   // theta = { alpha, beta, gamma, delta }
    real<lower = 0> z_init[2];  // initial population
    real<lower = 0> sigma[2];   // error scale
}

transformed parameters {
    real z[N, 2] = integrate_ode_rk45(dz_dt, z_init, 0, ts, theta,rep_array(0.0, 0), rep_array(0, 0),1e-6, 1e-5, 1e3);
}

model {
    theta[{1, 3}] ~ normal(1, 0.5);
    theta[{2, 4}] ~ normal(0.05, 0.05);
    sigma ~ lognormal(-1, 1);
    z_init ~ lognormal(log(10), 1);
    for (k in 1:2) {
        y_init[k] ~ lognormal(log(z_init[k]), sigma[k]);
        y[ , k] ~ lognormal(log(z[, k]), sigma[k]);
    }
}

Данные, которые я использовал для подгонки модели, - это массивы с нулевыми значениями, если они представляют собой векторы или матрицу:

datos={"N":N,"ts":ts,"y_init":y[0,:],"y":y}
# where N=100
# ts.shape=(100,)
# y[0,:].shape=(2,)
# y.shape=(100,2)

Код компилируется правильно:

sm = pystan.StanModel(file='lotka-volterra.stan')

, но когда я пытаюсь соответствовать модели

fit=sm.sampling(data=datos)

возвращает большую ошибку:

---------------------------------------------------------------------------
RemoteTraceback                           Traceback (most recent call last)
RemoteTraceback: 
"""
Traceback (most recent call last):
  File "/usr/lib/python3.6/multiprocessing/pool.py", line 119, in worker
    result = (True, func(*args, **kwds))
  File "/usr/lib/python3.6/multiprocessing/pool.py", line 44, in mapstar
    return list(map(*args))
  File "stanfit4anon_model_97aa305000da3f2b4cb00e52fda1eeba_134896954346517730.pyx", line 371, in stanfit4anon_model_97aa305000da3f2b4cb00e52fda1eeba_134896954346517730._call_sampler_star
  File "stanfit4anon_model_97aa305000da3f2b4cb00e52fda1eeba_134896954346517730.pyx", line 404, in stanfit4anon_model_97aa305000da3f2b4cb00e52fda1eeba_134896954346517730._call_sampler
RuntimeError: Initialization failed.
"""

The above exception was the direct cause of the following exception:

RuntimeError                              Traceback (most recent call last)
<ipython-input-14-93e36dfa9d3e> in <module>
----> 1 fit=sm.sampling(data=datos)

/usr/local/lib/python3.6/dist-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)
    776         call_sampler_args = izip(itertools.repeat(data), args_list, itertools.repeat(pars))
    777         call_sampler_star = self.module._call_sampler_star
--> 778         ret_and_samples = _map_parallel(call_sampler_star, call_sampler_args, n_jobs)
    779         samples = [smpl for _, smpl in ret_and_samples]
    780 

/usr/local/lib/python3.6/dist-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()

/usr/lib/python3.6/multiprocessing/pool.py in map(self, func, iterable, chunksize)
    264         in a list that is returned.
    265         '''
--> 266         return self._map_async(func, iterable, mapstar, chunksize).get()
    267 
    268     def starmap(self, func, iterable, chunksize=None):

/usr/lib/python3.6/multiprocessing/pool.py in get(self, timeout)
    642             return self._value
    643         else:
--> 644             raise self._value
    645 
    646     def _set(self, i, obj):

RuntimeError: Initialization failed.
​
0
1
Python 3 | Idle
infiriendo_con_stan.ipynb
Ln 1, Col 28
...