通过超几何分析对 p 值进行 Bonferroni 校正

Bonferroni correction of p-values from hypergeometric analysis

我进行了超几何分析(使用 python 脚本)来研究 GO-terms 在基因子集中的富集。我的输出示例如下:

GO00001 1500    300 200 150 5.39198144708e-77
GO00002 1500    500 400 350 1.18917839281e-160
GO00003 1500    400 350 320 9.48402847878e-209
GO00004 1500    100 100 75  3.82935778527e-82
GO00005 1500    100 80  80  2.67977253966e-114

哪里

Column1 = GO ID
Column2 = Total sum of all terms in the original dataset
Column3 = Total sum of [Column 1] IDs in the original dataset
Column4 = Sum of all terms in the subset
Column5 = Sum of [Column 1] IDs in subset
Column6 = pvalue derived from hypergeometric test

我知道我必须将实验次数乘以 pvalue,但我不确定如何使用我拥有的数据执行此操作。我是从子集计算还是从原始数据集和子集的组合计算?例如,它会是:

Column2 * Column5 * pvalue
Column3 * Column5 * pvalue
Column4 * Column5 * pvalue

如果这看起来像是一个愚蠢的问题,我深表歉意,但我似乎无法理解它。非常感谢!

from statsmodels.sandbox.stats.multicomp import multipletests
p_adjusted = multipletests(Column6, method='bonferroni')

还是我遗漏了什么?..

我们可以像下面这样自己实现多次测试的 Bonferroni 校正

np.random.seed(123)
alpha = 0.05 # level of significance / type-I error rate
m = 100      # number of tests
raw_pvals = np.random.beta(1, 10, m)  # some raw p-values, e.g., from hypergeometric analysis
significant = np.sum(raw_pvals < alpha)
significant
# 46

alpha_corrected = alpha / m
significant_bonferroni = np.sum(raw_pvals < alpha_corrected)
alpha_corrected
# 0.0005
significant_bonferroni
# 2

或者我们可以使用 statsmodels.stats 中的 multipletests:

from statsmodels.stats.multitest import multipletests
rejected, p_adjusted, _, alpha_corrected = multipletests(raw_pvals, alpha=alpha, 
                               method='bonferroni', is_sorted=False, returnsorted=False)
np.sum(rejected)
# 2
alpha_corrected 
# 0.0005

我们可以绘制原始 p 值与调整后 p 值的分布:

import seaborn as sns
sns.kdeplot(raw_pvals, color="red", shade=True, label='raw')
ax = sns.kdeplot(p_adjusted, color="green", shade=True, label='adujusted')
ax.set(xlim=(0, 1))
plt.title('distribution of p-values')
plt.legend()

请注意,正如预期的那样,Bonferroni 非常保守,因为它只允许拒绝几个零假设命题。