1
votes

I want to construct a multivariate Normal model in PyMC3 in which the mean value and precision matrix involve probabilistic variables. h is meant to act as a latent variable in an larger project to which this code snippet belongs.

When I run the code provided below, I get the error message shown, and I'm not sure exactly how to interpret it. As far as I can see, the dimension of the mean value of the MvNormal (2-row column vector) match the dimension of the precision matrix B (2 x 2 matrix), so I don't expect it's the dimensions of these objects that are causing the problem. I don't know what other variables could be causing some error related to dimensions to be thrown up though. Can anyone shed some light on this please?

Here is the code:

import pymc3 as pm
import theano.tensor as tt

with pm.Model() as model:

    # A matrix
    a1 = pm.Uniform('a1', 0., 1.)
    a2 = pm.Uniform('a2', 0., 1.)
    ix = ([0, 0, 1, 1], [0, 1, 0, 1])
    A = tt.eye(2)
    A = tt.set_subtensor(A[ix], [a1, a2, 1, 0])
    # B matrix
    b1 = pm.Uniform('b1', 0., 1.)
    b2 = pm.Uniform('b2', 0., 1.)
    ix = ([0, 1], [0, 1])
    B = tt.eye(2)
    B = tt.set_subtensor(B[ix], [b1 ** 2, b2 ** 2])
    # Model
    y0 = pm.Normal('y0', mu=0., sd=1., observed=0)
    y1 = pm.Normal('y1', mu=1., sd=1., observed=1)
    s_v = tt.stack([y1, y0]).T
    h = pm.MvNormal("h", mu=pm.math.dot(A, s_v), tau=B)

Error message:

  h = pm.MvNormal("h", mu=pm.math.dot(A, s_v), tau=B)
File "/Users/Joel/PycharmProjects/AR(2)/venv/lib/python3.6/site-packages/pymc3/distributions/distribution.py", line 42, in __new__
  return model.Var(name, dist, data, total_size)
File "/Users/Joel/PycharmProjects/AR(2)/venv/lib/python3.6/site-packages/pymc3/model.py", line 809, in Var
  total_size=total_size, model=self)
File "/Users/Joel/PycharmProjects/AR(2)/venv/lib/python3.6/site-packages/pymc3/model.py", line 1209, in __init__
  self.logp_elemwiset = distribution.logp(self)
File "/Users/Joel/PycharmProjects/AR(2)/venv/lib/python3.6/site-packages/pymc3/distributions/multivariate.py", line 274, in logp
  quaddist, logdet, ok = self._quaddist(value)
File "/Users/Joel/PycharmProjects/AR(2)/venv/lib/python3.6/site-packages/pymc3/distributions/multivariate.py", line 85, in _quaddist
  raise ValueError('Invalid dimension for value: %s' % value.ndim)
ValueError: Invalid dimension for value: 0```
1

1 Answers

0
votes

I believe that you are missing the "shape" argument in the pm.MvNormal call, which lets it handle the right size of values. For example, if you have 7 variables, set shape=7.