當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy stats.ttest_ind用法及代碼示例


本文簡要介紹 python 語言中 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, *, keepdims=False)#

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

這是對 2 個獨立樣本具有相同平均(預期)值的零假設的檢驗。此測試假定默認情況下總體具有相同的方差。

參數

a, b array_like

數組必須具有相同的形狀,除了對應於軸的維度(默認情況下為第一個)。

axis int 或無,默認值:0

如果是 int,則計算統計量的輸入軸。輸入的每個axis-slice(例如行)的統計信息將出現在輸出的相應元素中。如果 None ,輸入將在計算統計數據之前被分解。

equal_var 布爾型,可選

如果為 True(默認),則執行假設總體方差相等的標準獨立 2 樣本檢驗 [1]。如果為 False,請執行 Welch 的 t-test,它不假定人口方差相等 [2]。

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

定義如何處理輸入 NaN。

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

  • omit : 計算時將省略NaNs。如果計算統計數據的軸切片中剩餘的數據不足,則輸出的相應條目將為 NaN。

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

permutations 非負 int、np.inf 或 None(默認),可選

如果為 0 或無(默認),則使用 t 分布計算 p 值。否則,排列是將用於使用排列檢驗估計 p 值的隨機排列數。如果排列等於或超過合並數據的不同分區的數量,則改為執行精確測試(即每個不同分區僅使用一次)。詳細信息請參見注釋。

random_state {無,整數, numpy.random.Generator

如果種子是無(或np.random), 這numpy.random.RandomState使用單例。如果種子是一個 int,一個新的RandomState使用實例,播種種子.如果種子已經是一個Generator或者RandomState實例然後使用該實例。

用於生成排列的偽隨機數生成器狀態(僅在排列不是 None 時使用)。

alternative {‘雙麵’,‘less’, ‘greater’},可選

定義備擇假設。可以使用以下選項(默認為“雙麵”):

  • “雙麵”:樣本的分布均值不相等。

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

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

trim 浮點數,可選

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

keepdims 布爾值,默認值:假

如果將其設置為 True,則縮小的軸將作為尺寸為 1 的尺寸留在結果中。使用此選項,結果將針對輸入數組正確廣播。

返回

result TtestResult

具有以下屬性的對象:

統計 浮點數或 ndarray

t-statistic。

p值 浮點數或 ndarray

與給定替代方案相關的 p 值。

df 浮點數或 ndarray

t-statistic 計算中使用的自由度數。對於排列t-test,這始終是NaN。

該對象還具有以下方法:

confidence_interval(confidence_level=0.95)

計算給定置信水平下總體均值差異的置信區間。置信區間在 namedtuple 中返回,其中包含字段 lowhigh 。當執行排列t-test時,不計算置信區間,並且字段lowhigh包含NaN。

注意

假設我們觀察到兩個獨立的樣本,例如花瓣長度,我們正在考慮這兩個樣本是來自同一種群(例如,同一種類的花或具有相似花瓣特征的兩個物種)還是兩個不同的種群。

t-test 量化兩個樣本算術平均值之間的差異。 p 值量化觀察到一個或多個極值的概率,假設零假設(樣本是從具有相同總體均值的總體中抽取)為真。 p 值大於所選閾值(例如 5% 或 1%)表明我們的觀察結果不太可能是偶然發生的。因此,我們不拒絕總體均值相等的原假設。如果 p 值小於我們的閾值,那麽我們就有證據反對平等總體均值的原假設。

默認情況下,p 值是通過將觀測數據的 t-statistic 與理論 t 分布進行比較來確定的。當 1 < permutations < binom(n, k) 時,其中

  • k是觀察的數量a,

  • n是觀察的總數ab, 和

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

數據被匯集(連接),隨機分配到任一組a或者b,並計算t-statistic。此過程重複執行(排列次),生成原假設下 t-statistic 的分布,並將觀測數據的 t-statistic 與該分布進行比較以確定 p 值。具體來說,報告的 p 值是 “achieved significance level” (ASL),如 4.4 中定義[3]。請注意,還有其他使用隨機排列檢驗來估計 p 值的方法;對於其他選項,請參閱更一般的scipy.stats.permutation_test.

permutations >= binom(n, k) 時,將執行精確測試:數據以每種不同的方式在組之間僅分區一次。

置換檢驗的計算成本可能很高,並且不一定比分析檢驗更準確,但它並未對基礎分布的形狀做出強有力的假設。

使用修剪通常稱為修剪t-test。有時稱為 Yuen 的 t-test,它是 Welch 的 t-test 的擴展,不同之處在於在計算方差時使用縮尾均值,在計算統計量時使用修剪樣本量。如果基礎分布是長尾的或被異常值汙染的,建議進行修剪 [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. 埃夫隆和 T. Hastie。計算機時代統計推斷。 (2016 年)。

[4]

Yuen, Karen K.“針對不平等總體方差的兩個樣本修剪 t”。生物計量學,卷。 61,沒有。 1,1974 年,第 165-170 頁。 JSTOR,www.jstor.org/stable/2334299。訪問日期:2021 年 3 月 30 日。

[5]

袁凱倫 (Karen K.) 和 W. J. 迪克森 (W. J. Dixon)。 “兩個樣本修剪 t 的近似行為和性能。”生物計量學,卷。 60,沒有。 2,1973 年,第 369-374 頁。 JSTOR,www.jstor.org/stable/2334550。訪問日期:2021 年 3 月 30 日。

例子

>>> 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)
Ttest_indResult(statistic=-0.4390847099199348, pvalue=0.6606952038870015)
>>> stats.ttest_ind(rvs1, rvs2, equal_var=False)
Ttest_indResult(statistic=-0.4390847099199348, pvalue=0.6606952553131064)

ttest_ind 低估了不等方差的 p:

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

n1 != n2 時,等方差 t-statistic 不再等於不等方差 t-statistic:

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

T-test 具有不同的均值、方差和 n:

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

在執行置換測試時,更多的置換通常會產生更準確的結果。使用np.random.Generator 來確保重現性:

>>> stats.ttest_ind(rvs1, rvs5, permutations=10000,
...                 random_state=rng)
Ttest_indResult(statistic=-2.8415950600298774, pvalue=0.0052994700529947)

取這兩個樣本,其中一個有一個極端的尾巴。

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

使用修剪關鍵字執行修剪(元)t-test。例如,使用 20% 的修整,trim=.2, 測試將減少一個 (np.floor(trim*len(a))) 每個樣本尾部的元素a.對樣品沒有影響b因為np.floor(trim*len(b))為 0。

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

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.stats.ttest_ind。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。