Modeling a DAG with Discrete and Categorical Variables

How do I model the following DAG where all variables are observed and they are either integer or categorical?

Here’s the code I have so far (it doesn’t work because dimensions don’t match). And yes, variable E has no dependency with any other variables.

import numpy as np
import pandas as pd
import pymc as pm
np.random.seed(123)

N = 10000
c_range = [20000, 35000]
z_range = ["low", "mid", "hi"]
y_range = ["A", "B", "C", "D"]
e_range = [30, 50]

c_data = np.random.randint(c_range[0], c_range[1], N)
z_data = pd.Categorical(np.random.choice(z_range, N)).codes
y_data = pd.Categorical(np.random.choice(y_range, N)).codes
e_data = np.random.randint(e_range[0], e_range[1], N)

with pm.Model() as model:
    # Node priors
    beta_z0 = pm.Normal("beta_z0", shape=len(z_range))
    beta_cz = pm.Normal("beta_cz")
    beta_zy = pm.Normal("beta_zy", shape=len(z_range))
    beta_y0 = pm.Normal("beta_y0", shape=len(y_range))
    
    # Core nodes and causal relationships
    e = pm.DiscreteUniform("e", lower=e_range[0], upper=e_range[1], observed=e_data, initval=int(np.mean(e_range)))
    c = pm.DiscreteUniform("c", lower=c_range[0], upper=c_range[1], observed=c_data, initval=int(np.mean(c_range)))
    z = pm.Categorical("z", p=pm.invlogit(beta_z0 + beta_cz * c), observed=z_data)
    y = pm.Categorical("y", p=pm.invlogit(beta_y0 + pm.math.dot(beta_zy, z)), observed=y_data)
    
    trace = pm.sample(1000, random_seed=123)

Also, should I specify a different step method that’s more appropriate for a model with integer and categorical variables?