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)[源代码]¶
计算均数的T检验 两个独立的 分数样本。
这是对两个独立样本具有相同平均值(期望值)的零假设的检验。此测试假设总体在默认情况下具有相同的方差。
- 参数
- a, barray_like
数组必须具有相同的形状,但在与 axis (默认情况下为第一个)。
- axis整型或无型,可选
要沿其计算测试的轴。如果没有,则对整个数组进行计算, a ,以及 b 。
- equal_var布尔值,可选
如果为True(默认值),则执行假设总体方差相等的标准独立双样本测试 [1]. 如果为假,则执行韦尔奇t检验,该检验不假定总体方差相等 [2].
0.11.0 新版功能.
- nan_policy{‘Propagate’,‘RAISE’,‘OMIT’},可选
定义输入包含NaN时的处理方式。以下选项可用(默认值为‘Propagate’):
‘Propagate’:返回NaN
“raise”:引发错误
‘omit’:执行计算时忽略NaN值
“省略”选项目前不适用于置换测试或单边非脓性测试。
- permutations非负int、np.inf或None(默认值),可选
如果为0或无(默认值),则使用t分布来计算p值。否则, permutations 是将用于使用排列测试估计p值的随机排列的数目。如果 permutations 等于或超过池化数据的不同分区数,则执行精确测试(即每个不同分区恰好使用一次)。有关详细信息,请参阅注释。
1.7.0 新版功能.
- random_state :{无,整型,
numpy.random.Generator
,{无,整型, 如果 seed 为无(或 np.random )、
numpy.random.RandomState
使用的是Singleton。如果 seed 是一个整型、一个新的RandomState
实例,其种子设定为 seed 。如果 seed 已经是一个Generator
或RandomState
实例,则使用该实例。用于生成排列的伪随机数生成器状态(仅在 permutations 不是没有)。
1.7.0 新版功能.
- alternative{‘双面’,‘少’,‘大’},可选
定义了另一种假设。有以下选项可用(默认为‘双面’):
“双面”:样本下面的分布的平均值是不相等的。
‘小于’:第一个样本下面的分布的平均值小于第二个样本下面的分布的平均值。
“大于”:第一个样本下面的分布的平均值大于第二个样本下面的分布的平均值。
1.6.0 新版功能.
- trim浮动,可选
如果非零,则执行修剪(袁氏)t检验。定义要从输入采样的两端修剪的元素的比例。如果为0(默认值),则不会从任一侧修剪任何图元。每个尾部的修剪元素数等于修剪的楼板乘以元素数。有效范围为[0,.5)。
1.7 新版功能.
- 退货
- statistic浮点或数组
计算的t统计量。
- pvalue浮点或数组
p值。
注意事项
假设我们观察了两个独立的样本,例如花瓣长度,我们正在考虑这两个样本是来自相同的种群(例如,相同的花种或具有相似花瓣特征的两个物种),还是来自两个不同的种群。
t检验量化了两个样本算术平均值之间的差异。假设零假设(样本取自具有相同总体均值的总体)为真,p值将观察到的概率量化为或更多个极值。大于所选阈值的p值(例如5%或1%)表示我们的观察不太可能是偶然发生的。因此,我们不排斥人口平均数相等的零假设。如果p值小于我们的阈值,那么我们就有证据反对相等总体均值的零假设。
默认情况下,p值是通过将观测数据的t统计量与理论t分布进行比较来确定的。什么时候
1 < permutations < binom(n, k)
,在哪里k
中的观测值 a ,n
中观察到的总数。 a 和 b ,以及binom(n, k)
是二项式系数 (n
选择k
),
数据被池化(串联),并随机分配给任一组 a 或 b ,并计算t统计量。此过程重复执行 (permutation 次),生成零假设下的t统计量的分布,并且将观测数据的t统计量与该分布进行比较以确定p值。什么时候
permutations >= binom(n, k)
,则执行精确的测试:数据以每种不同的方式在组之间划分恰好一次。排列测试的计算成本可能很高,而且不一定比分析测试更准确,但它不会对潜在分布的形状做出强有力的假设。
修剪的使用通常被称为修剪t检验。有时被称为袁氏t检验,这是Welch t检验的扩展,不同之处在于在计算方差时使用了窗口化均值,在统计计算中使用了修剪后的样本量。如果基础分布是长尾分布或被异常值污染,则建议修剪 [4].
参考文献
- 1
https://en.wikipedia.org/wiki/T-test#Independent_two-sample_t-test
- 2
- 3
- 4
作者:Karen K.“两个样本剔除了不相等的总体方差。”比普里斯卡,Vol.61,No.1,1974,第165-170页。JSTOR,www.jstor.org/STRATE/2334299。访问时间为2021年3月30日。
- 5
题名/责任者:The First,and W.J.Dixon。“两个样本的修剪t的近似行为和性能。”比普里斯卡,Vol.60,第2期,1973年,第369-374页。JSTOR,www.jstor.org/STRATE/2334550。访问时间为2021年3月30日。
示例
>>> 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-统计量不再等于不等方差t-统计量:>>> 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)
具有不同均值、方差和n的t检验:
>>> 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.0052)
拿这两个样本来说,其中一个有一条极端的尾巴。
>>> a = (56, 128.6, 12, 123.8, 64.34, 78, 763.3) >>> b = (1.1, 2.9, 4.2)
使用 trim 关键字来执行修剪(元)t测试。例如,使用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)