def validate_simple_model(N_rep=20, simulation=good_simple_sim):
    q = pandas.DataFrame()
    for n in range(N_rep):
        # simulate data and fit model
        d, m = simulation()

        # tally posterior quantiles
        results = {}

        for var in 'inv_sigma_sq mu inv_tau_sq mu_by_tau alpha_bar alpha_bar_by_sigma'.split():
            stats = m[var].stats()
            results[var] = [(d[var] > m[var].trace()).sum() / float(stats['n'])]

        stats = m['alpha'].stats()
        for j, alpha_j in enumerate(d['alpha']):
            results['alpha_%d'%j] = [(alpha_j > m['alpha'].trace()[:,j]).sum() / float(stats['n'])]

        stats = m['alpha_by_sigma'].stats()
        for j, alpha_j_by_sigma in enumerate(d['alpha_by_sigma']):
            results['alpha_%d_by_sigma'%j] = [(alpha_j_by_sigma > m['alpha_by_sigma'].trace()[:,j]).sum() / float(stats['n'])]

        q = q.append(pandas.DataFrame(results, index=['q_rep_%d'%n]))

    results = validation_transform(q)

    graphics.scalar_validation_statistics(
        results, 
        [[r'$\mu/\tau$', ['mu_by_tau']],
         [r'$\sigma^{-2}$', ['inv_sigma_sq']],
         [r'$\tau^{-2}$', ['inv_tau_sq']],
         [r'$\mu$', ['mu']],
         [r'$\alpha/\sigma$', results.filter(regex='alpha_\d_by_sigma').columns],
         [r'$\alpha$', results.filter(regex='alpha_\d$').columns]])

    return results
def validate_complex_model(N_rep=20, simulation=good_complex_sim):
    q = pandas.DataFrame()
    for n in range(N_rep):
        # simulate data and fit model
        d, m = simulation()

        # tally posterior quantiles
        results = {}

        for var in 'eta_cross_eta eta delta_mu delta_beta beta gamma mu sigma'.split():
            for j, var_j in enumerate(d[var]):
                stats = m[var].stats()
                results['%s_%d'%(var, j)] = [(var_j > m[var].trace()[:,j]).sum() / float(stats['n'])]
        
        # add y_mis
        k = 0
        for j, n_j in enumerate(d['n']):
            for i in range(n_j):
                if pl.isnan(m['y'][j][i]):
                    results['y_mis_%d'%k] = [(d['y'][j][i] > m['y_pred'][j].trace()[:,i]).sum() / float(stats['n'])]
                    k += 1

        q = q.append(pandas.DataFrame(results, index=['q_rep_%d'%n]))


    results = validation_transform(q)

    # display results
    graphics.scalar_validation_statistics(
        results, 
        [[r'$y_{mis}$', results.filter(like='y_mis').columns],
         [r'$\eta\times\eta$', results.filter(like='eta_cross_eta').columns],
         [r'$\eta$', results.filter(regex='eta_\d').columns],
         [r'$\delta_\mu$', results.filter(like='delta_mu').columns],
         [r'$\delta_\beta$', results.filter(like='delta_beta').columns],
         [r'$\sigma$', results.filter(like='sigma').columns],
         [r'$\beta$', results.filter(regex='^beta').columns],
         [r'$\gamma$', results.filter(regex='gamma').columns],
         [r'$\mu$', results.filter(regex='^mu').columns],
         ])

    return results