numpy Python Pandas Fisher Exact Test 2x2

khbbv19g  于 2023-08-05  发布在  Python
关注(0)|答案(2)|浏览(84)

我有一个包含四列的pandars数据框:

import pandas as pd
import numpy as np

arr = {
       "A" :[75.3,85.2,90.1,80.4,70.9],
       "B" :[80.6,90.2,85.7,70.8,95.1],
       "C" :[85.2,95.6,80.8,90.4,75.1],
       "D" :[90.3,85.5,80.0,70.5,95.2]
              }

df = pd.DataFrame(arr)

字符串
我想对每一行运行2x2 fisher精确检验,并将p值保存到新列中。换句话说,我想对下面的数组运行2x2 fisher精确测试
第一个月
对于0和5之间的所有i,并将该列表保存为 Dataframe 中的另一列。
在“scipy.stats”中有一个名为“fisher_exact()”的函数,它将输出2x2数组的奇数值和p值。我有下面的代码,现在它的工作:

import scipy.stats as stats
pvalue = []

for i in df.index.values:
    a = df["A"][i]
    b = df["B"][i]
    c = df["C"][i]
    d = df["D"][i]
    
    data = [[a,b],[c,d]]
    
    odd_value, p_value = stats.fisher_exact(data)
    pvalue.append(p_value)
    
df["p_value"] = np.array(pvalue)


但是,对于较大的阵列,这需要一段时间。有没有一种方法可以使用numpy向量操作来运行这个测试?这里有没有比scipy.stats.fisher_exact()更好的函数?

huwehgph

huwehgph1#

from scipy.stats import fisher_exact
import numpy as np

np.array([fisher_exact(i)[1] for i in df.values.reshape(-1,2,2)])

array([1.        , 0.45814062, 0.82723738, 0.6484196 , 0.82550328])

字符串
你也可以运行:

np.apply_along_axis(lambda x:fisher_exact(x.reshape(-1,2)), 1, df.values) 
array([[0.99264706, 1.        ],
       [0.84502924, 0.45814062],
       [1.05882353, 0.82723738],
       [0.88888889, 0.6484196 ],
       [0.93333333, 0.82550328]])


其中第二列ie [:, 1]是p_values,第一列是奇比

lkaoscv7

lkaoscv72#

您可以使用的另一个选项是fast-fisher库。
当运行fast_fisher_exact_compatibility而不是fisher_exact时,我们可以得到以下结果:

import pandas as pd
import numpy as np
from fast_fisher import fast_fisher_exact_compatibility

>>> arr = {
>>>        "A" :[75.3,85.2,90.1,80.4,70.9],
>>>        "B" :[80.6,90.2,85.7,70.8,95.1],
>>>        "C" :[85.2,95.6,80.8,90.4,75.1],
>>>        "D" :[90.3,85.5,80.0,70.5,95.2]
>>>               }

>>> df = pd.DataFrame(arr)

>>> for i in df.index.values:
>>>     a = df["A"][i]
>>>     b = df["B"][i]
>>>     c = df["C"][i]
>>>     d = df["D"][i]
    
>>>     data = [[a,b],[c,d]]
>>>     odds_f, pval_f = fast_fisher_exact_compatibility(data)

>>> pval_f
0.825503275434932

字符串
您可以以此为起点,看看在更大的阵列上运行时性能是否有所提高。

相关问题