如果我有两个列表 A 和 B,它们都是更大的列表 C 的子集,我如何确定 A 和 B 的重叠程度是否大于我的偶然预期?
我是否应该从 C 中随机选择与列表 A 和 B 长度相同的元素并确定随机重叠,并多次执行以确定某种或经验 p 值?有没有更好的方法来测试这个?
如果我有两个列表 A 和 B,它们都是更大的列表 C 的子集,我如何确定 A 和 B 的重叠程度是否大于我的偶然预期?
我是否应该从 C 中随机选择与列表 A 和 B 长度相同的元素并确定随机重叠,并多次执行以确定某种或经验 p 值?有没有更好的方法来测试这个?
如果我正确理解您的问题,您需要使用Hypergeometric distribution。这种分布通常与骨灰盒模型相关联,即一个骨灰盒中有球,涂成红色,然后从骨灰盒中抽取个球。然后,如果是您的样本中红色具有超几何分布。
对于您的具体示例,让、和表示三个列表的长度,让和之间的重叠。然后
要计算 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
警告。请记住多次测试,即如果您有很多A和B列表,那么您将需要通过校正来调整您的 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)