How to implement R's p.adjust in Python
If you wish to be sure of what you are getting from R, you can also indicate that you wish to use the function in the R package 'stats':
from rpy2.robjects.packages import importrfrom rpy2.robjects.vectors import FloatVectorstats = importr('stats')p_adjust = stats.p_adjust(FloatVector(pvalue_list), method = 'BH')
This question is a bit old, but there are multiple comparison corrections available in statsmodels for Python. We have
Here is an in-house function I use:
def correct_pvalues_for_multiple_testing(pvalues, correction_type = "Benjamini-Hochberg"): """ consistent with R - print correct_pvalues_for_multiple_testing([0.0, 0.01, 0.029, 0.03, 0.031, 0.05, 0.069, 0.07, 0.071, 0.09, 0.1]) """ from numpy import array, empty pvalues = array(pvalues) n = float(pvalues.shape[0]) new_pvalues = empty(n) if correction_type == "Bonferroni": new_pvalues = n * pvalues elif correction_type == "Bonferroni-Holm": values = [ (pvalue, i) for i, pvalue in enumerate(pvalues) ] values.sort() for rank, vals in enumerate(values): pvalue, i = vals new_pvalues[i] = (n-rank) * pvalue elif correction_type == "Benjamini-Hochberg": values = [ (pvalue, i) for i, pvalue in enumerate(pvalues) ] values.sort() values.reverse() new_values = [] for i, vals in enumerate(values): rank = n - i pvalue, index = vals new_values.append((n/rank) * pvalue) for i in xrange(0, int(n)-1): if new_values[i] < new_values[i+1]: new_values[i+1] = new_values[i] for i, vals in enumerate(values): pvalue, index = vals new_pvalues[index] = new_values[i] return new_pvalues