Два выборочных t-теста для каждой отдельной строки в Python

Я пытаюсь выполнить t-тест с двумя выборками, чтобы проверить, есть ли значительная разница в среднем между двумя наборами данных.

У меня есть два набора данных, и каждый набор данных имеет 5 испытаний, и каждое испытание имеет 3 функции. Каждая пробная версия имеет свою уникальную метку, но 3 функции (X1, X2, X3 одинаковы для всех). В каждом отдельном испытании мы измеряем 3 функции, и значения измерений отображаются ниже. Я пытаюсь рассчитать среднюю разницу для каждой функции в обоих наборах данных.

Вот как выглядят мои данные, когда я получаю их из SQL.

Набор данных 1:

T1  X1   0.93
T1  X2   0.3
T1  X3   -2.9
T2  X1   1.3
T2  X2   0.8
T2  X3   1.9
T3  X1   2.3
T3  X2   -1.8
T3  X3   0.9
T4  X1   0.3
T4  X2   0.8
T4  X3   0.9
T5  X1   0.3
T5  X2   0.8
T5  X3   0.9

Набор данных 2:

T10 X1  1.3
T10 X2  -2.8
T10 X3  0.09
T11 X1  3.3
T11 X2  0.8
T11 X3  1.9
T12 X1  0.3
T12 X2  -4.8
T12 X3  2.9
T13 X1  1.3
T13 X2  2.8
T13 X3  0.19
T14 X1  2.3
T14 X2  0.08
T14 X3  -0.9

Вот как я хочу, чтобы мой вывод выглядел, где я хочу, чтобы ttest применялся к каждой функции, чтобы я мог получить значение p для каждой функции.

Feature  Mean-DataSET1  Mean-DataSET2  P-value 
X1
X2
X3  

когда я делаю stats.ttest_ind(set1['value'], set2['value']).pvalue , я получаю одно единственное pvalue

Спасибо!


person anaz8    schedule 19.05.2020    source источник
comment
Не могли бы вы рассказать мне, как выглядят set1 или set2 и какова их форма? Выглядят ли они точно так же, как данные в форме массива?   -  person amzon-ex    schedule 19.05.2020


Ответы (2)


Я записал ваш вывод выше в два файла с разделителями табуляции, и я прочитал его ниже и добавил столбец, чтобы указать фрейм данных или таблицу, из которой он взят:

import pandas as pd
from scipy.stats import ttest_ind
t1 = pd.read_csv("../t1.csv",names=['V1','V2','V3'],sep="\t")
t1['data'] = 'data1'
t2 = pd.read_csv("../t2.csv",names=['V1','V2','V3'],sep="\t")
t2['data'] = 'data2'

    V1  V2  V3  data
0   T1  X1  0.93    data1
1   T1  X2  0.30    data1
2   T1  X3  -2.90   data1
3   T2  X1  1.30    data1

Затем мы объединяем их и вычисляем среднее значение:

df = pd.concat([t1,t2])
res = df.groupby("V2").apply(lambda x:x['V3'].groupby(x['data']).mean())
data    data1   data2
V2      
X1  1.026   1.700
X2  0.180   -0.784
X3  0.340   0.836

p.value требует немного больше кода в приложении:

res['pvalue'] = df.groupby("V2").apply(lambda x:
                                       ttest_ind(x[x['data']=="data1"]["V3"],x[x['data']=="data2"]["V3"])[1])
data    data1   data2   pvalue
V2          
X1  1.026   1.700   0.316575
X2  0.180   -0.784  0.521615
X3  0.340   0.836   0.657752

Вы всегда можете сделать res.reset_index(), чтобы получить столик..

person StupidWolf    schedule 19.05.2020

Если я правильно понимаю ваш вопрос, вы можете получить среднее значение для каждой функции с помощью Groupby, а затем получить p-значение для каждой функции в одном наборе данных. поэтому сначала я бы создал набор данных,

a = {'Feature': ['X1','X2','X3','X4','X5']}
Results = pd.DataFrame(data = a)
Results.set_index('Feature')

Затем, чтобы получить среднее значение ваших функций, вы можете использовать группу и отправить результат в этот новый набор данных,

Results['Mean-DataSET1'] = df1.groupby('feature')['value'].transform('mean')
Results['Mean-DataSET2'] = df2.groupby('feature')['value'].transform('mean')

Теперь, насколько я знаю, p-тесты возвращают значение всего столбца, поэтому я бы получил оба столбца значений в одном месте, а затем разделил свои данные на временные наборы данных и получил их p-значение,

df['value2'] = df2['value']

xone = df[(df['col2'] == 'X1')]
xtwo = df[(df['col2'] == 'X2')] 
xthree = df[(df['col2'] == 'X3')] 
xfour = df[(df['col2'] == 'X4')] 
xfive = df[(df['col2'] == 'X5')] 

Таким образом, вы можете выполнить ту же функцию, что и раньше, и получить все значения следующим образом:

p_vals = ttest_ind(xone['value'], xone['value2']).pvalue, ttest_ind(xtwo['value'], xtwo['value2']).pvalue, ttest_ind(xthree['value'], xthree['value2']).pvalue, ttest_ind(xfour['value'], xfour['value2']).pvalue, ttest_ind(xfive['value'], xfive['value2']).pvalue

Results['P_value'] = p_vals

Таким образом, пример вывода для подмножества ваших данных будет выглядеть так:

    Feature mean1   mean2   P_value
    X1  1.510000    1.633333    0.905175
    X2  -0.233333   -2.266667   0.326891
    X3  -0.033333   1.630000    0.377542

Это не самый изящный ответ, но сейчас все должно быть в порядке, поскольку у вас есть только небольшие наборы данных!

person Aongoose    schedule 19.05.2020