# Source code for bumps.dream.ksmirnov

"""
Kolmogorov-Smirnov test for MCMC convergence.
Use the K-S tests to compare the distribution of values at the front of
the chain to that at the end of the chain. If the distributions are
significantly different, then the MCMC chain has not converged.
"""
__all__ = ["ksmirnov"]
from numpy import reshape, apply_along_axis
from scipy.stats import ks_2samp
[docs]
def ksmirnov(seq, portion=0.25, filter_order=15):
"""
Kolmogorov-Smirnov test of similarity between the empirical distribution
at the start and at the end of the chain. Apply a median
filter (filter=15) on neighbouring K-S values to reduce variation in
the test statistic value.
"""
chlen, nchains, nvars = seq.shape
count = portion*chlen*nchains
n = filter_order
ks, p = apply_along_axis(lambda chain: _ksm(chain, n, count),
0, reshape(seq, (chlen*nchains, nvars)))
return ks, p
def _ksm(chain, n, count):
#return ks_2samp(chain[:count], chain[-count:])
ks, p = zip(*[ks_2samp(chain[i:count+i], chain[-count-n+i:-n+i])
for i in range(n)])
return sorted(ks)[(n-1)//2], sorted(p)[(n-1)//2]