python - 使用 scipy 组合 p 值

标签 python scipy statistics p-value

我必须合并 p 值并得到一个 p 值。 我正在使用 scipy.stats.combine_pvalues 函数,但它给出的组合 p 值非常小,这正常吗?

例如:

>>> import scipy
>>> p_values_list=[8.017444955844044e-06, 0.1067379119652372, 5.306374345615846e-05, 0.7234201655194492, 0.13050605094545614, 0.0066989543716175, 0.9541246420333787]
>>> test_statistic, combined_p_value = scipy.stats.combine_pvalues(p_values_list, method='fisher',weights=None)
>>> combined_p_value
4.331727536209026e-08

如您所见,combined_p_value 小于 p_values_list 中任何给定的 p 值? 怎么可能?

提前致谢, bool 卡克

最佳答案

这是正确的,因为您正在测试所有 p 值都来自随机均匀分布。另一种假设是至少其中一个是正确的。在你的情况下这是很有可能的。

我们可以通过从随机均匀分布中抽取 1000 次 p 值的长度来模拟这一点:

import numpy as np
from scipy.stats import combine_pvalues
from matplotlib import pyplot as plt

random_p = np.random.uniform(0,1,(1000,len(p_values_list)))
res = np.array([combine_pvalues(i,method='fisher',weights=None) for i in random_p])
plt.hist(fisher_p)

enter image description here

根据您的结果,卡方为 62.456,这确实很大,与上面的模拟卡方相差甚远。

需要注意的一件事是,您在这里所做的组合没有考虑方向性,如果在您的测试中可能的话,您可能需要考虑使用斯托弗的 Z 和权重。另一种明智的检查方法是像上面一样运行模拟,生成原假设下的 p 值列表,并查看它们与您观察到的结果有何不同。

Interesting paper but maybe a bit on the statistics side

关于python - 使用 scipy 组合 p 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62077181/

相关文章:

python - 从numpy数组中选择指定的月份日期(日期时间对象)

python - 在嘈杂的二进制时间序列中找到连续信号

R - "CAPdiscrim"和 "lda"错误 "variable 1 appears to be constant within groups"

python - Python 中的一维 Wasserstein 距离

Python ProcessPoolExecutor 由于调用 unpickle image 而陷入死锁

python - 在 python setup.py 中,如何允许用户在不先进行构建的情况下安装我的模块文件?

python - 如何在python中找到拐点?

python - 如何拟合用 scipy.stats.rv_continuous 定义的分布?

python - 如何在 scipy.optimize 函数上强制执行更大的步骤?

machine-learning - 如何区分结构化数据和非结构化数据?