前面几讲中的参数检验都是基于这样一个假设:样本来自于正态分布的总体!那么如果总体不符合正态分布时,如何对其参数或者分布进行检验呢?这就涉及到非参数检验,我们首先从单个总体的位置参数和分布检验讲起。
例1:假设某城市16座预售的楼盘均价(单位:百元/
m
2
m^2
m2 )如下表所示:
36 32 31 25 28 36 40 32
41 26 35 35 32 87 33 35
问:该地区评价楼盘价格是否与媒体公布的3700元/
m
2
m^2
m2的说法相符?
解:若假设楼盘均价服从正态分布,则有参数统计分析建立假设如下:
H
0
:
μ
=
37
H
1
:
μ
≠
37
H_0: \mu=37 \quad H_1:\mu \neq 37
H0:μ=37H1:μ=37
那么该问题就是方差未知的均值检验,其检验统计量为:
X
‾
−
μ
s
/
n
∼
t
(
n
−
1
)
\frac{\overline X -\mu}{s/\sqrt{n}}\sim t(n-1)
s/nX−μ∼t(n−1)
使用python计算如下:
import numpy as np
from scipy import stats
data=[36, 32, 31, 25, 28, 36, 40, 32, 41, 26, 35, 35, 32, 87, 33, 35]
_, pval=stats.ttest_1samp(data, 37)
# 结果:
pval=0.8895650329479428
p v a l = 0.8895650329479428 > α = 0.05 pval=0.8895650329479428>\alpha=0.05 pval=0.8895650329479428>α=0.05,因此没有理由拒绝原假设。
以上16个数据中,其中只有3个楼盘的均价高于37, 其他13个均低于37, 由正态分布的对称性可知,若37为楼盘的均价的平均水平,则从总体中提取的数据分布在37左右的个数应该大致相等,不应该出现比例失衡,因此37不能作为正态分布的对称中心。
然而若知道某一连续数据总体中心位置的参数(中位数和均值),总体均值的点估计是样本均值,总体中位数的点估计是样本中位数,对于单峰对称分布来说,两者差距不大,而对于非对称分布来说,中位数较均值对总体的中心位置来说,将是更稳健的估计。
由于分布未知,使用参数估计会出现错误,则以上检验用中位数检验较为合理,由此引入非参数检验。
1. 符号检验的基本原理
假设总体分布函数为
F
(
x
)
F(x)
F(x),
M
e
M_e
Me是总体的中位数,对于假设检验问题:
H
0
:
M
e
=
M
0
H
1
:
M
e
≠
M
0
H_0: M_e=M_0 \quad H_1: M_e\neq M_0
H0:Me=M0H1:Me=M0
定义:
S
+
=
c
o
u
n
t
{
X
i
:
X
i
>
M
0
,
i
=
1
,
2
,
.
.
.
,
n
}
S^+=count\{X_i: X_i \gt M_0, i=1,2,...,n\}
S+=count{Xi:Xi>M0,i=1,2,...,n},
S
−
=
c
o
u
n
t
{
X
i
:
X
i
<
M
0
,
i
=
1
,
2
,
.
.
.
,
n
}
S^-=count\{X_i:X_i \lt M_0, i=1,2,...,n\}
S−=count{Xi:Xi<M0,i=1,2,...,n}, 则有
S
+
+
S
−
=
n
,
k
=
m
i
n
(
S
+
,
S
−
)
S^+ + S^-=n, k=min(S^+, S^-)
S++S−=n,k=min(S+,S−)
简单来说,就是遍历样本数据,然后分别记录大于中位数的个数( S + S^+ S+)和小于中位数的个数( S − S^- S−)。那么对每一个样本点来说,要么大于中位数,要么小于中位数(等于的排除),那么就是一个0-1分布问题了。
在原假设情况下,
K
∼
b
(
n
,
0.5
)
K\sim b(n,0.5)
K∼b(n,0.5), 在显著性水平为
α
\alpha
α下的拒绝域为:
2
P
b
i
n
o
m
(
K
≤
k
∣
n
,
p
=
0.5
)
≤
α
2P_{binom}(K\le k|n, p=0.5)\le \alpha
2Pbinom(K≤k∣n,p=0.5)≤α
其中
k
k
k为满足上式最大的
k
k
k值。
使用python计算如下:
import numpy as np
from scipy import stats
data=[36, 32, 31, 25, 28, 36, 40, 32, 41, 26, 35, 35, 32, 87, 33, 35]
data = np.array(data)
k=min(len(data[data>37]), len(data[data<37]))
pval=2*stats.binom.cdf(k, len(data), 0.5)
# 结果:
pval = 0.02127075195312
因为 p v a l = 0.02127075195312 < α = 0.05 pval = 0.02127075195312\lt \alpha=0.05 pval=0.02127075195312<α=0.05,所以拒绝原假设。
这里使用符号检验得到了与使用t检验相反的结论,到底该相信哪个结论?在总体分布未知的情况下,符号检验要优于t检验。
1.1. 符号检验的小结
零假设 | 备择假设 | 检验统计量 | p值 |
---|---|---|---|
M e = M 0 M_e = M_0 Me=M0 | M e > M 0 M_e \gt M_0 Me>M0 | K = S − K=S^- K=S− | p ( K ≤ k ) p(K\le k) p(K≤k) |
M e = M 0 M_e = M_0 Me=M0 | M e < M 0 M_e \lt M_0 Me<M0 | K = S + K=S^+ K=S+ | p ( K ≤ k ) p(K\le k) p(K≤k) |
M e = M 0 M_e = M_0 Me=M0 | M e ≠ M 0 M_e\neq M_0 Me=M0 | K = m i n ( S + , S − ) K=min(S^+, S^-) K=min(S+,S−) | 2 p ( K ≤ k ) 2p(K\le k) 2p(K≤k) |
注: 在实际问题中可能有某一些观察值
x
i
x_i
xi 正好等于
M
0
M_0
M0 , 一般采用的方法是将这
些正好等于
M
0
M_0
M0 的观察值舍去,并相应地减少样本容量的n值.
2. 大样本情况
当样本容量n较大时,根据中心极限定理,且
E
(
S
+
)
=
n
2
,
v
a
r
(
S
+
)
=
n
4
E(S^+)=\frac{n}{2}, var(S^+)=\frac{n}{4}
E(S+)=2n,var(S+)=4n,所以有如下结论:
s
+
−
n
2
n
/
4
∼
N
(
0
,
1
)
\frac{s^+-\frac{n}{2}}{\sqrt{n/4}}\sim N(0,1)
n/4s+−2n∼N(0,1)
因为标准正态分布时连续分布,所以在离散的二项分布近似中,要用连续性修正量,即:
S
+
−
n
2
±
0.5
n
/
4
∼
N
(
0
,
1
)
\frac{S^+-\frac{n}{2} \pm0.5}{\sqrt{n/4}}\sim \ N(0,1)
n/4S+−2n±0.5∼ N(0,1)
上式中,当
S
+
<
n
2
S^+\lt \frac{n}{2}
S+<2n时取加号(+),当
S
+
>
n
2
S^+\gt \frac{n}{2}
S+>2n时取减号(-).
2.1. 大样本情况下的符号检验
零假设 | 备择假设 | 检验统计量 | p值 |
---|---|---|---|
M e = M 0 M_e = M_0 Me=M0 | M e > M 0 M_e \gt M_0 Me>M0 | Z Z Z | p ( Z ≤ z 0 ) p(Z\le z_0) p(Z≤z0) |
M e = M 0 M_e = M_0 Me=M0 | M e < M 0 M_e \lt M_0 Me<M0 | Z Z Z | p ( Z ≤ z 0 ) p(Z\le z_0) p(Z≤z0) |
M e = M 0 M_e = M_0 Me=M0 | M e ≠ M 0 M_e\neq M_0 Me=M0 | Z Z Z | p ( ∥ Z ∥ ≤ ∥ z 0 ∥ ) p(\|Z\|\le\|z_0\|) p(∥Z∥≤∥z0∥) |
例2: 设某化妆品厂商有A和B两个品牌,为了解顾客对A品牌和B品牌在使用上的差异,将A品牌和B品牌同时交给45个顾客使用,一个月后得到如下数据:
- 喜欢A品牌的客户人数:22人
- 喜欢B品牌的客户认识:18人
- 不能区分的人数:5人
解:假设检验问题如下:
H
0
:
P
(
A
)
=
P
(
B
)
H
1
:
P
(
A
)
≠
P
(
B
)
H_0: P(A)=P(B) \quad H_1: P(A)\neq P(B)
H0:P(A)=P(B)H1:P(A)=P(B)
由给定的数据知道:
S
+
=
22
,
S
−
=
18
,
S
+
+
S
−
=
40
S^+ =22, S^- = 18, S^++S^-=40
S+=22,S−=18,S++S−=40
使用python计算如下(使用大样本):
import numpy as np
from scipy import stats
z0=(22-40/2 - 0.5)/(np.sqrt(40)/2)
z0=abs(z0)
Z=stats.norm(loc=0, scale=1)
pval=Z.cdf(z0)+Z.sf(-z0)
# 结果:
pval=0.6352562959972483
因为 p v a l = 0.6352562959972483 < α = 0.05 pval=0.6352562959972483 \lt \alpha=0.05 pval=0.6352562959972483<α=0.05。所以没有理由拒绝原假设。