为什么要对p值进行矫正?

发布于:2024/12/18 作者:沈大力 浏览量:456 评论:0

标签: 生物信息 R语言 统计



1. 假设检验的基础:Type I 错误

在统计学中,假设检验的核心是对一个原假设(\(H_0\)​)进行验证。假设检验中可能出现以下两种错误:

  • Type I 错误(假阳性): 原假设 \(H_0\)​ 为真,但我们错误地拒绝它。
    • 假阳性率通常用显著性水平\(α\)表示(比如 0.05)。
  • Type II 错误(假阴性): 原假设 \(H_0\)为假,但我们未能拒绝它。

 

基础知识回顾:我们平时所说的p值就是与这里的α进行比较。p值公式可以简单理解为p-value = P(观察到的结果或更极端的结果|H0成立) ,即原假设成立的情况下观察到的结果成立的概率。我这里用基因表达比较来举个例子,针对geneA,我们的原假设H0是geneA在疾病组和对照组之间不存在差异,备择假设H1是存在差异,观察的结果就是指我们实际在抽样中算出来的两组之间的geneA的统计量,或者可以简单理解为数据差异(比如最简单的均值差异)。那么这个概率就是指,geneA在两组之间没有差异的情况下,我们实际看到的当前差异或者更极端的差异的概率。如果这个概率大于某个标准,也就是这里所说的α,我们认为数据符合H0假设,那么我们就同意它,反之则拒绝它。到这里可能有些没怎么接触过统计的人还会问一个问题:我们一般思考问题是,不应该是想尽办法来证明某个观点是对的吗(也就是H0是对的)?为何在统计检验中都是通过这种拒绝原假设的“反证法”来检验?这里有一句话我想分享一下:正向的个案不足以证明观点的正确性,但反向的却可以直接否定该观点。

 

单次检验

  • 当我们只进行一次假设检验时,控制\(α\)即控制了假阳性率(Type I 错误率)。
  • 如果设置 \(α = 0.05\) ,意味着有 5% 的概率拒绝一个实际上为真的 \(H_0\)

那么,多次检验呢?

 

2. 多次独立检验时发生了什么?

当我们同时进行多次检验(即多重比较,例如比较A组和B组中10,000个基因的表达水平,是10,000次独立检验)时,每次检验都可能发生 Type I 错误。这些错误的概率会累积,导致总体假阳性率大幅提高。

假阳性累积的数学推导

假设我们进行 \(m\) 次独立检验,每次的假阳性率是 \(α\),那么:

  • 首先,每次检验不发生假阳性的概率为:

\(1 - α\)

  • 接着我们可以得出\(m\)次检验都不发生假阳性的概率为:

\((1 - α)^m\)

  • 至少一次假阳性发生的累积概率为:

\(P (至少一次假阳性) = 1 - (1 - α)^m\)

一个简单的例子,如果我们进行10次检验(或者比较两组之间10个基因的表达),这里的\(α\)我们就设置为常用的0.05:

\(P (至少一次假阳性) = 1 - (1 - 0.05)^{10} ≈ 0.40\)

也就是说,尽管每次检验的假阳性率是 5%,在10次检验中,至少出现一次假阳性的概率升到了 40%。如果检验次数增加到100次,累积假阳性概率会进一步上升:

\(P (至少一次假阳性) = 1 - (1 - 0.05)^{100} ≈ 0.994\)

这时候至少出现一次假阳性的概率高达99.4%,几乎可以说是必然出现假阳性了。所以这也是做p-value矫正的主要动机。

 

3. 如何解决多重比较问题?

为了控制总体的假阳性率,我们需要调整单次检验的p值或显著性水平。这就是p值矫正的目的。以下是常用的两个方法:

方法一:Bonferroni校正

核心思想: 降低每次检验的显著性水平,使得总体假阳性率仍然保持在设定的 \(α\)

公式:\(p_{cut-off} = {α \over m}\),这里的\(m\)是指检验次数(差异基因分析中就是基因个数)。

\(p_{cut-off} \)是指指调整后的显著性水平(校正后的阈值),它定义了多次检验中单个检验需要达到的显著性标准,以便控制总体假阳性率。

