多个 t 检验的 p 值校正?

机器算法验证 t检验 p 值 多重比较 邦费罗尼 调整
2022-03-17 11:01:48

我的数据集由基因组成,每个基因由一个表达值向量描述,用于“健康”个体,用于“不健康”个体。n55

我将运行 t 检验(每个基因一个)来确定哪些基因在健康人群和不健康人群之间表现出不同的行为。n

p 值进行校正(例如 Bonferroni、Holm、Benjamini 和 Hochberg...) ?n

编辑:

我想知道我的案例是否是多重比较问题。

实际上,我不比较基因,而只比较每个基因的两个不同群体(健康与不健康)的值。因此,我没有看到多重比较。

换句话说,我有兴趣找到那些在健康样本和不健康样本之间表现不同的基因。我对发现两个基因的行为是否相同不感兴趣。

显然,运行 t 检验后,我得到的 p 值低于比计算校正后要多得多。n0.05

2个回答

您绝对确实想要进行更正。关键思想是通过机会识别重要性。随着您增加比较的数量,您会增加那些偶然重要的比较的数量。

例如,让我们以使用 0.05 的显着性阈值进行 100 次比较的通用示例为例。现在,0.05 的 p 值意味着当原假设为真时,有 5% 的机会获得该结果。因此,如果您进行这 100 次比较,您会期望随机发现 5 个显着基因。

因此,为了避免产生这些误报(类型 1 错误),我们“纠正”了 p 值,从而使测试更加保守。

校正的选择也可能有所不同。Bonferroni 是一种常见的校正方法,但如果您有 1000 多个基因,那么您将极不可能发现任何重要的东西,因为它会非常保守。在这种情况下,您可以使用“FDR”(错误发现率)校正。没有绝对的答案,因此您需要探索可能性并做出最佳选择,当然还要报告您应用了哪些更正。

编辑

关于你下面的评论,我认为一个例子可以帮助展示这个概念。

使用 R,我通过两种处理(A 和 B)为 250 个基因生成完全随机的值

set.seed(8)
df <- data.frame(expression=runif(1000), 
                 gene=rep(paste("gene", seq(250)), 4), 
                 treatment = rep(c("A","A","B","B"), each=250))

然后,我按每个基因拆分数据,并在两组之间进行 t.test 比较。

out <- do.call("rbind", 
    lapply(split(df, df$gene), function(x) t.test(expression~treatment, x)$p.value))

现在,鉴于这是完全随机的数据,不应该有任何显着差异,但是当我计算有多少有9 个显着基因时!!!

length(which(out < 0.05))
[1] 9

避免此类错误是进行这些更正的重点。希望这有助于为您澄清。

你说没有进行比较,因为基因没有相互比较。但是,每个 t 检验仍然是一个比较。事实上,这就是 t 检验——两种均值的比较。在您的情况下,每次比较都是在健康组和不健康组之间,而不是在基因 A 和基因 B 之间,但它仍然是一个比较。

这种混淆可以通过用同义词“多重测试”代替“多重比较”来避免。