T-тест в Python для сравнения нескольких групп - PullRequest
1 голос
/ 17 февраля 2020

Я хотел бы провести простой t-тест в python, но я бы хотел сравнить все возможные группы друг с другом. Допустим, у меня есть следующие данные:

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)

И я хочу вычислить значение p на основе t-критерия для всех возможных комбинаций категорий, а именно:

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 | р-значение, в этом случае оно должно выглядеть так:

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

1 Ответ

0 голосов
/ 17 февраля 2020

Рассмотрим итерацию по 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)
...