Hi Pymc3 Comunity,
I’m posting this question here as well as rasing it as an issue on Github, in case someone here has seen something similar.
I get the above error when sampling from the posterior predictive.
It appears that somewhere in the theano graph a theano.NoneConst is being created, and sample_posterior_predictive throws an error when it tries to sample from it.
In the example model below, the ANOVA type model has a mean for each group, where each group is defined by 2 factors (x and g). Both g and x are used to pick a specific group mean parameter which the DV (y) is then sampled from. Here im modeling a single DV, but i’d like to extend it to model 2 DV, so my parameters have a dimention for the output.
I think this is something to do with funny broadcasting, because when I don’t include the y dimension in my parameters, there is no issue (see note in code).
The example:
#create some data
n_d = 500
n_x = 2
n_g = 10
g = np.random.randint(0, n_g, (n_d,)) # group
x = np.random.randint(0, n_x, (n_d,)) # x factor
true_x_effect = np.random.normal(0, 10, (n_x,))
true_g_effect = np.random.normal(0, 10, (n_g,))
y = np.random.normal(true_x_effect[x]+true_g_effect[g], 1)
data = pd.DataFrame({'x':x, 'y1':y, 'g':g})
y_vars = ['y1']
n_y = len(y_vars)
with pm.Model() as model:
multi_dim_rv = pm.Normal('multi_dim_rv', mu=0, sd=1, shape=(n_x, n_g, n_y))
indexed_rv = multi_dim_rv[data['x'], data['g'], :] #if : is replaced by 0 (effectivly removing y dimention), this works fine
error = pm.HalfCauchy('error', 10)
obs_data = data[y_vars].values
obs = pm.Normal('obs', mu=indexed_rv, sd=error, observed=obs_data)
print('dist_shape', obs.distribution.logp(data[y_vars].values).tag.test_value.shape) #shapes seem ok
print('data_shape', obs_data.shape) #shapes seem ok
trace = pm.sample() #samples fine.
pm.sample_posterior_predictive(trace) #NoneConst error here.
Trace:
Traceback (most recent call last):
File "/home/bdyetton/PSleep/src/modeling/run_models.py", line 323, in <module>
test_ppc_issue()
File "/home/bdyetton/PSleep/src/modeling/run_models.py", line 282, in test_ppc_issue
pm.sample_posterior_predictive(trace) #NoneConst error here.
File "/home/bdyetton/anaconda3/envs/psleep/lib/python3.7/site-packages/pymc3/sampling.py", line 1167, in sample_posterior_predictive
values = draw_values(vars, point=param, size=size)
File "/home/bdyetton/anaconda3/envs/psleep/lib/python3.7/site-packages/pymc3/distributions/distribution.py", line 627, in draw_values
size=size)
File "/home/bdyetton/anaconda3/envs/psleep/lib/python3.7/site-packages/pymc3/distributions/distribution.py", line 817, in _draw_value
size=None))
File "/home/bdyetton/anaconda3/envs/psleep/lib/python3.7/site-packages/pymc3/distributions/continuous.py", line 495, in random
point=point, size=size)
File "/home/bdyetton/anaconda3/envs/psleep/lib/python3.7/site-packages/pymc3/distributions/distribution.py", line 627, in draw_values
size=size)
File "/home/bdyetton/anaconda3/envs/psleep/lib/python3.7/site-packages/pymc3/distributions/distribution.py", line 851, in _draw_value
raise ValueError('Unexpected type in draw_value: %s' % type(param))
ValueError: Unexpected type in draw_value: <class 'theano.gof.graph.Constant'>
Has anyone hit something like this before?
Versions and main components
- PyMC3 Version: Master (8/18/19)
- Theano Version: 1.0.4
- Python Version: 3.7
- Operating system: Windows 10
- How did you install PyMC3: pip