举个例子,我们原来设置的阈值是0.05,现在在我们的数据中有100个基因,那么矫正过的阈值\(p_{cut-off} \)就是\({0.05 \over 100} = 0.0005\)。换句话说这时候我们的p值就不是<0.05显著,而是<0.0005才算显著。那么我们通过计算得出的adjusted p-value是怎么得出来的呢?其实很简单,就是\(p-value_{original} * m\)。例如,geneA算出来的原始p值为0.001,那么这里\(0.001 * 100 = 0.1\),也就是经过矫正后实际上geneA的表达在两组之间并没有显著差异。

然而Bonferroni方法也并不是十全十美,我们从上面的讲解中可以看出,经过校正后的p值阈值会变得非常低,换句话说接受原假设的要求会变得很严格,这种情况下虽然我们降低了Type I错误,但Type II错误的概率却提高了。因此,当当检验次数非常多(如 10,000+)时通常不建议用该矫正方法。

 

方法二:假发现率(FDR,False Discovery Rate)

核心思想: FDR 的目标是控制显著结果中的假阳性比例,而不是控制整体假阳性率(像 Bonferroni 那样严格)。

公式:\(FDR = {假阳性结果数 \over 所有显著结果数}\)

方法:对所有p值排序,之后可通过Benjamini-Hochberg (BH) 方法计算每个p值对应的FDR值。

Benjamini-Hochberg 是最常用的 FDR 控制方法,其步骤如下:

  • 输入:
    • 假设有\(m\)个独立检验,分别对应的p值为\(p_1, p_2, p_3, ..., p_m\)
    • 我们的目标是控制FDR要小于指定的阈值\(α\)(例如0.05)。
  • 计算步骤:
    • 排序p值:按照升序对原始p值进行排列。排完序后,每个p值对应一个ranking值\(i\)
    • 计算FDR值:对每个p值\(p_{(i)}\),计算对应的FDR阈值\(q_{(i)}\)\(q_{(i)} = {i \over m} * α\)
    • 比较p值与FDR值:找到最大的\(k\),使得\(p_{(k)} ≤ q_{(k)}\)
    • 输出:最后输出所有符合\(p_{(i)} ≤ q_{(i)}\)的结果。

以上理论可能有点抽象,我们举个具体例子来更好的理解。假设我们需要比较 10 个基因在疾病组和对照组之间的表达差异,得到以下 p 值(已排序):

排序位置 (\(i\)) p 值 (\(p_{(i)}\)​) FDR 阈值 (\(q_{(i)} = {i \over m} * α\), \(α = 0.05\))
1 0.001 0.005
2 0.003 0.01
3 0.008 0.015
4 0.02 0.02
5 0.03 0.025
6 0.04 0.03
7 0.06 0.035
8 0.08 0.04
9 0.1 0.045
10 0.15 0.05

根据以上的排序表,我们要确定一个\(k\),也就是某个\(i\),使得刚好\(p_{(k)} ≤ q_{(k)}\)。我们一个一个来看:

\(p_{(1)} =0.001 ≤ q_{(1)} = 0.005\),那么可以认为这个确实是显著的。

\(p_{(2)} =0.003 ≤ q_{(2)} = 0.01\),同上。

 \(p_{(3)} =0.008≤ q_{(3)} = 0.015\),同上。

 \(p_{(4)} =0.02≤ q_{(4)} = 0.02\),同上。

 \(p_{(5)} =0.03 ≥ q_{(5)} = 0.025\),这时候我们发现p值大于q值了,那么这里的\(k\)就是4,也就是说判定前 4 个基因是确实的显著。

最后,我们依然用原始的p值来表示这4个基因的显著性(为什么?q-value或者FDR主要用于判定显著性,而p值是实际报告原始数据的差异程度,这两者是不同的概念)。

 

 

-END-


发布评论:

登录后方可评论,点击登录注册


评论列表:

暂无评论。


苏公网安备 32050602011302号
苏ICP备2020062135号-1
Copyright© Li Shen. All rights reserved.