假设检验是在已知总体分布某个参数的先验值后,通过抽样来对这个先验值进行验证是否接受的问题。判断的方法大致分为两类:临界值法和P值方法;相对来说p值法更方便计算机处理,因此下面的讨论都是基于p值法。
总体均值的假设检验就是已知了一个均值的先验值,然后根据实验获取的数据对这个值进行验证是否接受它。根据是否已知总体的方差,又可细分为两种类型:方差已知和方差未知。
1. 方差已知的
在方差已知的情况下,检验统计量为:
X
‾
−
μ
0
σ
/
n
∼
N
(
0
,
1
)
\frac{\overline X - \mu_0}{\sigma/ \sqrt{n}}\sim N(0,1)
σ/nX−μ0∼N(0,1)
拒绝域分别为:
- ∣ z ∣ = ∣ X ‾ − μ 0 σ / n ∣ ≥ z α / 2 |z|=|\frac{\overline X-\mu_0}{\sigma/\sqrt n}|\ge z_{\alpha/2} ∣z∣=∣σ/nX−μ0∣≥zα/2 (双边检验)
- z = X ‾ − μ 0 σ / n ≥ z α z=\frac{\overline X-\mu_0}{\sigma/\sqrt n}\ge z_\alpha z=σ/nX−μ0≥zα (右边检验)
- z = X ‾ − μ 0 σ / n ≤ − z α z=\frac{\overline X-\mu_0}{\sigma/\sqrt n}\le -z_\alpha z=σ/nX−μ0≤−zα (左边检验)
1.1. P值计算:
- 双边检验
P ( ∣ Z ∣ ≥ ∣ z 0 ∣ ) P(|Z|\ge |z_0|) P(∣Z∣≥∣z0∣) - 左侧检验
P ( Z ≤ z 0 ) P(Z\le z_0) P(Z≤z0) - 右侧检验
P ( Z ≥ z 0 ) P(Z\ge z_0) P(Z≥z0)
1.2. Python计算代码
import numpy as np
from scipy import stats
def ztest_simple(xb, sigma,sample_num, mu0, side='both'):
"""
参数:
xb- 样本均值
sigma- 样本的标准差
sample_num- 样本容量
mu0- H0假设的均值
side取值
'both'- 双边检验
'left'- 左侧检验
返回值: 字典形式的p_val
"""
Z = stats.norm(loc=0, scale=1)
z0=(xb-mu0)/(sigma/np.sqrt(sample_num))
if side=='both':
z0=np.abs(z0)
tmp = Z.sf(z0)+Z.cdf(-z0)
return {"p_val": tmp}
elif side=='left':
tmp = Z.cdf(z0)
return {"p_val": tmp}
else:
tmp = Z.sf(z0)
return {"p_val": tmp}
1.3 应用实例
例1: 为了了解A高校学生的消费水平,随机抽取了225位学生调查其月消费(近6个月的消费平均值),得到该225位学生的平均月消费1530元. 假设学生月消费服从正态分布, 标准差为
σ
=
120
\sigma=120
σ=120.
已知B高校学生的月平均消费为1550元.是否可以认为A高校学生的消费水平要低于B高校?
解:
H
0
:
μ
=
μ
0
=
1550
H
1
:
μ
≤
μ
0
H_0: \mu = \mu_0=1550 \quad H_1: \mu \le \mu_0
H0:μ=μ0=1550H1:μ≤μ0
所以该假设检验为左边检验,使用python代码计算时,要注意side
参数设置为left
.
ztest_simple(1530, 120, 225, 1550, side='left')
# 结果:
{'p_val': 0.0062096653257761323}
因此在显著性水平 α = 0.05 \alpha = 0.05 α=0.05下,拒绝原假设,即认为A高校学生的生活水平低于B高校.
例2:根据健康中心报告35至44岁的男性平均心脏收缩压为128, 标准差为15. 现根据某公司在35至44岁年龄段的72位员工的体检记录,计算得平均收缩压为126.07(mm/hg). 问该公司员工的收缩压与一般人群是否存在差异?(假设该公司员工与一般男子的心脏收缩压具有相同的标准差). (
α
=
0.05
\alpha = 0.05
α=0.05)
解:
H
0
:
μ
=
μ
0
=
128
H
1
:
μ
≠
μ
0
=
128
H_0: \mu=\mu_0=128 \quad H_1: \mu \neq \mu_0=128
H0:μ=μ0=128H1:μ=μ0=128
所以该问题为双边检验问题。使用Python计算如下:
ztest_simple(126.07, 15, 72, 128, side='both')
# 结果:
{'p_val': 0.27493294653328959}
因为 0.27493294653328959>0.05, 因此接受原假设.
2. 方差未知
在方差未知的情况下, 检验统计量为:
X
‾
−
μ
0
S
/
n
∼
t
(
n
−
1
)
\frac{\overline X - \mu_0}{S/\sqrt{n}}\sim t(n-1)
S/nX−μ0∼t(n−1)
拒绝域分别为:
- ∣ t ∣ = ∣ X ‾ − μ 0 S / n ∣ ≥ t α / 2 ( n − 1 ) |t|=|\frac{\overline X - \mu_0}{S/\sqrt{n}}|\ge t_{\alpha/2}(n-1) ∣t∣=∣S/nX−μ0∣≥tα/2(n−1) (双边检验)
- t = X ‾ − μ 0 S / n ≥ t α ( n − 1 ) t=\frac{\overline X - \mu_0}{S/\sqrt{n}}\ge t_\alpha(n-1) t=S/nX−μ0≥tα(n−1) (右边检验)
- t = X ‾ − μ 0 S / n ≤ − t α ( n − 1 ) t=\frac{\overline X - \mu_0}{S/\sqrt{n}}\le - t_\alpha(n-1) t=S/nX−μ0≤−tα(n−1) (左边检验)
2.1. P值计算
- 双边检验
P ( ∣ T ∣ ≥ ∣ t 0 ∣ ) P(|T|\ge |t_0|) P(∣T∣≥∣t0∣) - 左侧检验
P ( T ≤ t 0 ) P(T\le t_0) P(T≤t0) - 右侧检验
P ( T ≥ t 0 ) P(T\ge t_0) P(T≥t0)
2.2 python计算代码
在scipy
库中,有一个专门用来进行t检验的函数:
stats.ttest_1samp(a, popmean, axis=0, nan_policy='propagate')
使用该函数时一定要注意,默认计算的是双边检验。
2.3 应用实例
例1: 可乐制造商为了检验可乐在贮藏过程中其甜度是否有损失,请专业品尝师对可乐贮藏前后的甜度进行评分.10位品尝师对可乐贮藏前后甜度评分之差为:
2.0, 0.4, 0.7, 2.0, -0.4, 2.2, -1.3, 1.2, 1.1, 2.3
问:这些数据是否提供了足够的证据来说明可乐贮藏之后的甜度有损失呢?设总体服从正态分布,标准差未知.
解:
H
0
:
μ
=
0
H
1
:
μ
>
0
H_0: \mu=0 \quad H_1: \mu\gt 0
H0:μ=0H1:μ>0
该问题为右侧检验,使用python计算如下:
import numpy as np
from scipy import stats
data = np.array([2.0, 0.4, 0.7, 2.0, -0.4, 2.2, -1.3, 1.2, 1.1, 2.3])
_, pval = stats.ttest_1samp(data, 0)
# 结果为
pval = 0.024526312420683691 # 这是双边检验的结果
pval = pval/2 = 0.012263156210341845
- 如果显著水平取α=0.05,则有充分的理由拒绝原假设。
- 如果显著水平取α=0.01, 则还没有充分的理由拒绝原假设.
例 2:某批次矿砂的5个样品的镍含量,经测定为(%):
3.25 3.27 3.24 3.25 3.24
假设测定值服从正态分布,但是参数均未知。问在
α
=
0.01
\alpha=0.01
α=0.01下能否接受假设:这批矿砂的镍含量的均值为3.25.
解:
H
0
:
μ
=
μ
0
=
3.25
H
1
:
μ
≠
3.25
H_0: \mu= \mu_0=3.25\quad H_1: \mu \neq3.25
H0:μ=μ0=3.25H1:μ=3.25
该问题为左双边检验, python计算如下:
import numpy as np
from scipy import stats
data = np.array([3.25, 3.27, 3.24, 3.25, 3.24])
stats.ttest_1samp(data, 3.25)
# 结果
pval = 1.0
因为 p v a l = 0.1 > α = 0.01 pval=0.1 \gt \alpha=0.01 pval=0.1>α=0.01, 所以可以接受该批矿砂镍含量均值为3.25
3. 成对数据的t检验
配对研究的数据是一对一对地收集得到的, 所以也称为成对数据的研究. 由于配对研究采用了比较的思想, 比通常的单个样本推断更让人信服. 这种方法在医学和生物研究领域中广泛存在, 成对数据检验的基本思想是将两样本问题转为单样本问题.
- 假设成对数据 ( X 1 , Y 1 ) , . . . , ( X n , Y n ) (X_1, Y_1), ..., (X_n, Y_n) (X1,Y1),...,(Xn,Yn)
- 设差值 D i = X i − Y i , i = 1 , . . . , n D_i = X_i - Y_i, i=1,...,n Di=Xi−Yi,i=1,...,n
- 差值可以看成来自正态总体
N
(
μ
D
,
σ
D
2
)
N(\mu_D, \sigma_D^2)
N(μD,σD2)的样本
基于上述处理,我们可以把成对数据均值的检验,使用方差未知的t检验完成。
3.1 实例
例1: 为了试验两种不同谷物种子的优劣,选取了十块土质不同的土地,并将每块土地分为面积相同的两部分,分别种植这两种种子。设在每块土地的两部分人工管理等条件完全一样。下面给出各块土地上的产量。
• 种子A(xi) 23 35 29 42 39 29 37 34 35 28
• 种子B(yi) 26 39 35 40 38 24 36 27 41 27
问:这两种种子种植的谷物产量是否有显著的差异(取显著性水平为0.05)?
解:
H
0
:
μ
D
=
0
H
1
:
μ
D
≠
0
H_0: \mu_D=0 \quad H_1:\mu_D \neq 0
H0:μD=0H1:μD=0
这样该问题即转换为方差未知的情况下,对均值的双边检验。Python计算如下:
import numpy as np
from scipy import stats
data1 = np.array([23, 35, 29, 42, 39, 29, 37, 34, 35, 28])
data2 = np.array([26, 39, 35, 40, 38, 24, 36, 27, 41, 27])
delta = data1-data2
_, pval = stats.ttest_1samp(delta, 0)
# 结果
pval = 0.88992115341674716
因为 p v a l > α = 0.05 pval\gt\alpha=0.05 pval>α=0.05, 所以接受原假设。
4. 参考文献
- 《概率论与数理统计》浙大
- numpy and scipy documents
5. 交流联系
- email: hflag@163.com
- qq: 532843488
本人一直从事《概率论与数理统计》的教学,欢迎遇到问题的童靴们联系我。