Как выполнить двухдисковый односторонний t-тест с numpy/scipy

В R можно выполнить двухдисковый односторонний t-тест, просто используя

> A = c(0.19826790, 1.36836629, 1.37950911, 1.46951540, 1.48197798, 0.07532846)
> B = c(0.6383447, 0.5271385, 1.7721380, 1.7817880)
> t.test(A, B, alternative="greater")

    Welch Two Sample t-test

data:  A and B 
t = -0.4189, df = 6.409, p-value = 0.6555
alternative hypothesis: true difference in means is greater than 0 
95 percent confidence interval:
 -1.029916       Inf 
sample estimates:
mean of x mean of y 
0.9954942 1.1798523 

В мире Python scipy предоставляет аналогичную функцию ttest_ind, но может выполнять только двухсторонние t-тесты. Самая близкая информация по теме, которую я нашел, - это эта ссылка, но, похоже, это скорее обсуждение политики реализации одностороннего vs двухстороннего в scipy.

Поэтому мой вопрос в том, что кто-нибудь знает какие-либо примеры или инструкции о том, как выполнить одностороннюю версию теста с помощью numpy/scipy?

Ответы

Ответ 1

Из вашей ссылки в списке рассылки:

потому что односторонние тесты могут быть сняты с двухстороннего тесты. (С симметричными распределениями одностороннее р-значение равно половине двухстороннего pvalue)

Далее говорится, что scipy всегда дает тестовую статистику как подписанную. Это означает, что при заданных значениях p и t из двухстороннего теста вы отклоняете нулевую гипотезу теста с более высоким значением, если p/2 < alpha and t > 0 и менее чем тест, если p/2 < alpha and t < 0.

Ответ 2

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

Сначала позвольте сформулировать наш следственный вопрос правильно. Данные, которые мы исследуем

A = np.array([0.19826790, 1.36836629, 1.37950911, 1.46951540, 1.48197798, 0.07532846])
B = np.array([0.6383447, 0.5271385, 1.7721380, 1.7817880])

с образцом средств

A.mean() = 0.99549419
B.mean() = 1.1798523

Я предполагаю, что, поскольку среднее значение B, очевидно, больше среднего значения A, вы хотели бы проверить, является ли этот результат статистически значимым.

Таким образом, у нас есть нулевая гипотеза

H0: A >= B

что мы хотели бы отклонить в пользу альтернативной гипотезы

H1: B > A

Теперь, когда вы вызываете scipy.stats.ttest_ind(x, y), это делает проверку гипотезы о значении x.mean()-y.mean(), что означает, что для получения положительных значений во время вычисления ( что упрощает все соображения) мы должны позвонить

stats.ttest_ind(B,A)

вместо stats.ttest_ind(B,A). Мы получаем в ответ

  • t-value = 0.42210654140239207
  • p-value = 0.68406235191764142

и поскольку согласно документации это вывод для двустороннего t-теста, мы должны разделить p на 2 для нашего одностороннего теста. Таким образом, в зависимости от alpha уровня значимости, который вы выбрали, вам нужно

p/2 < alpha

чтобы отвергнуть нулевую гипотезу H0. Для alpha=0.05 это явно не так, поэтому вы не можете отклонить H0.

Альтернативный способ определить, отклоняете ли вы H0 без необходимости выполнять какую-либо алгебру для t или p - это посмотреть на значение t и сравнить его с критическим значением t_crit на желаемом уровне достоверности (например, 95%) для количество степеней свободы df, относящихся к вашей проблеме. Так как у нас есть

df = sample_size_1 + sample_size_2 - 2 = 8

мы получаем из статистической таблицы, как эта, которая

t_crit(df=8, confidence_level=95%) = 1.860

У нас явно есть

t < t_crit

поэтому мы снова получаем тот же результат, а именно то, что мы не можем отвергнуть H0.

Ответ 3

Когда нулевая гипотеза Ho: P1>=P2, а альтернативная гипотеза Ha: P1<P2. Чтобы проверить его на Python, вы пишете ttest_ind(P2,P1). (Обратите внимание, что сначала позиция P2).

first = np.random.normal(3,2,400)
second = np.random.normal(6,2,400)
stats.ttest_ind(first, second, axis=0, equal_var=True)

Вы получите результат, как показано ниже. Ttest_indResult(statistic=-20.442436213923845,pvalue=5.0999336686332285e-75)

В Python, когда statstic <0 ваше реальное p-значение на самом деле real_pvalue = 1-output_pvalue/2= 1-5.0999336686332285e-75/2, что приблизительно равно 0.99. Поскольку ваше значение p больше 0,05, вы не можете отклонить нулевую гипотезу о том, что 6 >= 3. при statstic >0 реальный балл z фактически равен -statstic, действительное p-значение равно pvalue/2.

Ответ Ivc должен быть, когда (1-p/2) < alpha and t < 0, вы можете отклонить меньше, чем гипотезу.