def _get_norms(self, a, b):
     _nb = _norm_cdf(b)
     _na = _norm_cdf(a)
     _sb = _norm_sf(b)
     _sa = _norm_sf(a)
     _delta = np.where(a > 0, _sa - _sb, _nb - _na)
     return _na, _nb, _sa, _sb, _delta, np.log(_delta)
Пример #2
0
    def _logpdf(self, x, betaL, betaH, mL, mH):
        """
        Return the log of the PDF of the double-sided crystalball function.
        """
        N = 1.0 / (
            mL / betaL / (mL - 1) * np.exp(-0.5 * betaL * betaL)
            + mH / betaH / (mH - 1) * np.exp(-0.5 * betaH * betaH)
            + _norm_pdf_C * (_norm_cdf(betaH) - _norm_cdf(-betaL))
        )

        def core(x, beta, m):
            return -0.5 * x * x

        def tail(x, beta, m):
            return (
                m * np.log(m / beta)
                - 0.5 * beta * beta
                - m * np.log(m / beta - beta - x)
            )

        def lhs(x, betaL, betaH, mL, mH):
            return tail(x, betaL, mL)

        def rhs(x, betaL, betaH, mL, mH):
            return _lazywhere(x < betaH, (-x, betaH, mH), f=core, f2=tail)

        return np.log(N) + _lazywhere(
            x > -betaL, (x, betaL, betaH, mL, mH), f=rhs, f2=lhs
        )
Пример #3
0
 def _argcheck(self, a, b):
     self.a = a
     self.b = b
     self._nb = _norm_cdf(b)
     self._na = _norm_cdf(a)
     self._sb = _norm_sf(b)
     self._sa = _norm_sf(a)
     self._delta = self._nb - self._na
     idx = self.a > 0
     self._delta[idx] = -(self._sb[idx] - self._sa[idx])
     self._logdelta = np.log(self._delta)
     return (a != b)
Пример #4
0
 def _argcheck(self, a, b):
     self.a = a
     self.b = b
     self._cdfb = crv_helper._norm_cdf(b)
     self._cdfa = crv_helper._norm_cdf(a)
     self._cdfminb = crv_helper._norm_cdf(-b)
     self._cdfmina = crv_helper._norm_cdf(-a)
     self._delta = np.where(
         self.a > 0, -(self._cdfminb - self._cdfmina), self._cdfb - self._cdfa
     )
     self._logdelta = np.log(self._delta)
     return a != b
Пример #5
0
 def _argcheck(self, a, b):
     self.a = a
     self.b = b
     self._nb = _norm_cdf(b)
     self._na = _norm_cdf(a)
     self._sb = _norm_sf(b)
     self._sa = _norm_sf(a)
     self._delta = self._nb - self._na
     idx = self.a > 0
     self._delta[idx] = -(self._sb[idx] - self._sa[idx])
     self._logdelta = np.log(self._delta)
     return (a != b)
Пример #6
0
    def __init__(self, mean, sigma, bounds=None):
        self.mean = mean
        self.sigma = sigma
        self._bounds = bounds
        self._norm = 1.

        if bounds:
            lo, hi = bounds
            a, b = (lo - mean) / sigma, (hi - mean) / sigma
            self.distribution = scipy.stats.truncnorm(a, b, loc=mean, scale=sigma)
            self.norm = _norm_cdf(b) - _norm_cdf(a)
            self.lognorm = np.log(self.norm)
        else:
            self.distribution = scipy.stats.norm(mean, sigma)
            self.norm = 1.
            self.lognorm = 0.
Пример #7
0
 def core(p, betaL, betaH, mL, mH):
     CL = inttail(betaL, mL)
     CH = inttail(betaH, mH)
     C = CL + CH
     N = 1 / (C + intcore(betaL, betaH))
     return _norm_ppf(
         _norm_cdf(-betaL) + (1 / _norm_pdf_C) * (p / N - CL))
Пример #8
0
    def __init__(self, mean, sigma, bounds=None):
        self.mean = mean
        self.sigma = sigma
        self._bounds = bounds
        self._norm = 1.0

        if bounds:
            lo, hi = bounds
            a, b = (lo - mean) / sigma, (hi - mean) / sigma
            self.distribution = scipy.stats.truncnorm(a, b, loc=mean, scale=sigma)
            self.norm = _norm_cdf(b) - _norm_cdf(a)
            self.lognorm = np.log(self.norm)
        else:
            self.distribution = scipy.stats.norm(mean, sigma)
            self.norm = 1.0
            self.lognorm = 0.0
Пример #9
0
    def _cdf(self, x, betaL, betaH, mL, mH):
        """
        Return CDF of the double-sided crystalball function
        """
        N = 1.0 / (
            mL / betaL / (mL - 1) * np.exp(-0.5 * betaL * betaL)
            + mH / betaH / (mH - 1) * np.exp(-0.5 * betaH * betaH)
            + _norm_pdf_C * (_norm_cdf(betaH) - _norm_cdf(-betaL))
        )

        def inttail(beta, m):
            return m / beta / (m - 1) * np.exp(-0.5 * beta * beta)

        def intcore(betaL, betaH):
            return _norm_pdf_C * (_norm_cdf(betaH) - _norm_cdf(-betaL))

        def tail(x, beta, m):
            return (
                (m / beta) ** m
                * np.exp(-0.5 * beta * beta)
                * (m / beta - beta - x) ** (1 - m)
                / (m - 1)
            )

        def hightail(x, betaL, betaH, mL, mH):
            return (
                inttail(betaL, mL)
                + intcore(betaL, betaH)
                + inttail(betaH, mH)
                - tail(-x, betaH, mH)
            )

        def core(x, betaL, betaH, mL, mH):
            return inttail(betaL, mL) + _norm_pdf_C * (_norm_cdf(x) - _norm_cdf(-betaL))

        def lhs(x, betaL, betaH, mL, mH):
            return tail(x, betaL, mL)

        def rhs(x, betaL, betaH, mL, mH):
            return _lazywhere(x < betaH, (x, betaL, betaH, mL, mH), f=core, f2=hightail)

        return N * _lazywhere(x > -betaL, (x, betaL, betaH, mL, mH), f=rhs, f2=lhs)
def test_johnson_quantile_fit():
    quantile_pts = np.array(_norm_cdf([-1.5, -0.5, 0.5, 1.5]))
    test_quantiles = [[1, 1.2, 1.4, 10], [1, 1.2, 1.4, 3], [-2, -1, 1, 2]]

    for quantiles_in in test_quantiles:
        dist = j_util._fit_johnson_by_quantiles(quantiles_in)
        quantiles_out = dist.ppf(quantile_pts)
        npt.assert_allclose(
            quantiles_in,
            quantiles_out,
            decimal,
            err_msg=f'Fitting johnson distribution by quartiles failed for test '
            f'quartiles {quantiles_in}')
Пример #11
0
 def _cdf(self, x, a, b):
     return (crv_helper._norm_cdf(x) - self._cdfa) / self._delta
Пример #12
0
 def intcore(betaL, betaH):
     return _norm_pdf_C * (_norm_cdf(betaH) - _norm_cdf(-betaL))
Пример #13
0
 def core(x, betaL, betaH, mL, mH):
     return inttail(
         betaL, mL) + _norm_pdf_C * (_norm_cdf(x) - _norm_cdf(-betaL))