Как выполнить t-тест с двумя выборками и одним хвостом в Python - PullRequest
0 голосов
/ 23 апреля 2020

Я хочу выполнить t-тест с двумя выборками и одним хвостом, чтобы сравнить два средних значения. Для конкретной задачи c, которую я ищу, я хочу, чтобы сравнение проводилось только в одном направлении. Я хотел бы, чтобы нулевая гипотеза была mu_2 > mu_1, а альтернативная гипотеза - mu_1 <= mu_2. Или же нулевая гипотеза все еще должна быть такой: mu_1 - mu_2 = 0, даже для одностороннего случая?

Я работаю с большим набором данных, но если бы мне пришлось извлекать и округлять параметры, для data_1 это mu_1 = 4.3, s_1 = 4.8, and n_1 = 40000 и data_2 это mu_2 = 4.9, s_2 = 4.4, n_2 = 30000. Я использую scipy для выполнения t-теста с двумя выборками:

stats.ttest_ind(data1,
                data2,
                equal_var = False)

Учитывая, что scipy учитывает только тест с двумя хвостами, я не уверен, как интерпретировать значения. Ttest_indResult(statistic=-19.51646312898464, pvalue=1.3452106729078845e-84). Значение альфа-канала равно 0,05, а значение р намного меньше, чем значение, которое будет означать, что нулевая гипотеза отклоняется. Тем не менее, моя интуиция говорит мне, что нулевая гипотеза не должна быть отвергнута, потому что mu_2 явно больше, чем mu_1 (на самом минимальном уровне я ожидаю, что значение p будет больше). Поэтому мне кажется, что я либо неправильно интерпретирую результаты, либо мне нужны дополнительные расчеты, чтобы получить правильный ответ.

Буду признателен за любую дополнительную помощь и рекомендации. Спасибо!

1 Ответ

0 голосов
/ 24 апреля 2020

Вы правы, если вы делаете односторонний тест, он должен иметь большое значение p. ttest_ind выполняет двусторонний тест, который дает вероятность того, что вы наблюдаете нечто более экстремальное, чем абсолют вашего t-statisti c.

Чтобы выполнить односторонний t-тест, вы можете использовать cdf , которая является суммой вероятностей с точностью до вашей статистики c.

Изменение этот код слегка:

def welch_ttest(x1, x2,alternative):
    n1 = x1.size
    n2 = x2.size
    m1 = np.mean(x1)
    m2 = np.mean(x2)
    v1 = np.var(x1, ddof=1)
    v2 = np.var(x2, ddof=1)
    t = (m1 - m2) / np.sqrt(v1 / n1 + v2 / n2)
    df = (v1 / n1 + v2 / n2)**2 / (v1**2 / (n1**2 * (n1 - 1)) + v2**2 / (n2**2 * (n2 - 1)))
    if alternative == "equal":
        p = 2 * t.cdf(-abs(t), df)
    if alternative == "lesser":
        p = 1-t.cdf(abs(t), df)
    if alternative == "greater":
        p = t.cdf(abs(t), df)
    return t, df, p

Я моделирую некоторые данные:

import numpy as np
from scipy.stats import ttest_ind
from scipy.stats import t

np.random.seed(seed=123)
data1 = np.random.normal(4.3,4.8,size=40000)
np.random.seed(seed=123)
data2 = np.random.normal(4.9,4.4,size=30000)
ndf = len(data1) +len(data2) - 2
ttest_ind(data1,data2,equal_var = False)

Ttest_indResult(statistic=-16.945279258324227, pvalue=2.8364816571790452e-64)

Вы получаете что-то похожее на ваш результат, мы можем проверить приведенный выше код для альтернативы == "равный", который является двусторонним тестом:

welch_ttest(data1,data2,"equal")

    (<scipy.stats._continuous_distns.t_gen at 0x12472b128>,
     67287.08544468222,
     2.8364816571790452e-64)

Вы можете использовать то же значение p, что и для двустороннего t-теста, теперь мы проводим односторонний тест нужно:

welch_ttest(data1,data2,"greater")
(<scipy.stats._continuous_distns.t_gen at 0x12472b128>, 67287.08544468222, 1.0)
...