gpt4 book ai didi

python - 如何矢量化 Fisher 精确检验?

转载 作者:行者123 更新时间:2023-12-04 21:10:51 29 4
gpt4 key购买 nike

是否可以使用 Fisher 精确检验的矢量化来优化此计算,如果可以,如何优化?当 num_cases 运行时很麻烦> ~1000000。

import numpy as np
from scipy.stats import fisher_exact

num_cases = 100
randCounts = np.random.random_integers(100,size=(num_cases,4))

def testFisher(randCounts):
return [fisher_exact([[r[0],r[1]],[r[2], r[3]]])[0] for r in randCounts]

In [6]: %timeit testFisher(randCounts)
1 loops, best of 3: 524 ms per loop

最佳答案

这是一个使用 Fisher 的答案,正如在 fisher 中实现的那样.我在 numpy 中手动计算 OR。

安装:

# pip install fisher
# or
# conda install -c bioconda fisher

设置:
import numpy as np
np.random.seed(0)
num_cases = 100
c = np.random.randint(100,size=(num_cases,4), dtype=np.uint)

# head, i.e.
c[:5]
# array([[44, 47, 64, 67],
# [67, 9, 83, 21],
# [36, 87, 70, 88],
# [88, 12, 58, 65],
# [39, 87, 46, 88]], dtype=uint64)

执行:
from fisher import pvalue_npy
_, _, twosided = pvalue_npy(c[:, 0], c[:, 1], c[:, 2], c[:, 3])
odds = (c[:, 0] * c[:, 3]) / (c[:, 1] * c[:, 2])

print("result fast p and odds", odds[0], twosided[0])
# result fast p and odds 0.9800531914893617 1.0
print("result slow", fisher_exact([[c[0][0], c[0][1]], [c[0][2], c[0][3]]]))
# result slow (0.9800531914893617, 1.0)

请注意,一百万行只需要两秒钟:)

此外,要计算近似 OR,您可能需要在找到比值比之前向表中添加一个伪计数。这通常比 inf 更有趣,因为您可以比较近似值 :) :
c2 = c + 1
odds = (c2[:, 0] * c2[:, 3]) / (c2[:, 1] * c2[:, 2])

编辑:

从 0.0.61>= 此方法包含在 pyranges 中如 pr.stats.fisher_exact .

关于python - 如何矢量化 Fisher 精确检验?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34947578/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com