非参数统计(nonparametric statistics)是相对于参数统计而言的一个统计学分支,是数理统计的重要内容。在参数统计中,我们往往碰到的是这样的情况:
然而实际情况往往不是这样,我们通常不知道总体分布的数学形式,或者虽然已知总体的分布但却不能用有限个参数去刻画,我们只能对总体做出一些简单的假定(例如总体分布是连续的或者离散的,总体分布是否对称),这时如果我们要对总体的某些性质进行估计或者假设检验,就需要使用非参数方法。
非参数方法是一种不依赖于总体分布具体形式的统计推断方法,构造统计量通常与总体分布无关,也就是说,非参数方法与总体分布无关,因此,非参数方法也被称为自由分布(distribution-free)方法。非参数方法具有如下的特点:
由以上的特点,我们可以总结出选用参数方法和非参数方法的原则:
接下来我们来详细讨论一些非参数方法的例子。
Wilcoxon符号秩检验(signed-rank test)对应着参数方法中的单样本t检验法和配对样本t检验法。接下来我们通过一个例子来讲解Wilcoxon符号秩检验的步骤。
假设我们研究的课题是上培训班是否会提升学生成绩,我们收集到的数据如下:
Before | After |
---|---|
72 | 60 |
62 | 86 |
70 | 83 |
60 | 53 |
75 | 75 |
55 | 65 |
71 | 89 |
48 | 56 |
根据这一张表格,我们可以进一步得到这样的另一张表格。
Diff | Signed-rank |
---|---|
-12 | -4 |
24 | 7 |
13 | 5 |
-7 | -1 |
0 | |
10 | 3 |
18 | 6 |
8 | 2 |
其中,Diff是拿右边一列减去左边一列得到的数据,而得到Signed-rank略显复杂,首先我们将Diff的绝对值从小到大进行排名(rank),分别编上1-n的编号,然后根据Diff的实际符号,给排名也添加上相同的符号,我们就得到了样本的符号秩(signed-rank),我们就由符号秩来构造统计量。
需要注意的是,我们进行Wilcoxon符号秩检验时,不考虑Diff=0的情况,我们要将Diff=0的数据去除。
接下来我们用符号秩来构造统计量 Z Z Z: Z = ∑ i = 1 n S R i ∑ i = 1 n S R i 2 Z = \frac{\sum^n_{i=1}SR_i}{\sqrt{\sum^n_{i=1}SR_i^2}} Z=∑i=1nSRi2∑i=1nSRi
与参数方法中的 Z Z Z统计量一样, Z Z Z~ N ( 0 , 1 ) N(0,1) N(0,1),于是我们算得 Z Z Z统计量之后,就可以通过标准正态分布来计算p值,在上面这个例子中: Z = 1.52 Z=1.52 Z=1.52
我们进行一个双尾检验,查表可得 p − v a l u e = 2 ∗ ( 1 − 0.9357 ) = 0.1286 > 0.05 p-value=2*(1-0.9357)=0.1286>0.05 p−value=2∗(1−0.9357)=0.1286>0.05
得出结论:应当接受零假设,成绩与是否上辅导班无关。
Wilcoxon秩和检验(rank-sum test)用于检验两个总体的中位数是否相等,适用于中位数能更好的反应总体集中趋势的情况,对应了参数方法中的Two sample t-test,同样我们通过一个例子来讲解Wilcoxon秩和检验的过程。
我们仍然使用上面的表格,只不过我们这次研究的题目是成绩是否与性别有关。(实际上,两列数据的样本容量可以不同)可以发现,这样一来,数据中的行不再是一一对应关系。
Male | Female |
---|---|
72 | 60 |
62 | 86 |
70 | 83 |
60 | 53 |
75 | 75 |
55 | 65 |
71 | 89 |
48 | 56 |
我们将两列数据合在一起,进行从小到大的排序,求出它们的秩(秩的英文为rank,也可以翻译为排名)。
Rank(Male) | Rank(Female) |
---|---|
11 | 5.5 |
7 | 14 |
9 | 13 |
5.5 | 2 |
12.5 | 12.5 |
3 | 8 |
10 | 15 |
1 | 4 |
需要注意的是,当出现多个样本值相同时,它们的秩应当等于它们占用的秩的位置的平均值。接下来我们来构造统计量,首先我们将每一列元素的秩进行求和:
S u m 1 = ∑ i n 1 R 1 Sum1 = \sum_i^{n_1}{R_1} Sum1=i∑n1R1 S u m 2 = ∑ i n 2 R 2 Sum2 = \sum_i^{n_2}{R_2} Sum2=i∑n2R2
设两个变量的样本容量分别是 n 1 n_1 n1, n 2 n_2 n2,我们构造下面的统计量:
W = S u m 1 − n 1 ∗ ( n 1 + 1 ) 2 W=Sum1 - \frac{n_1*(n_1+1)}{2} W=Sum1−2n1∗(n1+1)
同样的,利用 S u m 2 Sum2 Sum2也可以构造一个这样的统计量,但实际上检验一个即可。我们同样避开直接寻找 W W W的分布,我们选择再构造一个统计量:
Z = W − n 1 n 2 / 2 n 1 n 2 ( n 1 + n 2 + 1 ) / 12 Z=\frac{W-n_1n_2/2}{\sqrt{n_1n_2(n_1+n_2+1)/12}} Z=n1n2(n1+n2+1)/12W−n1n2/2
同样的, Z Z Z~ N ( 0 , 1 ) N(0,1) N(0,1),接下来我们就可以在标准正态分布中查找到 P − v a l u e P-value P−value,从而做出是否拒绝零假设的判断。
在上面这个例子中,我们计算得到:
W = 23 W=23 W=23 Z = − 0.945 Z=-0.945 Z=−0.945
查表得到对应的p值为:
p − v a l u e = 2 ∗ ( 1 − 0.8289 ) = 0.3422 > 0.05 p-value=2*(1-0.8289)=0.3422>0.05 p−value=2∗(1−0.8289)=0.3422>0.05所以我们应当接受零假设,成绩与性别无关。
在参数统计中,我们学习过一个相关系数 ρ x y \rho_{xy} ρxy,它的定义如下: ρ x y = C o v ( X , Y ) S X S Y \rho_{xy}=\frac{Cov(X,Y)}{S_XS_Y} ρxy=SXSYCov(X,Y)实际上,我们把这个相关系数称为皮尔逊相关系数(Pearson Correlation),而接下来我要介绍的是另一个相关系数,称为斯皮尔曼相关系数(Spearman Correlation)。
首先举一个例子,假设我们研究的课题是学生考试分数与课堂满意度是否相关,我们采集到了这样一组数据:
Score | Happiness |
---|---|
30 | 不满意 |
40 | 一般 |
50 | 不满意 |
60 | 一般 |
70 | 满意 |
80 | 满意 |
90 | 满意 |
100 | 满意 |
可以看到,这里的Happiness数据是定序变量,我们没有办法计算它的方差和它与定距变量的协方差,但我们可以对它们进行排序,参考前两种方法,我们这两列数据分别排序并求出它们的秩。
Rank(Score) | Rank(Happiness) |
---|---|
1 | 1.5 |
2 | 3.5 |
3 | 1.5 |
4 | 3.5 |
5 | 6.5 |
6 | 6.5 |
7 | 6.5 |
8 | 6.5 |
同样的,对于相同的样本值,我们也要采用取平均值的方法求它们的秩。接下来我们对这两列秩求它们的皮尔逊相关系数,得到的就是原数据的斯皮尔曼相关系数:
ρ = C o v ( R 1 , R 2 ) S R 1 S R 2 \rho=\frac{Cov(R_1,R_2)}{S_{R_1}S_{R_2}} ρ=SR1SR2Cov(R1,R2)另外还有一个简便计算公式,设样本容量为 n n n:
ρ = 1 − 6 ∑ d i 2 n ( n 2 − 1 ) \rho=1-\frac{6\sum{d_i^2}}{n(n^2-1)} ρ=1−n(n2−1)6∑di2然后,与参数方法中的皮尔逊相关性检验类似,有:
ρ 1 − ρ 2 / n − 2 ∼ t ( n − 2 ) \frac{\rho}{\sqrt{1-\rho^2}/\sqrt{n-2}}\sim t(n-2) 1−ρ2/n−2ρ∼t(n−2)
然后在 t t t分布中计算 p − v a l u e p-value p−value,做出判断。
Bootstrap简单的来说,我们已有一个容量为 n n n的原始样本,利用随机数等方式进行放回抽样得到一个容量同样为 n n n的样本,这种样本就称为Bootstrap样本或自助样本。
我们反复地、独立地从原始样本中抽取很多很多个Bootstrap样本(通常不少于1000个),利用这些样本对总体进行统计推断,这种方法被称为非参数Bootstrap方法,又称为自助法。
我们使用成绩与性别关系的数据:
Male | Female |
---|---|
72 | 60 |
62 | 86 |
70 | 83 |
60 | 53 |
75 | 75 |
55 | 65 |
71 | 89 |
48 | 56 |
我们对两列数据进行有放回抽样,得到了1000个Bootstrap样本,记作 D 1 D_1 D1- D 1000 D_{1000} D1000。我们需要分析的是两个样本之间的中位数是否有差异,因此我们将每一个Bootstrap样本的中位数差值求出来,用这1000个数据的中位数差构成一个统计分布,用直方图表示:
然后我们再根据已知的中位数差值,在这个统计分布中计算p值、置信区间等,做出统计推断。
Bootstrap是一种非常重要的方法,常常应用于各种玄学建模 。需要注意的是Bootstrap方法也有参数版本的方法,在这里并不讨论。
Bootstrap实现的Python代码如下:
# -*- coding: UTF-8 -*-
import numpy as np
import matplotlib.pyplot as plt
def bootstrap(data):
temp = []
while len(temp) != len(data):
r = np.random.randint(0,len(data))
temp.append(data[r])
temp = np.array(temp)
return temp
if __name__ == "__main__":
male = np.array([72,62,70,60,75,55,71,48])
female = np.array([60,86,83,53,75,65,89,56])
v = []
for i in range(2000):
mbootstrap = bootstrap(male)
fbootstrap = bootstrap(female)
v.append(np.median(mbootstrap) - np.median(fbootstrap))
v = np.array(v)
plt.hist(v,bins=50)
plt.show()
Permutation,翻译为中文就是排列、置换的意思。在参数方法中进行假设检验,我们一般是假设或者已知总体的分布,然后构造统计量,得到这个统计量在零假设为真时的抽样分布,然后在抽样分布中计算p值,做出推断。而Permutation使得我们可以得到对任意统计量在零假设为真时的抽样分布,从而进行统计推断。接下来我们举例说明Permutation的过程。
我们仍然使用成绩与性别的关系数据:
Male | Female |
---|---|
72 | 60 |
62 | 86 |
70 | 83 |
60 | 53 |
75 | 75 |
55 | 65 |
71 | 89 |
48 | 56 |
H 0 : 男 女 成 绩 中 位 数 没 有 差 异 H_0:男女成绩中位数没有差异 H0:男女成绩中位数没有差异 H 1 : 男 女 成 绩 中 位 数 有 差 异 H_1:男女成绩中位数有差异 H1:男女成绩中位数有差异
Permutation与Bootstrap类似,我们也需要将以下的步骤重复1000次以上:
重复1000次以上之后,我们就可以得到两组数据中位数差的近似分布,用直方图表示:
这样我们就获得了中位数差统计量的统计分布,然后我们根据这个分布和实际的中位数差,我们就可以计算出p值,从而进行统计推断。
Permutation的Python代码如下:
# -*- coding: UTF-8 -*-
import numpy as np
import matplotlib.pyplot as plt
def permutation(data):
perm = []
num = set([])
while len(perm) != len(data):
r = np.random.randint(0, 16)
if r not in num:
perm.append(data[r])
num.add(r)
perm = np.array(perm)
return perm
if __name__ == "__main__":
data = np.array([72, 62, 70, 60, 75, 55, 71, 48, 60, 86, 83, 53, 75, 65, 89, 56])
diff = []
for i in range(3000):
temp = permutation(data)
df = np.median(temp[:8]) - np.median(temp[8:])
diff.append(df)
diff = np.array(diff)
plt.hist(diff, bins=50)
plt.show()
在这一篇博文中,我主要介绍以下几种非参数统计方法:
但无论是参数方法还是非参数方法都属于频率论的范畴,它们都存在着一个致命的缺陷:它们的检验过程是在假定零假设成立的情况下进行的,为了解决这个问题,需要把目光投向另一个统计学领域——贝叶斯统计。