在Python中计算调整后的p值
我最近花了一些时间在找一种方法来在Python中获取调整后的p值(也就是修正后的p值、q值、FDR),但一直没找到合适的。虽然有R语言的一个函数叫做p.adjust
,但我希望能在Python中实现,如果可以的话。Python里有没有类似的东西呢?
如果这个问题有点“糟糕”,那我提前说声抱歉!我确实先搜索过答案,但没有找到(除了一个Matlab的版本)……任何帮助都非常感谢!
5 个回答
0
你在问题中提到了q值,但没有人给出相关的链接。我认为这个包(根据文档来看,至少是这样)可以在Python中计算q值。
https://puolival.github.io/multipy/
还有这个链接也可以。
4
你可以试试一个叫 rpy2
的模块,它可以让你在Python中使用R语言的函数(顺便提一下,简单搜索一下就能找到 如何在Python中实现R的p.adjust)。
另一个选择是看看相关的数学原理,然后自己动手实现,因为其实这还是比较简单的。
听说在 statsmodels
中正在进行相关的实现:http://statsmodels.sourceforge.net/ipdirective/_modules/scikits/statsmodels/sandbox/stats/multicomp.html。也许它已经可以用了。
5
我们在SciPy中也添加了FDR功能(将在下一个版本SciPy 1.11中发布)。
https://scipy.github.io/devdocs/reference/generated/scipy.stats.false_discovery_control.html
from scipy import stats
ps = [0.0001, 0.0004, 0.0019, 0.0095, 0.0201, 0.0278, 0.0298, 0.0344,
0.0459, 0.3240, 0.4262, 0.5719, 0.6528, 0.7590, 1.000]
stats.false_discovery_control(ps)
# array([0.0015 , 0.003 , 0.0095 , 0.035625 , 0.0603 ,
# 0.06385714, 0.06385714, 0.0645 , 0.0765 , 0.486 ,
# 0.58118182, 0.714875 , 0.75323077, 0.81321429, 1. ])
9
根据生物统计手册,BH方法的计算很简单。
def fdr(p_vals):
from scipy.stats import rankdata
ranked_p_values = rankdata(p_vals)
fdr = p_vals * len(p_vals) / ranked_p_values
fdr[fdr > 1] = 1
return fdr
24