I dont think there is anything fundamentally different, after all they are mathematical model that you apply the chain rule and product rule of probability, and the differences of discrete and continuous is mostly how you do marginalization. You can express Bayes Net with discrete distributions (i.e., Categorical distribution), and PyMC3 Model will then construct a joint distribution conditioned on the observed (but since you can also construct a model with no observed, you dont need to label it as conditional probability distribution).
Certainly, my approach will goes like this:
import pymc3 as pm
import numpy as np
import theano
import theano.tensor as tt
lookup_table = theano.shared(np.asarray([
[[.99, .01], [.1, .9]],
[[.9, .1], [.1, .9]]]))
def f(smoker, covid):
return lookup_table[smoker, covid]
with pm.Model() as m:
smoker = pm.Categorical('smoker', [.75, .25])
covid = pm.Categorical('covid', [.9, .1])
hospital = pm.Categorical('hospital', f(smoker, covid))
prior_trace = pm.sample_prior_predictive(100000)
predict_proba0 = prior_trace['covid'][
(prior_trace['smoker'] == 0)
& (prior_trace['hospital'] == 1)].mean()
predict_proba1 = prior_trace['covid'][
(prior_trace['smoker'] == 1)
& (prior_trace['hospital'] == 1)].mean()
print(f'P(covid|¬smoking, hospital) is {predict_proba0}')
print(f'P(covid|smoking, hospital) is {predict_proba1}')
which you can get an approximation of:
P(covid|¬smoking, hospital) is 0.9103626239304631
P(covid|smoking, hospital) is 0.4927695004382121