如何计算两个列表之间的重叠程度是否显着?

机器算法验证 统计学意义
2022-03-23 13:10:49

如果我有两个列表 A 和 B,它们都是更大的列表 C 的子集,我如何确定 A 和 B 的重叠程度是否大于我的偶然预期?

我是否应该从 C 中随机选择与列表 A 和 B 长度相同的元素并确定随机重叠,并多次执行以确定某种或经验 p 值?有没有更好的方法来测试这个?

2个回答

如果我正确理解您的问题,您需要使用Hypergeometric distribution这种分布通常与骨灰盒模型相关联,即一个骨灰盒中有球,涂成红色,然后从骨灰盒中抽取个球。然后,如果是您的样本中红色具有超几何分布。nymXmX

对于您的具体示例,让表示三个列表的长度,让之间的重叠然后nAnBnCnABAB

nABHG(nA,nC,nB)

要计算 p 值,您可以使用以下 R 命令:

#Some example values
n_A = 100;n_B = 200; n_C = 500; n_A_B = 50
1-phyper(n_A_B, n_B, n_C-n_B, n_A)
[1] 0.008626697

警告。请记住多次测试,即如果您有很多AB列表,那么您将需要通过校正来调整您的 p 值。例如 FDR 或 Bonferroni 校正。

csgillespie 的答案似乎是正确的,除了一件事:它给出了在重叠中看到严格超过 n_A_B 的概率,P(x > n_A_B),但我认为 OP 想要 pvalue P(x >= n_A_B)。你可以得到后者

n_A = 100;n_B = 200; n_C = 500; n_A_B = 50
phyper(n_A_B - 1, n_A, n_C-n_A, n_B, lower.tail = FALSE)