scipy.stats.

ttest_ind#

scipy.stats.ttest_ind(a, b, *, axis=0, equal_var=True, nan_policy='propagate', permutations=None, random_state=None, alternative='two-sided', trim=0, method=None, keepdims=False)[原始碼]#

計算兩個獨立樣本分數平均值的 T 檢定。

此檢定用於檢驗 2 個獨立樣本是否具有相同的平均(期望)值的虛無假設。此檢定預設假設母體具有相同的變異數。

版本 1.17.0 開始棄用:依位置使用引數 {'trim', 'method', 'alternative', 'nan_policy', 'axis', 'keepdims', 'equal_var'} 已棄用;從 SciPy 1.17.0 開始,這些將僅限於關鍵字引數。引數 {'permutations', 'random_state'} 已棄用,無論是依位置或關鍵字傳遞;它們將在 SciPy 1.17.0 中移除。使用 method 執行置換檢定。

參數:
a, barray_like

陣列必須具有相同的形狀,除了對應於 axis 的維度(預設為第一個)。

axisint 或 None,預設值:0

如果為整數,則為計算統計量的輸入軸。輸入的每個軸切片(例如,列)的統計量將出現在輸出的對應元素中。如果為 None,則在計算統計量之前,輸入將被展平。

equal_varbool,選用

如果為 True(預設值),則執行標準獨立雙樣本檢定,假設母體變異數相等 [1]。如果為 False,則執行 Welch's t 檢定,該檢定不假設母體變異數相等 [2]

在版本 0.11.0 中新增。

nan_policy{‘propagate’, ‘omit’, ‘raise’}

定義如何處理輸入的 NaN。

  • propagate:如果在計算統計量的軸切片(例如,列)中存在 NaN,則輸出的相應條目將為 NaN。

  • omit:在執行計算時將省略 NaN。如果沿著計算統計量的軸切片中剩餘的資料不足,則輸出的相應條目將為 NaN。

  • raise:如果存在 NaN,將引發 ValueError

permutations非負整數,np.inf,或 None(預設值),選用

如果為 0 或 None(預設值),則使用 t 分佈來計算 p 值。否則,permutations 是將用於使用置換檢定估計 p 值的隨機置換次數。如果 permutations 等於或超過合併資料的不同分割數,則會改為執行精確檢定(即,每個不同的分割僅使用一次)。詳情請參閱注意事項。

版本 1.17.0 開始棄用:permutations 已棄用,將在 SciPy 1.7.0 中移除。使用 PermutationMethodn_resamples 引數,並將實例作為 method 引數傳遞。

