def examples_normexpand(): skewnorm = SkewNorm_gen() rvs = skewnorm.rvs(5, size=100) normexpan = NormExpan_gen(rvs, mode="sample") smvsk = stats.describe(rvs)[2:] print "sample: mu,sig,sk,kur" print smvsk dmvsk = normexpan.stats(moments="mvsk") print "normexpan: mu,sig,sk,kur" print dmvsk print "mvsk diff distribution - sample" print np.array(dmvsk) - np.array(smvsk) print "normexpan attributes mvsk" print mc2mvsk(normexpan.cnt) print normexpan.mvsk mc, mnc = mvsk2m(dmvsk) print "central moments" print mc print "non-central moments" print mnc pdffn = pdf_moments(mc) print "\npdf approximation from moments" print "pdf at", mc[0] - 1, mc[0] + 1 print pdffn([mc[0] - 1, mc[0] + 1]) print normexpan.pdf([mc[0] - 1, mc[0] + 1])
def __init__(self, args, **kwds): # todo: replace with super call distributions.rv_continuous.__init__( self, name="Normal Expansion distribution", shapes="alpha", extradoc=""" The distribution is defined as the Gram-Charlier expansion of the normal distribution using the first four moments. The pdf is given by pdf(x) = (1+ skew/6.0 * H(xc,3) + kurt/24.0 * H(xc,4))*normpdf(xc) where xc = (x-mu)/sig is the standardized value of the random variable and H(xc,3) and H(xc,4) are Hermite polynomials Note: This distribution has to be parameterized during initialization and instantiation, and does not have a shape parameter after instantiation (similar to frozen distribution except for location and scale.) Location and scale can be used as with other distributions, however note, that they are relative to the initialized distribution. """, ) # print args, kwds mode = kwds.get("mode", "sample") if mode == "sample": mu, sig, sk, kur = stats.describe(args)[2:] self.mvsk = (mu, sig, sk, kur) cnt = mvsk2mc((mu, sig, sk, kur)) elif mode == "mvsk": cnt = mvsk2mc(args) self.mvsk = args elif mode == "centmom": cnt = args self.mvsk = mc2mvsk(cnt) else: raise ValueError, "mode must be 'mvsk' or centmom" self.cnt = cnt # self.mvsk = (mu,sig,sk,kur) # self._pdf = pdf_moments(cnt) self._pdf = pdf_mvsk(self.mvsk)