Как рассчитать точный тест Фишера, используя несколько столбцов? - PullRequest
0 голосов
/ 27 марта 2019

Мне очень известна эта ссылка: Есть ли в Pandas питонный способ составить таблицу непредвиденных обстоятельств? Там, где два столбца преобразуются в непредвиденный случай 2x2, а затем точный тест Фишера можно легко выполнить. С чем я борюсь, так это как я могу взять вышеупомянутое решение и применить его к нескольким столбцам. Мои данные выглядят так:

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

и я хотел бы получить вывод, подобный следующему (обратите внимание, что приведенные ниже значения являются поддельными, а donot представляют вышеуказанные данные):

    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 против B, A против C, A против D ... и т. Д. ... и т. Д. И поместите p-значения в выходной формат.

Любое руководство высоко ценится!

1 Ответ

0 голосов
/ 28 марта 2019

Ниже приведен код, который выполняет работу.

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)
...