2015-04-06 2 views
0

Я ищу, чтобы выполнить T-тест на различные части данных в панда DataFrame.Выполнение T-теста на мультииндексе Pandas Dataframe

У меня есть dataframe организованы следующим образом: (. А, б и т.д.)

df = pd.DataFrame({'a': {('0hr', '0.01um', 0): 12, 
     ('0hr', '0.01um', 1): 10, 
     ('0hr', '0.1um', 0): 8, 
     ('0hr', '0.1um', 1): 6, 
     ('0hr', 'Control', 0): 4, 
     ('0hr', 'Control', 1): 2, 
     ('24hr', '0.01um', 0): 18, 
     ('24hr', '0.01um', 1): 15, 
     ('24hr', '0.1um', 0): 12, 
     ('24hr', '0.1um', 1): 9, 
     ('24hr', 'Control', 0): 6, 
     ('24hr', 'Control', 1): 3}, 
    'b': {('0hr', '0.01um', 0): 42, 
     ('0hr', '0.01um', 1): 35, 
     ('0hr', '0.1um', 0): 28, 
     ('0hr', '0.1um', 1): 21, 
     ('0hr', 'Control', 0): 14, 
     ('0hr', 'Control', 1): 7, 
     ('24hr', '0.01um', 0): 30, 
     ('24hr', '0.01um', 1): 25, 
     ('24hr', '0.1um', 0): 20, 
     ('24hr', '0.1um', 1): 15, 
     ('24hr', 'Control', 0): 10, 
     ('24hr', 'Control', 1): 5}}) 

печати (DF)

     a b 
    0hr 0.01um 0 12 42 
       1 10 35 
     0.1um 0 8 28 
       1 6 21 
     Control 0 4 14 
       1 2 7 
    24hr 0.01um 0 18 30 
       1 15 25 
     0.1um 0 12 20 
       1 9 15 
     Control 0 6 10 
       1 3 5 

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

Например:

[t, prob] = stats.ttest_ind(df.loc['0hr'].loc['Control'] , df.loc['0hr'].loc['Control'], 1, equal_var=True) 
[t, prob] = stats.ttest_ind(df.loc['0hr'].loc['Control'] , df.loc['0hr'].loc['0.01um'], 1, equal_var=True) 
[t, prob] = stats.ttest_ind(df.loc['0hr'].loc['Control'] , df.loc['0hr'].loc['0.1um'], 1, equal_var=True) 
[t, prob] = stats.ttest_ind(df.loc['24hr'].loc['Control'] , df.loc['24hr'].loc['Control'], 1, equal_var=True) 
[t, prob] = stats.ttest_ind(df.loc['24hr'].loc['Control'] , df.loc['24hr'].loc['0.01um'], 1, equal_var=True) 
[t, prob] = stats.ttest_ind(df.loc['24hr'].loc['Control'] , df.loc['24hr'].loc['0.1um'], 1, equal_var=True) 

Я пытался сделать это с df.apply, но я не уверен, что правильный синтаксис. Я хотел бы вернуть результаты в новый dataframe структурированного как:

results = pd.DataFrame({'a': {('0hr', '0.01um', 't'): '-', 
    ('0hr', '0.01um', 'prob'): '-', 
    ('0hr', '0.1um', 't'): '-', 
    ('0hr', '0.1um', 'prob'): '-', 
    ('0hr', 'Control', 't'): '-', 
    ('0hr', 'Control', 'prob'): '-', 
    ('24hr', '0.01um', 't'): '-', 
    ('24hr', '0.01um', 'prob'): '-', 
    ('24hr', '0.1um', 't'): '-', 
    ('24hr', '0.1um', 'prob'): '-', 
    ('24hr', 'Control', 't'): '-', 
    ('24hr', 'Control', 'prob'): '-'}, 
'b': {('0hr', '0.01um', 't'): '-', 
    ('0hr', '0.01um', 'prob'): '-', 
    ('0hr', '0.1um', 't'): '-', 
    ('0hr', '0.1um', 'prob'): '-', 
    ('0hr', 'Control', 't'): '-', 
    ('0hr', 'Control', 'prob'): '-', 
    ('24hr', '0.01um', 't'): '-', 
    ('24hr', '0.01um', 'prob'): '-', 
    ('24hr', '0.1um', 't'): '-', 
    ('24hr', '0.1um', 'prob'): '-', 
    ('24hr', 'Control', 't'): '-', 
    ('24hr', 'Control', 'prob'): '-'}}) 
+0

Считаете ли вы использование теста anova? Это точно t-тест для нескольких образцов (легко найти, например, в wikipedia). Я запустил его для набора данных, который вы предоставляете, и результат состоит в том, что по крайней мере один образец отличается. Затем вы запускаете HSD tukey, чтобы узнать, какой из них (один или более одного). Это я также пробовал, но, честно говоря, я не смог правильно обработать ваш мультииндекс. Это даст вам хороший список, образцы которого разные, а какие нет. Вам действительно нужны результаты в формате, который вы предлагаете в своем вопросе? – lrnzcig

+0

Я открыт для формата результатов, но я считаю, что мне нужен t-тест. Это не мои экспериментальные данные, поэтому я предоставляю то, о чем просили ... двухсторонний независимый t-тест. Мне нужно сообщить значение p. Это казалось мне полезным, поскольку в любой момент времени сравниваются только два набора данных (например, 0.01um против Control или 0.1um vs. Control). Насколько я понимаю, ANOVA - это сравнение нескольких наборов данных. – agf1997

+0

Дело в том, что я не думаю, что понял это, извините. Хорошо, нет ANOVA. Но тогда вы будете запускать 24x2 t-тестов ?? Может быть, я до сих пор не понял ... Во всяком случае, если вы хотите применить значение к мультииндексу, это будет нечто вроде 'df.loc ['0hr']. Loc ['0.01um'] ['t'] = xxx', считая, что 't' - столбец. Для вашего фрейма данных я пробовал его прямо в ipython как 'df.loc ['0hr']. Loc ['0.01um']. Loc [0] ['a'] = 3'. Но если я еще не понял, просто скажи! – lrnzcig

ответ

0

Хорошо, не совсем уверен, что я понял ситуацию, но я думаю, что это будет способом справиться с мультииндексным.

In [195]: 

index = pd.MultiIndex.from_product([set(df.index.get_level_values(0)), set(df.index.get_level_values(1)), ['t', 'p']]) 
result = pd.DataFrame(columns=['a', 'b'], index=index) 

for time in set(df.index.get_level_values(0)): 
    for condition in set(df.index.get_level_values(1)) - set(['Control']): 
     t, p = stats.ttest_ind(df.loc[time].loc['Control'] , df.loc[time].loc[condition], 1, equal_var=True) 
     result.loc[(time, condition, 't')] = t 
     result.loc[(time, condition, 'p')] = p 
print result 

И результат:

     a   b 
0hr Control t  NaN   NaN 
      p  NaN   NaN 
    0.01um t -0.6706134 -1.412036 
      p 0.5715365 0.2934382 
    0.1um t -0.8049845 -1.13842 
      p 0.5053153 0.3729403 
24hr Control t  NaN   NaN 
      p  NaN   NaN 
    0.01um t -2.529822 -3.137858 
      p 0.1271284 0.08831539 
    0.1um t -1.788854 -2.529822 
      p 0.2155355 0.1271284 

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

Надеюсь, что это все равно.

Смежные вопросы