我正在寻找一种更快的方法来对大型数据集进行优势比测试。我有大约1200个变量(参见var_col)我想互相测试以互相排斥/共现。优势比测试定义为(a * d)/(b * c)),其中a,b c,d是样品的数量,其中(a)在x和β中都没有改变。 y(b)在x位置改变,而y(c)在y中改变,而在x(d)中改变。我还想计算渔民精确检验以确定统计学意义。 scipy函数fisher_exact可以计算这两个函数(见下文)。
#here's a sample of my original dataframe
sample_id_no var_col
0 258.0
1 -24.0
2 -150.0
3 149.0
4 108.0
5 -126.0
6 -83.0
7 2.0
8 -177.0
9 -171.0
10 -7.0
11 -377.0
12 -272.0
13 66.0
14 -13.0
15 -7.0
16 0.0
17 189.0
18 7.0
13 -21.0
19 80.0
20 -14.0
21 -76.0
3 83.0
22 -182.0
import pandas as pd
import numpy as np
from scipy.stats import fisher_exact
import itertools
#create a dataframe with each possible pair of variable
var_pairs = pd.DataFrame(list(itertools.combinations(df.var_col.unique(),2) )).rename(columns = {0:'alpha_site', 1: 'beta_site'})
#create a cross-tab with samples and vars
sample_table = pd.crosstab(df.sample_id_no, df.var_col)
odds_ratio_results = var_pairs.apply(getOddsRatio, axis=1, args = (sample_table,))
#where the function getOddsRatio is defined as:
def getOddsRatio(pairs, sample_table):
alpha_site, beta_site = pairs
oddsratio, pvalue = fisher_exact(pd.crosstab(sample_table[alpha_site] > 0, sample_table[beta_site] > 0))
return ([oddsratio, pvalue])
此代码运行速度非常慢,尤其是在大型数据集上使用时。在我的实际数据集中,我有大约700k变量对。由于getOddsRatio()函数单独应用于每一对,因此它肯定是缓慢的主要来源。有更有效的解决方案吗?