[' # Define priors\n    alpha = pm.Normal(\'alpha\', mu=0, sigma=10)\n    beta = pm.Normal(\'beta\', mu=0, sigma=10)\n    sigma = pm.HalfNormal(\'sigma\', sigma=10)\n    \n    # Define likelihood\n    y_obs = pm.Normal(\'y_obs\', mu=alpha + beta * X, sigma=sigma, observed=y)\n    \n    # Sample posterior\n    trace = pm.sample(1000, tune=1000, chains=4, return_inferencedata=True, idata_kwargs={"log_likelihood": True})\n\n# Posterior predictive checks\ny_pred = trace.posterior_predictive[\'y_obs\'].values\ny_pred_mean = np.mean(y_pred, axis=0)\ny_pred_std = np.std(y_pred, axis=0)\n\n# Plot posterior predictive checks\nplt.figure(figsize=(10, 6))\nplt.errorbar(X, y_pred_mean, yerr=y_pred_std, fmt=\'o\', label=\'Posterior Predictive\')\nplt.plot(X, y, \'o\', label=\'Data\')\nplt.xlabel(\'X\')\nplt.ylabel(\'y\')\nplt.legend()\nplt.show()\n\n# Posterior summary\naz.summary(trace, round_to=3)\n\n# Posterior predictive checks\ny_pred = trace.posterior_predictive[\'y_obs\'].values\ny_pred_mean = np.mean(y_pred, axis=0)\ny_pred_std = np.std(y_pred, axis=0)\n\n# Plot posterior predictive checks\nplt.figure(figsize=(10, 6))\nplt.errorbar(X, y_pred_mean, yerr=y_pred_std, fmt=\'o\', label=\'Posterior Predictive\')\nplt.plot(X, y, \'o\', label=\'Data\')\nplt.xlabel(\'X\')\nplt.ylabel(\'y\')\nplt.legend()\nplt.show()\n\n# Posterior summary\naz.summary(trace, round_to=3)\n\n# Posterior predictive checks\ny_pred =']