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)
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 )
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)
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
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)
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.
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))
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
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}')
def _cdf(self, x, a, b): return (crv_helper._norm_cdf(x) - self._cdfa) / self._delta
def intcore(betaL, betaH): return _norm_pdf_C * (_norm_cdf(betaH) - _norm_cdf(-betaL))
def core(x, betaL, betaH, mL, mH): return inttail( betaL, mL) + _norm_pdf_C * (_norm_cdf(x) - _norm_cdf(-betaL))