Ejemplo n.º 1
0
def error_ellipse(x, y, center='mean', level=0.68):
    '''compute the position, major axis, minor axis, and position angle
   of an ellipse that represents and [level] confidence interval.'''

    if center == 'mean':
        p1 = mean(x)
        p2 = mean(y)
    else:
        p1 = median(x)
        p2 = median(y)

    covar = covarc([x, y], center)

    eigval, eigvec = linalg.eig(covar)
    eigval = map(abs, eigval)

    dchi2 = brentq(lambda x: chdtr(2, x) - level, 0, 100)

    if eigval[0] > eigval[1]:
        major = sqrt(eigval[0] * dchi2)
        minor = sqrt(eigval[1] * dchi2)
        pa = arctan2(eigvec[1, 0], eigvec[0, 0]) * 180.0 / pi
    else:
        major = sqrt(eigval[1] * dchi2)
        minor = sqrt(eigval[0] * dchi2)
        pa = arctan2(eigvec[1, 1], eigvec[0, 1]) * 180.0 / pi

    return (p1, p2, major, minor, pa)
Ejemplo n.º 2
0
def neg_2_log_likelihood_ratio_CDF(l, mu, sigma):
    """Calculate the CDF of -2log(likelihood ratio) CDF.

    Parameters
    ----------
    l : float
        The :math:`l = \lambda = -2ln(\Lambda)` value to calculate the CDF at.
    mu : float
        The expectation value to test.
    sigma : float
        The standard deviation of the distribution.

    Returns
    -------
    prob : float (between 0 and 1)
        The probability :math:`CDF(l) = Prob(\lambda < l)`.
    """
    # p_lz = stats.norm.cdf(0, loc=mu, scale=sigma)
    p_lz = special.ndtr(-mu / sigma)
    p_gz = 1 - p_lz

    l_crit = mu**2 / sigma**2
    # chi2 = stats.chi2(1)
    # nu = chi2.cdf(l_crit)
    nu = special.chdtr(1, l_crit)

    if l < l_crit:
        # p_plus = p_gz * 2 * chi2.cdf(l) / (1.0 + nu)
        p_plus = p_gz * 2 * special.chdtr(1, l) / (1.0 + nu)
    else:
        # p_plus = p_gz * (chi2.cdf(l) + nu) / (1.0 + nu)
        p_plus = p_gz * (special.chdtr(1, l) + nu) / (1.0 + nu)

    tau = 0.5 * sigma**2 / mu * (mu**2 / sigma**2 - l)
    if tau < 0:
        # p_minus = p_lz - stats.norm.cdf(tau, loc=mu, scale=sigma)
        p_minus = p_lz - special.ndtr((tau - mu) / sigma)
    else:
        p_minus = 0
    return p_plus + p_minus
Ejemplo n.º 3
0
    def fit_for_A(self, sep, del_z_bar, N, b_g_rel, c_rel, n, Cov_mat,
                  covar_type, nbins):
        self.c_rel = c_rel
        self.get_quad_coeff_for_alpha(b_g_rel, n)
        A_step, dA = np.linspace(0., 10., 199, endpoint=True, retstep=True)
        prob_step = np.asarray([
            np.exp(-0.5 * self.chi_sqrd(A_i, del_z_bar, sep, Cov_mat))
            for A_i in A_step
        ])
        prob_step *= 1. / simp_integral(dA, prob_step)
        exp_A = simp_integral(dA, prob_step * A_step)
        var_A = simp_integral(dA, prob_step * np.power(A_step, 2)) - np.power(
            exp_A, 2)

        plt.plot(A_step, prob_step)
        plt.axvline(x=exp_A, ymin=0, ymax=1, color='k')
        plt.axvline(x=exp_A - np.sqrt(var_A),
                    ymin=0,
                    ymax=1,
                    color='k',
                    linestyle='--')
        plt.axvline(x=exp_A + np.sqrt(var_A),
                    ymin=0,
                    ymax=1,
                    color='k',
                    linestyle='--')
        plt.xlabel('A')
        plt.ylabel('Probability of fit')
        plt.savefig('auto/probability/Prob_A_{0}_{1}.png'.format(
            n, covar_type))
        plt.close()

        CP_A = chdtr(nbins - 1, self.chi_sqrd(0, del_z_bar, sep, Cov_mat))
        signif_A = np.sqrt(2) * erfinv(CP_A)
        j = (np.where(
            np.array([
                simp_integral(dA, prob_step[:i])
                for i in range(3, A_step.size + 1, 2)
            ]) > 0.95)[0][0] + 1) * 2
        diff = 0.95 - simp_integral(dA, prob_step[:j - 1])
        if 0.5 * dA * (prob_step[j - 2] + prob_step[j - 1]) > diff:
            A_95 = A_step[j - 2] + 0.5 * dA
        else:
            A_95 = A_step[j - 1] + 0.5 * dA

        print("   Best fit A: {0}".format(exp_A))
        print("   error bars: {0}".format(np.sqrt(var_A)))
        print("   significance: {0}".format(signif_A))
        print("   Chi^2 of fit: {0}".format(
            self.chi_sqrd(exp_A, del_z_bar, sep, Cov_mat)))
        print("   95% confidence: {0}".format(A_95))
        return exp_A, var_A
