Dimension of "mu" in Normal Dist?

I’m trying to build the following model in PyMC3:

PGM_Fig

I have a separately defined Generate() function with some hyperparameters, to generate data according to the model shown.The X_1 and X_2 variables are observed vectors/matrices.

The following code generates a TypeError for wrong dimensions of “mu” for variable “C”. Why is it acceptable to pass a multi-dim array to “mu” of a likelihood distribution, but not for a latent variable? What if my system has a deterministic input vector that feeds into several layers of distributions and transformations before being observed as a likelihood?

from PGM_RandData import Generate
import pymc3 as pm
import numpy as np
import matplotlib.pyplot as plt

# Generate random data, size = number of points
size = int(40)

data = Generate(size)

test_model2 = pm.Model()

with test_model2:

    ### LEFT SIDE #
    # Assign a prior for hyperparameters
    mu_A = pm.Normal('muA', sd=50)
    sig_A = pm.HalfNormal('sigA', sd=5)
    sig_C = pm.HalfNormal('sigC', sd=5)

    # Define conditional probabilities
    A = pm.Normal('A', mu=mu_A, sd=sig_A)
    mu_C = A * data.X_1**2
    C = pm.Normal('C', mu=mu_C, sd=sig_C)

    # Create likelihood
    # A_obs = pm.Normal('A_obs', mu=mu_A, sd=sig_A, observed=np.array(data.A))
    C_obs = pm.Normal('C_obs', mu=mu_C, sd=sig_C, observed=np.array(data.C))

    ### RIGHT SIDE #
    # Priors
    mu_B = pm.Normal('muB', sd=50)
    sig_B = pm.HalfNormal('sigB',sd=5)
    sig_D = pm.HalfNormal('sigD', sd=5)

    # Conditional probabilities
    B = pm.Normal('B', mu=mu_B, sd=sig_B)
    mu_D = 1 / (1 + np.exp(-B * data.X_2))
    # D = pm.Normal('D', mu=mu_D, sd=sig_D)

    # Likelihood
    # B_obs = pm.Normal('B_obs', mu=mu_B, sd=sig_B, observed=np.array(data.B))
    D_obs = pm.Normal('D_obs', mu=mu_D, sd=sig_D, observed=np.array(data.D))

    trace1 = pm.sampling.sample(draws=2000, cores=1)
    # trace2 = pm.sampling.sample_prior_predictive(5000, var_names=["A", "B", "C", "D"])

pm.plots.traceplot(trace1)
# pm.plots.traceplot(trace2)

plt.show()

Error:
TypeError: For compute_test_value, one input test value does not have the requested type.

The error when converting the test value to that variable type:
Wrong number of dimensions: expected 0, got 1 with shape (40,).

A variable representing the likelihood knows what shape it’s supposed to have because you give it observed data. It can figure out the shape from that. I can’t run your script since I don’t have your data generating function but I can tell you that the most likely solution is to pass the keyword argument shape=size to the appropriate variable constructor (which I’m guessing is C but I’m not sure).