簡體   English   中英

如何在 Python 中執行兩樣本單尾 t 檢驗

[英]How to perform two-sample, one-tailed t-test in Python

我想執行一個雙樣本單尾 t 檢驗來比較兩種均值。 對於我正在尋找的具體問題,我希望僅在一個方向進行比較。 我希望 null 假設是mu_2 > mu_1和替代假設是mu_1 <= mu_2 還是應該 null 假設仍然是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) alpha 值為 0.05,p 值遠小於意味着 null 假設被拒絕的值。 但是,我的直覺告訴我,不應拒絕 null 假設,因為 mu_2 明顯大於 mu_1(至少我希望 p 值更大)。 因此,我覺得我要么錯誤地解釋了結果,要么需要額外的計算才能得到正確的答案。

我將不勝感激任何額外的幫助和指導。 謝謝!

我為 t 檢驗 p 值計算提供了另一種解決方案。

from scipy.stats import ttest_ind
def t_test(x,y,alternative='both-sided'):
    _, double_p = ttest_ind(x,y,equal_var = False)
    if alternative == 'both-sided':
        pval = double_p
    elif alternative == 'greater':
        if np.mean(x) > np.mean(y):
            pval = double_p/2.
        else:
            pval = 1.0 - double_p/2.
    elif alternative == 'less':
        if np.mean(x) < np.mean(y):
            pval = double_p/2.
        else:
            pval = 1.0 - double_p/2.
    return pval

你是對的,如果你正在做一個單方面的測試,它應該有一個很大的 p 值。 ttest_ind執行一個雙面測試,它給出了您觀察到比您的 t 統計量的絕對值更極端的概率。

要進行單邊 t 檢驗,您可以使用 cdf,它是 t 統計量的概率之和。

稍微修改一下這段代碼

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)
    tstat = (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(tstat), df)
    if alternative == "lesser":
        p = t.cdf(tstat, df)
    if alternative == "greater":
        p = 1-t.cdf(tstat, df)
    return tstat, 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)

您會得到類似結果的結果,我們可以測試上面的代碼替代 == "equal",這是一個雙面測試:

welch_ttest(data1,data2,"equal")

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

您可以使用與 scipy 相同的 p 值進行 2 面 t 檢驗,現在我們進行您需要的單面檢驗:

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

SciPy >= 1.6

您現在可以使用文檔中的“替代”參數進行兩個樣本一尾測試。 在下面的示例中,我使用的是“less”,但這些是選項 Alternative{'two-sided', 'less', 'greater'}

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html

from scipy.stats import ttest_ind

ttest, pval = ttest_ind(data1, data2, alternative="less")

print("t-test", '{0:.10f}'.format(ttest[0]))
print("p-value", '{0:.10f}'.format(pval[0]))

if pval <0.05:
      print("we reject null hypothesis")
    else:
      print("we accept null hypothesis")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM