为什么我使用 Fisher 方法获得的组合 p 值如此之低?

机器算法验证 p 值 matlab 组合 p 值
2022-03-24 19:10:28

我有多个人,我为他们收集了一些参数的两个时间序列。对于每个人,我计算了这些时间序列是否相关。所以,如果我有 20 个人,结果我有 20 个 rho 和 20 个 p 值。然后,我想将这些值分组为一组 p 值。首先,我尝试了 Fisher 的方法(维基百科MRC 维基)。

这是我使用的 MATLAB 代码示例,为了重现性,我也提供了我的输入值:

pvals = [0.265337997085488
0.00408191031608826
3.39739013503740e-05
0.254982443552454
0.165041294656449
0.416553830442594
0.854810976365062
0.555604221080550
0.256959004076953
0.371337447007835
0.705098835272764
0.122815481253417
0.562862850057724
0.781570743043581
0.248570986138274
0.448488806357779
0.179768419684463
0.560862182877956
0.169198118710575
0.681402534954493
0.723443480957150];
%// pvals is vector of (21,1) shape which holds individual p-values
chi_vals = -2.*log(pvals);
group_pval = 1 - chi2cdf(sum(chi_vals),2*length(pvals));
nsig = sum(pvals < 0.05)

我会觉得这已经足够了,但有些事情真的让我担心——我得到一个 0.0054 的组 p 值,而在我的个人 p 值中只有 2 个值是“显着”的p<0.05. 这没有意义,对吧?为什么我的组 p 值这么低?我是否在计算或假设方面犯了错误?

1个回答

您的 p 值看起来是正确的。

考虑如果原假设为真,则 p 值应该是一致的;当你有很多它们时,你实际上是在检查你的 p 值集合是否与均匀性一致,而不是它们比你对制服的预期要小(Fisher 的方法测量这种程度太小)一种特殊的方式)。

您的值偏低(例如,考虑 7 个值低于 0.25,但只有 2 个值高于 0.75)。Fisher 的方法可以发现您的 p 值往往太小。

如果 p 值来自制服,它们应该靠近该图中的红线(F 值是制服分数;本质上 ecdf 向下移动了12n(相当于该点前后 ecdf 的平均值)):

![在此处输入图像描述

我们可以看到大的 p 值往往太小(它们位于靠近图顶部的线的左侧)。因此,Fisher p 值非常小。