def stats2z_moment(stats): # MODIFIED FROM http://statsmodels.sourceforge.net/devel/_modules/statsmodels/stats/moment_helpers.html # ADDED count mc0, mc1, mc2, skew, kurt = stats.count, nvl(stats.mean, 0), nvl( stats.variance, 0), nvl(stats.skew, 0), nvl(stats.kurtosis, 0) mz0 = mc0 mz1 = mc1 * mc0 mz2 = (mc2 + mc1 * mc1) * mc0 mc3 = nvl(skew, 0) * (mc2**1.5) # 3rd central moment mz3 = (mc3 + 3 * mc1 * mc2 + mc1**3) * mc0 # 3rd non-central moment mc4 = (nvl(kurt, 0) + 3.0) * (mc2**2.0) # 4th central moment mz4 = (mc4 + 4 * mc1 * mc3 + 6 * mc1 * mc1 * mc2 + mc1**4) * mc0 m = Z_moment(mz0, mz1, mz2, mz3, mz4) if DEBUG: from util.testing.fuzzytestcase import assertAlmostEqualValue globals()["DEBUG"] = False try: v = z_moment2stats(m, unbiased=False) assertAlmostEqualValue(v.count, stats.count) assertAlmostEqualValue(v.mean, stats.mean) assertAlmostEqualValue(v.variance, stats.variance) assertAlmostEqualValue(v.skew, stats.skew) assertAlmostEqualValue(v.kurtosis, stats.vkurtosis) except Exception, e: v = z_moment2stats(m, unbiased=False) Log.error("programmer error") globals()["DEBUG"] = True
def z_moment2stats(z_moment, unbiased=True): Z = z_moment.S N = Z[0] if N == 0: return Stats() mean = Z[1] / N Z2 = Z[2] / N Z3 = Z[3] / N Z4 = Z[4] / N if N == 1: variance = None skew = None kurtosis = None else: variance = (Z2 - mean * mean) error = -EPSILON * (abs(Z2) + 1) # EXPECTED FLOAT ERROR if error < variance <= 0: # TODO: MAKE THIS A TEST ON SIGNIFICANT DIGITS variance = 0 skew = None kurtosis = None elif variance < error: Log.error("variance can not be negative ({{var}})", {"var": variance}) else: mc3 = (Z3 - (3 * mean * variance + mean**3)) # 3rd central moment mc4 = (Z4 - (4 * mean * mc3 + 6 * mean * mean * variance + mean**4)) skew = mc3 / (variance**1.5) kurtosis = (mc4 / (variance**2.0)) - 3.0 stats = Stats(count=N, mean=mean, variance=variance, skew=skew, kurtosis=kurtosis, unbiased=unbiased) if DEBUG: from util.testing.fuzzytestcase import assertAlmostEqualValue globals()["DEBUG"] = False v = Null try: v = stats2z_moment(stats) for i in range(5): assertAlmostEqualValue(v.S[i], Z[i]) except Exception, e: Log.error( "Convertion failed. Programmer error:\nfrom={{from|indent}},\nresult stats={{stats|indent}},\nexpected param={{expected|indent}}", { "from": Z, "stats": stats, "expected": v.S }, e) globals()["DEBUG"] = True
except Exception, e: DEBUG_STRANGMAN = False def chisquare(f_obs, f_exp): try: py_result = strangman.stats.chisquare(f_obs, f_exp) except Exception, e: Log.error("problem with call", e) if DEBUG_STRANGMAN: from util.testing.fuzzytestcase import assertAlmostEqualValue sp_result = scipy.stats.chisquare(np.array(f_obs), f_exp=np.array(f_exp)) if not assertAlmostEqualValue(sp_result[0], py_result[0]) and assertAlmostEqualValue( sp_result[1], py_result[1]): Log.error("problem with stats lib") return py_result def stats2z_moment(stats): # MODIFIED FROM http://statsmodels.sourceforge.net/devel/_modules/statsmodels/stats/moment_helpers.html # ADDED count mc0, mc1, mc2, skew, kurt = stats.count, nvl(stats.mean, 0), nvl( stats.variance, 0), nvl(stats.skew, 0), nvl(stats.kurtosis, 0) mz0 = mc0 mz1 = mc1 * mc0 mz2 = (mc2 + mc1 * mc1) * mc0