def CombinePValues(covar_matrix, p_values, extra_info = False):
    m = int(covar_matrix.shape[0])
    #print "m", m
    df_fisher = 2.0*m
    Expected = 2.0*m
    cov_sum = 0
    for i in range(m):
        for j in range(i+1, m):
            cov_sum += covar_matrix[i, j]
    
    #print "cov sum", cov_sum
    Var = 4.0*m+2*cov_sum
    c = Var/(2.0*Expected)
    df_brown = 2.0*Expected**2/Var
    if df_brown > df_fisher:
        df_brown = df_fisher
        c = 1.0

    x = 2.0*sum([-np.log(p) for p in p_values])
    #print "x", x
    p_brown = chi2_cdf(df_brown, 1.0*x/c)
    p_fisher = chi2_cdf(df_fisher, 1.0*x)
    
    if extra_info:
        return p_brown, p_fisher, c, df_brown
    else:
        return p_brown
def CombinePValues(covar_matrix, p_values, extra_info=False):
    '''
Input: A m x m numpy array of covariances between transformed data vectors and a vector of m p-values to combine.
Output: A combined P-value. 
        If extra_info == True: also returns the p-value from Fisher's method, the scale factor c, and the new degrees of freedom from Brown's Method

    '''
    m = int(covar_matrix.shape[0])
    #print "m", m
    df_fisher = 2.0 * m
    Expected = 2.0 * m
    cov_sum = 0
    for i in range(m):
        for j in range(i + 1, m):
            cov_sum += covar_matrix[i, j]

    #print "cov sum", cov_sum
    Var = 4.0 * m + 2 * cov_sum
    c = Var / (2.0 * Expected)
    df_brown = 2.0 * Expected**2 / Var
    if df_brown > df_fisher:
        df_brown = df_fisher
        c = 1.0

    x = 2.0 * sum([-np.log(p) for p in p_values])
    #print "x", x
    p_brown = chi2_cdf(df_brown, 1.0 * x / c)
    p_fisher = chi2_cdf(df_fisher, 1.0 * x)

    if extra_info:
        return p_brown, p_fisher, c, df_brown
    else:
        return p_brown
Exemplo n.º 3
0
def CombinePValues(covar_matrix, p_values, extra_info=False):
    m = int(covar_matrix.shape[0])
    df_fisher = 2.0 * m
    Expected = 2.0 * m
    cov_sum = 0
    for i in range(m):
        for j in range(i + 1, m):
            cov_sum += covar_matrix[i, j]
    print("covar_sum", cov_sum)
    Var = 4.0 * m + 2 * cov_sum
    c = Var / (2.0 * Expected)
    df_brown = 2.0 * Expected**2 / Var
    if df_brown > df_fisher:
        df_brown = df_fisher
        c = 1.0
    print("c", c)
    x = 2.0 * sum([-np.log(p) for p in p_values])
    print("x", x)
    p_brown = chi2_cdf(df_brown, 1.0 * x / c)
    p_fisher = chi2_cdf(df_fisher, 1.0 * x)

    if extra_info:
        return p_brown, p_fisher, c, df_brown
    else:
        return p_brown
Exemplo n.º 4
0
def self_contained(pvals, pmat=None, weights=None):
    '''
    Parameters:
        pvals: a list of p-values to be combined
        pmat: a list of lists of p-values randomly obtained from the data
        weights: a list of weights for p-values in pvals
    '''
    pvals = np.array(pvals, dtype=np.float64)
    if np.isnan(pvals).any():
        raise Error('List pvals contains None value!')
    if pvals.min() < 0:
        raise Error('List pvals contains negative value!')
    if pvals.max() > 1:
        raise Error('List pvals contains > 1 value!')
    pvals = __handle(pvals)

    if pmat is not None:
        pmat = np.matrix(pmat, dtype=np.float64)
        if len(pvals) != len(pmat):
            raise Error('Dimensions of p-values and p-matrix don\'t match!')
        if np.isnan(pmat).any():
            raise Error('List pmat contains None value!')
        if pmat.min() < 0:
            raise Error('List pmat contains negative value!')
        if pmat.max() > 1:
            raise Error('List pmat contains > 1 value!')
        pmat = __handle(pmat)

    if weights is None:
        weights = np.repeat(2, pvals.size)
    else:
        if pvals.size != len(weights):
            raise Error('Dimensions of p-values and weights don\'t match!')
        weights = np.array(weights, dtype=np.float64)
        if np.isnan(weights).any():
            raise Error('List pvals contains None value!')
        if weights.min() < 0:
            raise Error('List weights contains negative value!')

    # e: E(T)
    e = weights.sum()

    # var: Var(T)
    if pmat is None:
        var = 2 * weights.sum()
    else:
        var = np.cov(
                np.apply_along_axis(
                    lambda q: chi2.ppf(1 - q, weights),
                    0,
                    pmat)).sum()

    # v: new degrees of freedom based on Satterthwaite's approximation
    v = 2 * (e**2 / var)
    # T: Lancaster test statistic
    T = chi2.ppf(1 - pvals, weights).sum()
    c = var / 2 / e
    pval = chi2_cdf(v, T / c)

    if pmat is None:
        cor = np.diag(np.repeat(1, pvals.size))
    else:
        cor = np.corrcoef(pmat)

    return {
        'pval': pval,
        'cor': cor
    }