random_state{None, int, numpy.random.Generator,

如果 seed 為 None(或 np.random),則使用 numpy.random.RandomState 單例。如果 seed 為整數,則會使用新的 RandomState 實例,並以 seed 作為種子。如果 seed 已經是 GeneratorRandomState 實例,則會使用該實例。

用於產生置換的虛擬隨機數產生器狀態(僅在 permutations 不為 None 時使用)。

版本 1.17.0 開始棄用:random_state 已棄用,將在 SciPy 1.7.0 中移除。使用 PermutationMethodrng 引數,並將實例作為 method 引數傳遞。

alternative{‘two-sided’, ‘less’, ‘greater’},選用

定義對立假設。以下選項可用(預設值為 ‘two-sided’)

  • ‘two-sided’:樣本的底層分佈的平均值不相等。

  • ‘less’:第一個樣本的底層分佈的平均值小於第二個樣本的底層分佈的平均值。

  • ‘greater’:第一個樣本的底層分佈的平均值大於第二個樣本的底層分佈的平均值。

trimfloat,選用

如果為非零值,則執行截尾(Yuen's)t 檢定。定義要從輸入樣本的每一端截尾的元素比例。如果為 0(預設值),則不會從任一側截尾任何元素。從每個尾部截尾的元素數是 trim 乘以元素數的底數。有效範圍為 [0, .5)。

methodResamplingMethod,選用

定義用於計算 p 值的方法。如果 methodPermutationMethod/MonteCarloMethod 的實例,則 p 值是使用 scipy.stats.permutation_test/scipy.stats.monte_carlo_test 以及提供的組態選項和其他適當設定來計算的。否則,p 值是透過將檢定統計量與理論 t 分佈進行比較來計算的。

在版本 1.15.0 中新增。

keepdimsbool,預設值:False

如果設定為 True,則縮減的軸將保留在結果中,作為大小為一的維度。使用此選項,結果將與輸入陣列正確廣播。

傳回值:
resultTtestResult

具有以下屬性的物件

statisticfloat 或 ndarray

t 統計量。

pvaluefloat 或 ndarray

與給定對立假設相關聯的 p 值。

dffloat 或 ndarray

用於計算 t 統計量的自由度數。對於置換 t 檢定,此值始終為 NaN。

在版本 1.11.0 中新增。

物件也具有以下方法

confidence_interval(confidence_level=0.95)

計算給定信賴水準下母體平均值差異的信賴區間。信賴區間以具有欄位 lowhighnamedtuple 傳回。當執行置換 t 檢定時,不會計算信賴區間,且欄位 lowhigh 包含 NaN。

在版本 1.11.0 中新增。

注意事項

假設我們觀察到兩個獨立樣本,例如花瓣長度,並且我們正在考慮這兩個樣本是否來自相同的母體(例如,相同的花種或具有相似花瓣特徵的兩個物種)或兩個不同的母體。

t 檢定量化了兩個樣本的算術平均值之間的差異。p 值量化了在虛無假設(即樣本來自具有相同母體平均值的母體)為真的情況下,觀察到與實際值相同或更極端值的機率。大於選定閾值(例如 5% 或 1%)的 p 值表示我們的觀察結果並非太不可能偶然發生。因此,我們不拒絕母體平均值相等的虛無假設。如果 p 值小於我們的閾值,則我們有證據反對母體平均值相等的虛無假設。

預設情況下,p 值是透過將觀察資料的 t 統計量與理論 t 分佈進行比較來確定的。

(在以下內容中,請注意引數 permutations 本身已棄用,但可以透過建立 scipy.stats.PermutationMethod 的實例,並使用 n_resamples=permutations 並將其作為 method 引數傳遞來執行幾乎相同的檢定。)當 1 < permutations < binom(n, k),其中

  • ka 中的觀察數,

  • nab 中的觀察總數,且

  • binom(n, k) 是二項式係數(nk),

資料被合併(串連),隨機分配到群組 ab,並計算 t 統計量。此過程重複執行(permutation 次),產生虛無假設下 t 統計量的分佈,並將觀察資料的 t 統計量與此分佈進行比較,以確定 p 值。具體而言,報告的 p 值是 [3] 的 4.4 中定義的「實現顯著性水準」(ASL)。請注意,還有其他方法可以使用隨機置換檢定來估計 p 值;如需其他選項,請參閱更通用的 permutation_test

permutations >= binom(n, k) 時,會執行精確檢定:資料在群組之間被分割,每個不同的方式恰好一次。

置換檢定在計算上可能很昂貴,並且不一定比分析檢定更準確,但它對底層分佈的形狀沒有做出強烈的假設。

使用截尾通常稱為截尾 t 檢定。有時稱為 Yuen's t 檢定,它是 Welch's t 檢定的延伸,不同之處在於在變異數計算中使用溫莎平均值,以及在統計量計算中使用截尾樣本大小。如果底層分佈是長尾或被離群值污染,則建議使用截尾 [4]

統計量計算為 (np.mean(a) - np.mean(b))/se,其中 se 是標準誤。因此,當 a 的樣本平均值大於 b 的樣本平均值時,統計量將為正值;當 a 的樣本平均值小於 b 的樣本平均值時,統計量將為負值。

從 SciPy 1.9 開始,np.matrix 輸入(不建議用於新程式碼)在執行計算之前會轉換為 np.ndarray。在這種情況下,輸出將是純量或適當形狀的 np.ndarray,而不是 2D np.matrix。同樣地,雖然會忽略遮罩陣列的遮罩元素,但輸出將是純量或 np.ndarray,而不是 mask=False 的遮罩陣列。

參考文獻

[3]
  1. Efron 和 T. Hastie。電腦時代統計推論。(2016)。

[4]

Yuen, Karen K. “The Two-Sample Trimmed t for Unequal Population Variances.” Biometrika, vol. 61, no. 1, 1974, pp. 165-170. JSTOR, www.jstor.org/stable/2334299. Accessed 30 Mar. 2021.

[5]

Yuen, Karen K., 和 W. J. Dixon。 “The Approximate Behaviour and Performance of the Two-Sample Trimmed t.” Biometrika, vol. 60, no. 2, 1973, pp. 369-374. JSTOR, www.jstor.org/stable/2334550. Accessed 30 Mar. 2021.

範例

>>> import numpy as np
>>> from scipy import stats
>>> rng = np.random.default_rng()

使用平均值相同的樣本進行測試

>>> rvs1 = stats.norm.rvs(loc=5, scale=10, size=500, random_state=rng)
>>> rvs2 = stats.norm.rvs(loc=5, scale=10, size=500, random_state=rng)
>>> stats.ttest_ind(rvs1, rvs2)
TtestResult(statistic=-0.4390847099199348,
            pvalue=0.6606952038870015,
            df=998.0)
>>> stats.ttest_ind(rvs1, rvs2, equal_var=False)
TtestResult(statistic=-0.4390847099199348,
            pvalue=0.6606952553131064,
            df=997.4602304121448)

ttest_ind 低估了變異數不相等時的 p 值

>>> rvs3 = stats.norm.rvs(loc=5, scale=20, size=500, random_state=rng)
>>> stats.ttest_ind(rvs1, rvs3)
TtestResult(statistic=-1.6370984482905417,
            pvalue=0.1019251574705033,
            df=998.0)
>>> stats.ttest_ind(rvs1, rvs3, equal_var=False)
TtestResult(statistic=-1.637098448290542,
            pvalue=0.10202110497954867,
            df=765.1098655246868)

n1 != n2 時,相等變異數 t 統計量不再等於不相等變異數 t 統計量

>>> rvs4 = stats.norm.rvs(loc=5, scale=20, size=100, random_state=rng)
>>> stats.ttest_ind(rvs1, rvs4)
TtestResult(statistic=-1.9481646859513422,
            pvalue=0.05186270935842703,
            df=598.0)
>>> stats.ttest_ind(rvs1, rvs4, equal_var=False)
TtestResult(statistic=-1.3146566100751664,
            pvalue=0.1913495266513811,
            df=110.41349083985212)

平均值、變異數和 n 不同的 T 檢定

>>> rvs5 = stats.norm.rvs(loc=8, scale=20, size=100, random_state=rng)
>>> stats.ttest_ind(rvs1, rvs5)
TtestResult(statistic=-2.8415950600298774,
            pvalue=0.0046418707568707885,
            df=598.0)
>>> stats.ttest_ind(rvs1, rvs5, equal_var=False)
TtestResult(statistic=-1.8686598649188084,
            pvalue=0.06434714193919686,
            df=109.32167496550137)

取這兩個樣本,其中一個樣本具有極端尾部。

>>> a = (56, 128.6, 12, 123.8, 64.34, 78, 763.3)
>>> b = (1.1, 2.9, 4.2)

使用 trim 關鍵字來執行截尾 (Yuen) t 檢定。例如,使用 20% 截尾,trim=.2,檢定將減少樣本 a 的每個尾部的一個 (np.floor(trim*len(a))) 元素的影響。它對樣本 b 沒有影響,因為 np.floor(trim*len(b)) 為 0。

>>> stats.ttest_ind(a, b, trim=.2)
TtestResult(statistic=3.4463884028073513,
            pvalue=0.01369338726499547,
            df=6.0)