Skip to content

ValueError when sampling ppc from HalfFlat prior with Poisson distribution. #3294

Closed
@kbruegge

Description

@kbruegge

A ValueError is raised when using sample_ppc on a trace generated by sampling a model with a Poisson distributed variable and a HalFflat prior.

import pymc3 as pm
import numpy as np

data = np.random.poisson(lam=10, size=200)

model = pm.Model()
with model:
    mu = pm.HalfFlat('sigma')
    pm.Poisson('foo', mu=mu, observed=data)
    
    trace = pm.sample(tune=1000)

with model:
    samples = pm.sample_ppc(trace)

Will raise: ValueError: Cannot sample from HalfFlat distribution

A model using a normal distribution works fine.
Like this example:

with model:
    sd = pm.HalfFlat('sigma')
    pm.Normal('foo', mu=4, sd=sd, observed=data)
    
    trace = pm.sample()

with model:
    samples = pm.sample_ppc(trace)

Using a prior other than HalfFlat also seems to work.

Please provide the full traceback.

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~/envs/gammapy/lib/python3.7/site-packages/pymc3/distributions/distribution.py in _draw_value(param, point, givens, size)
    397                 try:
--> 398                     dist_tmp.random(point=point, size=size)
    399                 except (ValueError, TypeError):

~/envs/gammapy/lib/python3.7/site-packages/pymc3/distributions/discrete.py in random(self, point, size)
    418     def random(self, point=None, size=None):
--> 419         mu = draw_values([self.mu], point=point, size=size)[0]
    420         return generate_samples(stats.poisson.rvs, mu,

~/envs/gammapy/lib/python3.7/site-packages/pymc3/distributions/distribution.py in draw_values(params, point, size)
    320                 try:  # might evaluate in a bad order,
--> 321                     evaluated[param_idx] = _draw_value(param, point=point, givens=givens.values(), size=size)
    322                     if isinstance(param, collections.Hashable) and named_nodes_parents.get(param):

~/envs/gammapy/lib/python3.7/site-packages/pymc3/distributions/distribution.py in _draw_value(param, point, givens, size)
    383         elif hasattr(param, 'random') and param.random is not None:
--> 384             return param.random(point=point, size=size)
    385         elif (hasattr(param, 'distribution') and

~/envs/gammapy/lib/python3.7/site-packages/pymc3/model.py in __call__(self, *args, **kwargs)
     41     def __call__(self, *args, **kwargs):
---> 42         return getattr(self.obj, self.method_name)(*args, **kwargs)
     43 

~/envs/gammapy/lib/python3.7/site-packages/pymc3/distributions/continuous.py in random(self, point, size)
    306         """
--> 307         raise ValueError('Cannot sample from HalfFlat distribution')
    308 

ValueError: Cannot sample from HalfFlat distribution

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-22-0d50d05c4c95> in <module>
     13 
     14 with model:
---> 15     samples = pm.sample_ppc(trace)

~/envs/gammapy/lib/python3.7/site-packages/pymc3/sampling.py in sample_ppc(trace, samples, model, vars, size, random_seed, progressbar)
   1127     # draw once to inspect the shape
   1128     var_values = list(zip(varnames,
-> 1129                           draw_values(vars, point=model.test_point, size=size)))
   1130     ppc_trace = defaultdict(list)
   1131     for varname, value in var_values:

~/envs/gammapy/lib/python3.7/site-packages/pymc3/distributions/distribution.py in draw_values(params, point, size)
    319             else:
    320                 try:  # might evaluate in a bad order,
--> 321                     evaluated[param_idx] = _draw_value(param, point=point, givens=givens.values(), size=size)
    322                     if isinstance(param, collections.Hashable) and named_nodes_parents.get(param):
    323                         givens[param.name] = (param, evaluated[param_idx])

~/envs/gammapy/lib/python3.7/site-packages/pymc3/distributions/distribution.py in _draw_value(param, point, givens, size)
    401                     # with theano.shared inputs
    402                     dist_tmp.shape = np.array([])
--> 403                     val = dist_tmp.random(point=point, size=None)
    404                     dist_tmp.shape = val.shape
    405                 return dist_tmp.random(point=point, size=size)

~/envs/gammapy/lib/python3.7/site-packages/pymc3/distributions/discrete.py in random(self, point, size)
    417 
    418     def random(self, point=None, size=None):
--> 419         mu = draw_values([self.mu], point=point, size=size)[0]
    420         return generate_samples(stats.poisson.rvs, mu,
    421                                 dist_shape=self.shape,

~/envs/gammapy/lib/python3.7/site-packages/pymc3/distributions/distribution.py in draw_values(params, point, size)
    319             else:
    320                 try:  # might evaluate in a bad order,
--> 321                     evaluated[param_idx] = _draw_value(param, point=point, givens=givens.values(), size=size)
    322                     if isinstance(param, collections.Hashable) and named_nodes_parents.get(param):
    323                         givens[param.name] = (param, evaluated[param_idx])

~/envs/gammapy/lib/python3.7/site-packages/pymc3/distributions/distribution.py in _draw_value(param, point, givens, size)
    382             return point[param.name]
    383         elif hasattr(param, 'random') and param.random is not None:
--> 384             return param.random(point=point, size=size)
    385         elif (hasattr(param, 'distribution') and
    386                 hasattr(param.distribution, 'random') and

~/envs/gammapy/lib/python3.7/site-packages/pymc3/model.py in __call__(self, *args, **kwargs)
     40 
     41     def __call__(self, *args, **kwargs):
---> 42         return getattr(self.obj, self.method_name)(*args, **kwargs)
     43 
     44 

~/envs/gammapy/lib/python3.7/site-packages/pymc3/distributions/continuous.py in random(self, point, size)
    305         ValueError
    306         """
--> 307         raise ValueError('Cannot sample from HalfFlat distribution')
    308 
    309     def logp(self, value):

ValueError: Cannot sample from HalfFlat distribution

Versions and main components

  • PyMC3 Version: 3.5
  • Theano Version: 1.03
  • Python Version: 3.7
  • Operating system: linux
  • How did you install PyMC3: pip

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions