Thank you for this clarification! I wrongly assumed that the PPC was doing a type of simple bootstrapping from the posterior over the observed variable, and extended that logic to the latent variables. I didn’t notice that pm.sample_posterior_predictive draws samples for each observation, so you get back n_obs x n_chains x n_draws.