使用scipy组合p值

问题描述 投票:1回答:2

我必须组合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值?怎么可能?

谢谢,伯卡克

python scipy p-value
2个回答
1
投票

我绝不是该领域的专家,但是对您的问题很感兴趣。在阅读了wiki之后,在我看来combined_p_value告诉您在相同的原假设下获得列表中所有p值的可能性。考虑到两个极小的值,这几乎是不可能的。您的集合有两个非常小的值:1st和3rd。如果我描述的思维过程是正确的,那么删除其中的任何一个都会产生更高的p-value,实际上是这样的情况:移除1:0.00010569305282803985的p值移除第3个:2.4713196031837724e-05的p值总之,我认为这是解释combine_pvalues实际描述的荟萃分析的正确方法。


1
投票

是正确的,因为您正在测试所有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,这确实很大,并且在上面的模拟卡方附近没有位置。

要注意的一件事是,您在此处进行的合并未考虑方向性,如果在测试中可能做到这一点,则您可能要考虑将stouffer的Z与权重一起使用。另一种检查的理智方法是运行如上所述的模拟,以在原假设下生成p值列表,并查看它们与您观察到的有何不同。

Interesting paper but maybe a bit on the statistics side

© www.soinside.com 2019 - 2024. All rights reserved.