Как выполнить двухдисковый односторонний 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
, вы можете отклонить меньше, чем гипотезу.
Ответ 4
Вы смотрели на это: Как рассчитать статистику "t-критерия" с NumPy
Я думаю, что это именно то, на что смотрят эти вопросы