Python中用于多组比较的T检验

g52tjvyc  于 2023-02-21  发布在  Python
关注(0)|答案(3)|浏览(149)

我想在python中进行一个简单的t检验,但是我想比较所有可能的组,假设我有以下数据:

import pandas as pd

data = {'Category': ['cat3','cat2','cat1','cat2','cat1','cat2','cat1','cat2','cat1','cat1','cat1','cat2','cat3','cat3'],
        'values': [4,1,2,3,1,2,3,1,2,3,5,1,6,3]}
my_data = pd.DataFrame(data)

我想基于t检验计算所有可能类别组合的p值,即:

cat1 vs. cat2
cat2 vs. cat3
cat1 vs. cat3

我可以通过以下方式手动执行此操作:

from scipy import stats

cat1 = my_data.loc[my_data['Category'] == 'cat1', 'values']
cat2 = my_data.loc[my_data['Category'] == 'cat2', 'values']
cat3 = my_data.loc[my_data['Category'] == 'cat3', 'values']

print(stats.ttest_ind(cat1,cat2).pvalue)
print(stats.ttest_ind(cat2,cat3).pvalue)
print(stats.ttest_ind(cat1,cat3).pvalue)

但是有没有一种更简单直接的方法可以做到这一点呢?类别的数量可能会因情况而异,因此需要计算的t检验的数量也会有所不同...
最终输出应该是一个DataFrame,其中每个比较对应一行,值为:类别1|类别2|p值,在这种情况下应如下所示:

cat1 | cat2 | 0.16970867501294376
cat2 | cat3 | 0.0170622126550303
cat1 | cat3 | 0.13951958313684434
kqqjbcuj

kqqjbcuj1#

考虑跨类别迭代itertools.combinations

from itertools import combinations
...

def ttest_run(c1, c2):
    results = stats.ttest_ind(cat1, cat2)
    df = pd.DataFrame({'categ1': c1,
                       'categ2': c2,
                       'tstat': results.statistic,
                       'pvalue': results.pvalue}, 
                       index = [0])    
    return df

df_list = [ttest_run(i, j) for i, j in combinations(mydata['Category'].unique().tolist(), 2)]

final_df = pd.concat(df_list, ignore_index = True)
qcuzuvrc

qcuzuvrc2#

必须使用statmodels中的多重比较(还有其他库)。

from scipy import stats
import statsmodels.stats.multicomp as mc

comp1 = mc.MultiComparison(dataframe[ValueColumn], dataframe[CategoricalColumn])
tbl, a1, a2 = comp1.allpairtest(stats.ttest_ind, method= "bonf")

您的p值将为:

a1[0] #pvalues
a1[2] #pvalues corrected by Bonferroni in this case
23c0lvtd

23c0lvtd3#

@juan,MultiComparison使用独立样本吗?不是真正的配对t检验,正如您在“stats.ttest_ind”而不是“stats.ttest_rel”中倒数第二行所指出的

相关问题