Ejemplo n.º 4
0
    def cdf(self, x):
        """
        Computes the cumulative distribution function of the
        distribution at the point(s) x. The cdf is defined as follows:
            F(x|k) = gammainc(k/2, x/2) / gamma(k/2)

        Where gammainc and gamma are the incomplete gamma and gamma functions,
        respectively.

        Parameters
        ----------
        x: array, dtype=float, shape=(m x n)
            The value(s) at which the user would like the cdf evaluated.
            If an array is passed in, the cdf is evaluated at every point
            in the array and an array of the same size is returned.

        Returns
        -------
        cdf: array, dtype=float, shape=(m x n)
            The cdf at each point in x.
        """
        cdf = chdtr(self.k, x)

        return cdf
Ejemplo n.º 5
0
    def cdf(self, x):
        """
        Computes the cumulative distribution function of the
        distribution at the point(s) x. The cdf is defined as follows:
            F(x|k) = gammainc(k/2, x/2) / gamma(k/2)

        Where gammainc and gamma are the incomplete gamma and gamma functions,
        respectively.

        Parameters
        ----------
        x: array, dtype=float, shape=(m x n)
            The value(s) at which the user would like the cdf evaluated.
            If an array is passed in, the cdf is evaluated at every point
            in the array and an array of the same size is returned.

        Returns
        -------
        cdf: array, dtype=float, shape=(m x n)
            The cdf at each point in x.
        """
        cdf = chdtr(self.k, x)

        return cdf
Ejemplo n.º 6
0
def _cdfchi2(x, df):
    return special.chdtr(df, x)
Ejemplo n.º 7
0
    def fit_for_A(self, seps, del_z_bar, N, b_g_rel, c_rel, n, Cov_mat,
                  covar_type, nbins):
        # This is to isolate the n for debugging
        i, j = np.indices(Cov_mat.shape)
        mod_matrix = np.zeros(Cov_mat.shape)
        mod_matrix[np.logical_and(i == j, i >= nbins * (n - 1))] = 1
        Cov_mat_I = np.matrix(mod_matrix) * Cov_mat.I * np.matrix(mod_matrix)
        # end debugging block
        self.c_rel = c_rel
        self.get_quad_coeff_for_alpha(b_g_rel, n)
        del_z_bar_flat = del_z_bar.flatten()
        print(del_z_bar_flat)
        A_step, dA = np.linspace(0.,
                                 10.**(2 - n / 2.),
                                 199,
                                 endpoint=True,
                                 retstep=True)
        prob_step = np.asarray([
            np.exp(-0.5 *
                   self.chi_sqrd(A_i, del_z_bar_flat, seps, n, Cov_mat_I))
            for A_i in A_step
        ])
        prob_step *= 1. / simp_integral(dA, prob_step)
        exp_A = simp_integral(dA, prob_step * A_step)
        var_A = simp_integral(dA, prob_step * np.power(A_step, 2)) - np.power(
            exp_A, 2)
        # find max probability A
        bi = np.array([0, 10**(2. - n / 2.)])
        for i in range(20):
            left_chi = self.chi_sqrd(bi[0], del_z_bar_flat, seps, n, Cov_mat)
            right_chi = self.chi_sqrd(bi[1], del_z_bar_flat, seps, n, Cov_mat)
            if left_chi < right_chi:
                bi[1] = np.average(bi)
            else:
                bi[0] = np.average(bi)
        A_min_chi = np.average(bi)

        plt.plot(A_step, prob_step)
        plt.axvline(x=exp_A, ymin=0, ymax=1, color='k')
        plt.axvline(x=exp_A - np.sqrt(var_A),
                    ymin=0,
                    ymax=1,
                    color='k',
                    linestyle='--')
        plt.axvline(x=exp_A + np.sqrt(var_A),
                    ymin=0,
                    ymax=1,
                    color='k',
                    linestyle='--')
        plt.axvline(x=A_min_chi, ymin=0, ymax=1, color='r')
        plt.xlabel('A')
        plt.ylabel('Probability of fit')
        plt.savefig('auto/probability/combined/Prob_A_{0}_{1}.png'.format(
            n, covar_type))
        plt.close()

        CP_A = chdtr(nbins * n - 1,
                     self.chi_sqrd(0, del_z_bar_flat, seps, n, Cov_mat))
        signif_A = np.sqrt(2) * erfinv(CP_A)
        j = (np.where(
            np.array([
                simp_integral(dA, prob_step[:i])
                for i in range(3, A_step.size + 1, 2)
            ]) > 0.95)[0][0] + 1) * 2
        diff = 0.95 - simp_integral(dA, prob_step[:j - 1])
        if 0.5 * dA * (prob_step[j - 2] + prob_step[j - 1]) > diff:
            A_95 = A_step[j - 2] + 0.5 * dA
        else:
            A_95 = A_step[j - 1] + 0.5 * dA

        print("   Best fit A: {0}".format(exp_A))
        print("   A with max Prob: {0}".format(A_min_chi))
        print("   error bars: {0}".format(np.sqrt(var_A)))
        print("   significance: {0}".format(signif_A))
        print("   Chi^2 of fit: {0}".format(
            self.chi_sqrd(exp_A, del_z_bar_flat, seps, n, Cov_mat)))
        print("   95% confidence: {0}".format(A_95))
        return exp_A, var_A
Ejemplo n.º 8
0
def _cdfchi2(x, df):
    return special.chdtr(df, x)  # pylint: disable=no-member
Ejemplo n.º 9
0
def _cdfchi2(x, df):
    return special.chdtr(df, x)