非参数检验是相对于参数检验而言的。如果总体分布为已知的数学形式,对其总体参数作假设检验称为参数检验。如对服从正态分布的计量资料的总体均数作假设检验的t检验和F检验就是参数检验。
对于计量资料,不满足参数检验条件的假设检验方法,可以尝试变量变换使其满足参数检验条件,或是使用非参数检验,对于等级资料,常用非参数检验。
非参数检验对总体分布不作严格假定,又称任意分布检验,它直接对总体分布作假设检验。这里介绍常用的秩转换的非参数检验,是推断一个总体表达分布位置的中位数M和已知𝑀0、两个或多个总体的分布是否有差别。
秩转换的非参数检验是将数值变量从小到大、等级资料从弱到强或从强到弱转换成秩后,再计算检验统计量,其特点是假设检验的结果对总体分布的形状差别不敏感,只对总体分布的位置差别敏感。由于秩统计量的分布与原数据总体分布类型无关,具有较好的稳健性,可以用于任何分布类型的资料。
使用秩转换的非参数检验的情形:
不满足正态和方差齐性条件的计量资料。
分布不知是否正态的小样本资料。
一端或两端不确定数值的资料。
等级资料。
如果已知计量资料满足t检验或F检验条件,应选t检验或F检验。如果选秩转换的非参数检验,会降低检验效能。
秩和检验方法最早由Wilcoxon提出,叫Wilcoxon两样本检验法。后来Mann-Whitney将其应用到两样本容量不等的情况,因而又称为Mann-Whitney U检验。
一、配对样本比较的Wilcoxon符号秩检验(Wilcoxon signed-rank test)
Wilcoxon符号秩检验,又称符号秩和检验,用于配对样本差值的中位数和0的比较。还可用于单个样本中位数和总体中位数比较。
案例:
采用配对设计,用两种饲料喂8对大鼠后,测得其肝中维生素A的含量如下。问不同饲料大鼠肝中维生素A的含量有无差别?
编号 | 正常饲料组 | 维生素E缺乏饲料组 |
1 | 3.55 | 2.45 |
2 | 2.00 | 2.40 |
3 | 3.00 | 1.80 |
4 | 3.95 | 3.20 |
5 | 3.80 | 3.25 |
6 | 3.75 | 2.70 |
7 | 3.45 | 2.50 |
8 | 3.05 | 1.75 |
from scipy import stats
import numpy as np
# 导入数据
data1=np.array([3.55,2.0,3.0,3.95,3.8,3.75,3.45,3.05])
data2=np.array([2.45,2.40,1.80,3.20,3.25,2.70,2.50,1.75])
# 计算两组数据之差
sub=data1-data2
# 对差值进行正态性检验
stats.shapiro(sub)
# Wilcoxon符号秩检验
# stats.wilcoxon()用于检验两个配对样本来自同一分布的原假设。
stats.wilcoxon(data1,data2)
二、两个独立样本比较的Wilcoxon秩和检验(Wilcoxon rank sum test)
Wilcoxon秩和检验用于推断计量资料或等级资料的两个独立样本所来自的两个总体分布是否有差别。
案例
对10例肺癌患者和12例硅沉着0期工人用X线检查测量肺门横径右侧距(RD值),结果如下,问肺癌患者的RD值是否高于硅沉着病0期工人的RD值?
肺癌患者RD值 | 硅沉着0期病人RD值 |
2.78 | 3.23 |
3.23 | 3.50 |
4.20 | 4.04 |
4.87 | 4.15 |
5.12 | 4.28 |
6.21 | 4.34 |
7.18 | 4.47 |
8.05 | 4.64 |
8.56 | 4.75 |
9.60 | 4.82 |
4.95 | |
5.10 |
# 输入数据
data1=np.array([2.78,3.23,4.20,4.87,5.12,6.21,7.18,8.05,8.56,9.60])
data2=np.array([3.23,3.50,4.04,4.15,4.28,4.34,4.47,4.64,4.75,4.82,4.95,5.10])
# levene方差齐性检验
stats.levene(data1,data2)
# Wilcoxon秩和检验
stats.ranksums(data1,data2,alternative='greater')
Mann-Whitney U 检验
用于两独立样本的比较,适用情形同Wilcoxon秩和检验。
# Mann-Whitney U检验
stats.mannwhitneyu(data1,data2,alternative='greater')
三、完全随机设计多个样本比较的Kruskal-Wallis H检验
Kruskal-Wallis H检验用于推断计量资料或等级资料的多个独立样本所来自的多个总体分布是否有差别。
原始数据的多个样本比较
案例
比较小白鼠接种三种不同菌型伤寒杆菌9D、11X和DSC1后存活天数,结果如下。问小白鼠接种三种不同菌型伤寒杆菌的存活天数有无差别?
9D | 11C | DSC1 |
2 | 5 | 3 |
2 | 5 | 5 |
2 | 6 | 6 |
3 | 6 | 6 |
4 | 6 | 6 |
4 | 7 | 7 |
4 | 8 | 7 |
5 | 10 | 9 |
7 | 12 | 10 |
7 | 11 | |
11 |
data1=np.array([2,2,2,3,4,4,4,5,7,7])
data2=np.array([5,5,6,6,6,7,8,10,12])
data3=np.array([3,5,6,6,6,7,7,9,10,11,11])
stats.kruskal(data1,data2,data3)
频数表资料和等级资料的多个样本比较
某医院用三种方案治疗急性无黄疸型病毒肝炎254例,观察结果如下,问三种方案的疗效有无差别?
疗效 | 西药组 | 中药组 | 中西医结合组 |
无效 | 49 | 45 | 15 |
好转 | 31 | 9 | 28 |
显效 | 5 | 22 | 11 |
痊愈 | 15 | 4 | 20 |
data1=np.array(([1]*49+[2]*31+[3]*5+[4]*15))
data2=np.array(([1]*45+[2]*9+[3]*22+[4]*4))
data3=np.array(([1]*15+[2]*28+[3]*11+[4]*20))
stats.kruskal(data1,data2,data3)