在Python中计算调整后的p值

33 投票
5 回答
45533 浏览
提问于 2025-04-18 16:24

我最近花了一些时间在找一种方法来在Python中获取调整后的p值(也就是修正后的p值、q值、FDR),但一直没找到合适的。虽然有R语言的一个函数叫做p.adjust,但我希望能在Python中实现,如果可以的话。Python里有没有类似的东西呢?

如果这个问题有点“糟糕”,那我提前说声抱歉!我确实先搜索过答案,但没有找到(除了一个Matlab的版本)……任何帮助都非常感谢!

5 个回答

0

你在问题中提到了q值,但没有人给出相关的链接。我认为这个包(根据文档来看,至少是这样)可以在Python中计算q值。

https://puolival.github.io/multipy/

还有这个链接也可以。

https://github.com/nfusi/qvalue

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

这个功能在statsmodels里可以找到。

点击这里查看相关内容

点击这里查看具体的函数说明

还有一些解释、例子和蒙特卡洛方法的内容,可以在这里找到

撰写回答