Source code for bumps.dream.geweke

"""
Convergence test statistic from Gelman and Rubin, 1992.
"""

from __future__ import division

__all__ = ["geweke"]

from numpy import var, mean, ones, sqrt, reshape, log10, abs


[docs] def geweke(sequences, portion=0.25): """ Calculates the Geweke convergence diagnostic Refer to: pymc-devs.github.com/pymc/modelchecking.html#informal-methods support.sas.com/documentation/cdl/en/statug/63033/HTML/default/viewer.htm#statug_introbayes_sect008.html """ # Find the size of the sample chain_len, nchains, nvar = sequences.shape z_stat = -2*ones(nvar) if chain_len >= 2: # Only use the last portion of the sample try: front_portion, back_portion = portion except TypeError: front_portion = back_portion = portion front_len = int(chain_len*front_portion) back_len = int(chain_len*back_portion) #print "STARTING SHAPE", sequences.shape seq1 = reshape(sequences[:front_len, :, :], (front_len*nchains, nvar)) seq2 = reshape(sequences[-back_len:, :, :], (back_len*nchains, nvar)) #print "SEQ1", seq1.shape, 'SEQ2', seq2.shape # Step 1: Determine the sequence means meanseq1 = mean(seq1, axis=0) meanseq2 = mean(seq2, axis=0) #print "SHAPEs", meanseq1.shape, meanseq2.shape var1 = var(seq1, axis=0) var2 = var(seq2, axis=0) denom = sqrt(var1+var2) index = denom > 0 z_stat[index] = (meanseq1 - meanseq2)[index]/denom[index] # z_stat is now the Z score for every chain and parameter # in that with shape (chains, vars) # To make it easier to look at, return the average for the vars. if 0: avg_z = mean(z_stat, axis=0) lavg_z = log10(abs(avg_z)) return lavg_z.tolist() if 0: avg_z = z_stat lavg_z = log10(abs(avg_z)) return lavg_z.flatten().tolist() else: return z_stat.flatten().tolist() # TODO: code is wrong if chain length is 1, since lavg_z is not defined return lavg_z.tolist()