如何使用多列计算Fisher精确检验?

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

我非常清楚这个链接:Is there a pythonic way to do a contingency table in Pandas?将两列转换为2x2意外事件,然后可以轻松完成fischer精确测试。我正在努力的是如何采取上述解决方案并将其应用于多个列。我的数据如下:

Samples A   B   C   D   E   F   G   H   I   J   K   L   M   N   0   P
AA1 1   1   0   0   1   0   0   0   1   1   0   0   1   0   0   0
AA2 1   0   1   0   0   0   0   0   1   0   1   0   0   0   0   0
AA3 1   0   1   0   0   1   0   0   1   0   1   0   0   1   0   0
AA4 0   0   0   0   1   0   0   0   0   0   0   0   1   0   0   0
AA5 0   0   0   1   0   1   0   0   0   0   0   1   0   1   0   0
AA6 1   0   0   0   1   0   0   0   1   0   0   0   1   0   0   0
AA7 1   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0
AA8 1   0   0   0   1   1   0   0   1   0   0   0   1   1   0   0
AA9 0   0   0   0   1   0   0   1   0   0   0   0   1   0   0   1
AA10    1   1   1   0   1   0   0   1   1   1   1   0   1   0   0   1
AA11    1   0   1   1   0   1   0   1   1   0   1   1   0   1   0   1
AA12    1   0   1   0   0   0   1   1   1   0   1   0   0   0   1   1
AA13    0   0   0   0   1   0   1   1   0   0   0   0   1   0   1   1
AA14    1   1   0   0   0   1   1   1   1   1   0   0   0   1   1   1
AA15    1   0   0   1   0   0   1   1   1   0   0   1   0   0   1   1
AA16    0   0   0   0   1   0   1   1   0   0   0   0   1   0   1   1
AA17    1   0   0   0   0   0   1   1   1   0   0   0   0   0   1   1
AA18    1   1   1   0   0   0   0   1   1   1   1   0   0   0   0   1
AA19    1   0   0   1   1   1   0   1   1   0   0   1   1   1   0   1
AA20    0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   1
AA21    1   1   1   0   0   1   1   1   1   1   1   0   0   1   1   1
AA22    0   0   0   1   0   0   1   1   0   0   0   1   0   0   1   1
AA23    0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   1

我希望输出如下(注意下面的p值是假的,不代表上述数据):

    A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P
A                                                               
B   0.05                                                            
C   0.9 0.9                                                     
D   0.4 0.8 0.8                                                 
E   0.002   0.001   0.8 0.02                                                
F   0.12    0.67    0.001   0.8 0.6                                         
G   0.9 0.9 0.8 0.01    0.8 0.8                                     
H   0.1 0.22    0.8 0.8 0.8 0.33    0.01                                    
I   0.05    0.05    0.05    0.05    0.05    0.05    0.05    0.05                                
J   0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9                         
K   0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.8 0.9 0.9                     
L   0.02    0.02    0.02    0.02    0.02    0.02    0.02    0.02    0.8 0.02    0.02                    
M   0.12    0.12    0.12    0.12    0.12    0.12    0.12    0.67    0.001   0.8 0.6 0.8             
N   0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.8 0.01    0.8 0.8 0.8         
O   0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.22    0.8 0.8 0.8 0.33    0.01    0.01        
P   0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.22    0.8 0.8 0.8 0.33    0.01    0.01    0.01    

到目前为止的代码是:

import pandas as pd
from scipy.stats import fisher_exact
df = pd.read_table("......")
df.set_index("Samples", inplace=True)
print(df.head())
print(pd.crosstab(df.A, df.B))
tab = pd.crosstab(df.A, df.B)
print(fisher_exact(tab))

这给了我一个2x2和p-val,但我不知道如何遍历列。比如A vs B,A vs C,A vs D ......等等......并将p-vals放在输出格式中。

任何指导都非常感谢!

python pandas matrix p-value
1个回答
0
投票

以下是完成工作的代码。

import pandas as pd
import os
from scipy.stats import fisher_exact

dirpath="...."
df = pd.read_table(".....")
df.set_index("Sample ID", inplace=True)

my_df = pd.DataFrame(index=df.columns, columns=df.columns)
for colout in df.columns:
    for colinner in df.columns:
        if(colout==colinner):
            my_df.at[colout,colinner]=0
        else:
            tab = pd.crosstab(df[colout],df[colinner])
            fish_vals = fisher_exact(tab)
            my_df.at[colout,colinner]=fish_vals[1]
my_df.to_csv(os.path.join(dirpath,'myfile.txt'), sep='\t', encoding='utf-8',quoting=0, index=True)
print(my_df)
© www.soinside.com 2019 - 2024. All rights reserved.