Code
import os
if "KERAS_BACKEND" not in os.environ:
# set this to "torch", "tensorflow", or "jax"
"KERAS_BACKEND"] = "jax"
os.environ[
import numpy as np
import bayesflow as bf
import matplotlib.pyplot as plt
import os
if "KERAS_BACKEND" not in os.environ:
# set this to "torch", "tensorflow", or "jax"
"KERAS_BACKEND"] = "jax"
os.environ[
import numpy as np
import bayesflow as bf
import matplotlib.pyplot as plt
\[\begin{equation} \begin{aligned} \alpha, \beta, \gamma & \sim \text{Beta}(1, 1)\\[1pt] \pi_a & \leftarrow \alpha \beta \\ \pi_b & \leftarrow \alpha (1-\beta) \\ \pi_c & \leftarrow (1-\alpha) (1-\gamma) \\ \pi_d & \leftarrow (1-\alpha) \gamma \\ \epsilon & \leftarrow \alpha\beta + (1-\alpha)\gamma\\ \psi & (\pi_a + \pi_b) (\pi_a + \pi_c) + (\pi_b + \pi_d) (\pi_c + \pi_d) \\ \kappa & \leftarrow (\epsilon - \psi) / (1-\psi)\\[1pt] y & \sim \text{Multinomial}(\pi, n) \end{aligned} \end{equation}\]
def context():
return dict(n=np.random.randint(low=150, high=600))
def prior():
= np.random.beta(a=1, b=1)
alpha = np.random.beta(a=1, b=1)
beta = np.random.beta(a=1, b=1)
gamma
= np.array([
pi * beta,
alpha * (1-beta),
alpha 1-alpha) * (1-gamma),
(1-alpha) * gamma
(
])
= alpha * beta + (1-alpha) * gamma
epsilon = (pi[0] + pi[1]) * (pi[0] + pi[2]) + (pi[1] + pi[3]) * (pi[2] + pi[3])
psi
= (epsilon - psi)/(1-psi)
kappa
return dict(pi=pi, kappa=kappa)
def likelihood(n, pi):
= np.random.multinomial(n=n, pvals=pi)
y return dict(y=y)
= bf.make_simulator([context, prior, likelihood]) simulator
= (
adapter
bf.Adapter()"kappa", lower=-1, upper=1)
.constrain("kappa", "inference_variables")
.rename("y", "inference_conditions")
.rename( )
= bf.BasicWorkflow(
workflow =simulator,
simulator=adapter,
adapter=bf.networks.CouplingFlow()
inference_network )
= workflow.fit_online(epochs=50, batch_size=512) history
= simulator.sample(1000)
test_data =workflow.plot_default_diagnostics(test_data=test_data, num_samples=500) figs
We will apply the model to three datasets reported by Lee & Wagenmakers (2013, pp. 67–68).
= dict(
inference_data = np.array(
y
[14, 4, 5, 210], # influenza
[20, 7, 103, 417], # hearing loss
[0, 0, 13, 157], # rare disease
[
]
) )
= workflow.sample(num_samples=2000, conditions=inference_data) samples
= plt.subplots(ncols=3)
fig, axs = ["Influenza", "Hearing loss", "Rare Disease"]
titles
for i, ax in enumerate(axs):
ax.set_title(titles[i])"kappa"][i],
ax.hist(samples[=True, color="lightgray", edgecolor="black", bins=np.arange(-1, 1.05, 0.05))
density
r"$\kappa$")
fig.supxlabel("Density")
fig.supylabel( fig.tight_layout()