分布的拟合与检验
在某些统计推断中, 通常假定总体服从一定的分布(例如正态分布),然后在这个分布的基础上,构造相应的统计量,根据统计量的分布做出一些统计推断,而统计量的分布通常依赖于总体的分布假设,也就是说总体所服从的分布在统计推断中至关重要,会影响到结果的可靠性。从这个意义上来说,由样本观测数据去推断总体所服从的分布是非常必要的。这一节的就是根据样本观测数据拟合总体的分布,并进行分布的检验。
下面以
成绩为数据,推断总成绩数据所服从的分布。
在根据样本观测数据对总体所服从的分布做推断时,通常需要借助于描述性统计量和统计图,首先从直观上对分布形式作出判断,然后再进行检验,在前面的分析中,我们已经知道总成绩的数据近似服从正态分布,下面将调用MATLAB函数(chi2gof、jbtest、kstest和lillietest)进行检验。
(1)卡方拟合优度检验
chi2gof 函数用来做分布的卡方拟合优度检验,检验样本是否服从指定的分布。chi2gof函数的原理是:它用若干个小区间把样本观测数据进行分组(默认情况下分成10个小组),使得理论上每组包含5个以上的观测,即每组的理论频数大于或等于5,若不满足这个要求,可以通过合并相邻的组来达到这个要求。
chi2gof函数的调用格式:
<1>h=chi2gof(x)
进行卡方拟合优度检验,检验样本x是否服从正态分布,原假设样本x服从正态分布,其中分布参数由x进行估计。输出参数h等于0或1,若h=0,则在显著性水平0.05下接受原假设,认为x服从正态分布;若为1,则在显著性水平0.05下拒绝原假设。
<2> [h,p]=chi2gof(.....)
返回检验的p值,当p值小于或等于显著性水平时,拒绝原假设,否则接受原假设。
<3> [h,p,stats]=chi2gof(.....)
返回一个结构体变量stats,它包含以下字段:
chi2stat:卡方检验统计量
df : 自由度
edges:合并后各区间的边界向量
O: 落入每个小区间内观测的个数,即时间频数
E: 每个小区间对应的理论频数
%读取文件成绩.xls的第一个工作表中的G2:G52中的数据,即总成绩数据
score=xlsread('成绩.xls','G2:G52');
%去掉总成绩中的0,即缺考数据
score=score(score>0);
%进行卡方拟合优度检验
[h,p,stats]=chi2gof(score)
h =
1
p =
0.0244
stats =
chi2stat: 9.4038
df: 3
edges: [49.0000 68.6000 73.5000 78.4000 83.3000 88.2000 98.0000]
O: [4 10 6 15 4 10]
E: [7.4844 6.9183 8.9423 9.1961 7.5245 8.9344]
由于返回值h=1,p=0.0244<0.05,在显著性水平0.05下,可以认为总成绩不服从正态分布。
<4> [......]=chi2gof(x,name1,val1,name2,val2,.......)
通过可选的成对出现的参数名和参数值来控制初始分组、原假设中的分布、显著性水平等。控制初始分组的参数与参数值如下表:
参数名 参数值 说明
‘nbins’ 正整数,默认值为10 分组(或区间)的个数
‘ctrs’ 向量 指定各区间的重点
‘edges’ 向量 指定各个区间的边界
注意:上述三个参数不能同时指定,一次调用最多只能指定其中的一个参数,因为后两个参数已经潜在的指定了分组数了
%读取文件成绩.xls的第一个工作表中的G2:G52中的数据,即总成绩数据
score=xlsread('成绩.xls','G2:G52');
%去掉总成绩中的0,即缺考数据
score=score(score>0);
%指定各初始小区间的中点
ctrs=[50,60,70,78,85,94];
%指定ctr参数,进行卡方拟合优度检验
[h,p,stats]=chi2gof(score,'ctrs',ctrs)
h =
0
p =
0.3747
stats =
chi2stat: 0.7879
df: 1
edges: [45.0000 74.0000 81.5000 89.5000 98.5000]
O: [15 16 10 8]
E: [15.2451 14.0220 12.3619 7.3710]
通过‘ctrs’参数控制初始分组数为6,利用ctrs向量指定了初始6个初始小区间的中点。检验结果表明通过合并相邻区间,初始的6个小区间最终被合并成4个小区间。返回的h=0,p=0.3747>0.05,认为总成绩服从正态分布,该正态分布的均值可由mean(score)计算出,标准差可由std(score)计算出。
下面通过‘nbins’参数控制初始分组数为6
%读取文件成绩.xls的第一个工作表中的G2:G52中的数据,即总成绩数据
score=xlsread('成绩.xls','G2:G52');
%去掉总成绩中的0,即缺考数据
score=score(score>0);
%指定‘nbins’参数进行卡方拟合优度检验
[h,p,stats]=chi2gof(score,'nbins',6)
h =
0
p =
0.3580
stats =
chi2stat: 0.8449
df: 1
edges: [49.0000 73.5000 81.6667 89.8333 98.0000]
O: [14 17 10 8]
E: [14.4027 15.1752 12.4207 7.0014]
以上两次调用得到的h值相同,但是p值和stats不相同,并且与chi2gof函数第一次调用的时候检验结论相反,这说明了卡方拟合优度检验对分组结果比较敏感,在使用chi2gof函数时,应使得每个分组(小区间)所包含的观测数均在5个以上。
chi2gof函数可以利用以下参数值来控制原假设中的分布
参数名 参数值 说明
‘cdf’ 函数名字字符串、函数句柄、 指定原假设中的分布,与‘expected’参数
由函数字符串(或函数句柄)与函数中 不同同时出现,若为函数名字符串或函数句柄,则x是函数的唯一
所含参数的参数值构成的元胞数组 输入参数;若是由函数名字字符串(或函数句柄)与函数中所含有参数值
构成的元胞数组,则x是函数的第一个输入参数,其他参数为后续输入
‘expected’ 向量 指定各区间的理论频数,与‘cdf’不能同时出现
‘nparams’ 向量 指定分布中待估参数的个数,它确定了卡方分布的自由度
chi2gof函数控制检验的其他方面的参数与参数值列表
参数名 参数值 说明
‘emin’ 非负整数,默认值5 指定一个区间对应的最小理论频数,初始分组中,
理论频数小于这个值的区间和相邻区间合并。如果指定为0,
将不进行区间合并
‘frequency’ 与x等长的向量 指定x中各元素出现的频数
‘alpha’ 0--1之间的数,默认值0.05 指定检验的显著性水平
%读取文件成绩.xls的第一个工作表中的G2:G52中的数据,即总成绩数据
score=xlsread('成绩.xls','G2:G52');
%去掉总成绩中的0,即缺考数据
score=score(score>0);
%求平均值ms和标准差ss
ms=mean(score);
ss=std(score);
%参数'cdf'的值是由函数名字符串与函数中所包含参数的参数值构成的元胞数组
[h1,p1,stats1]=chi2gof(score,'nbins',6,'cdf',{'normcdf',ms,ss})
%参数‘cdf’的值有函数句柄与函数中所包含的参数值构成的元胞数组
[h2,p2,stats2]=chi2gof(score,'nbins',6,'cdf',{@normcdf,ms,ss})
%指定初始分组数为6,检验总成绩数据是否服从参数为ms的泊松分布
[h3,p3,stats3]=chi2gof(score,'nbins',6,'cdf',{@poisscdf,ms})
h1 =
0
p1 =
0.3580
stats1 =
chi2stat: 0.8449
df: 1
edges: [49.0000 73.5000 81.6667 89.8333 98.0000]
O: [14 17 10 8]
E: [14.4027 15.1752 12.4207 7.0014]
h2 =
0
p2 =
0.3580
stats2 =
chi2stat: 0.8449
df: 1
edges: [49.0000 73.5000 81.6667 89.8333 98.0000]
O: [14 17 10 8]
E: [14.4027 15.1752 12.4207 7.0014]
h3 =
0
p3 =
0.4871
stats3 =
chi2stat: 1.4385
df: 2
edges: [49.0000 73.5000 81.6667 89.8333 98.0000]
O: [14 17 10 8]
E: [13.3213 16.9281 12.8698 5.8808]
从检验结果看出,在显著性水平=0.05下,前两个输出显示了检验数据服从N(ms,ss)的正态分布,最后一个输入显示了检验数据服从参数为ms的泊松分布。
故综上各检验结果,在显著性水平0.05下,扔认为成绩数据服从正态分布,其均值为ms,标准差为ss。
(2) Jarque-Bera检验
jbest函数用来做Jarque-Bera检验,检验样本是否服从正态分布,调用该函数时不需要指定分布的均值和方差。由于正态分布的偏度为0,峰值为3,若样本服从正态分布,则样本偏度应接近于0,样本峰度接近于3,基于此,Jarque-Bera检验是利用样本偏度和峰度构造检验统计量。
jbtest函数的调用格式如下:
<1> h=jbtest(x)
检验样本x是否服从均值和方差未知的正态分布,原假设是x服从均值正态分布。当输出h=1时,表示样本在显著性水平=0.05下拒绝原假设;当h=0时,则在显著性水平=0.05下接受原假设。jbtest函数会把x中的NaN(不明确的数值)作为缺失数据忽略。
<2> h=jbtest(x,alpha)
指定显著性水平alpha进行分布的检验,原假设和备择假设同时
<3> [h,p]=jbtest(......)
返回检验的p值,当p小于或等于给定的显著性水平alpha时,拒绝原假设,大于显著性水平时,接受原假设
<4>[h,p,jbstat]=jbtest(.......)
返回检验统计量的观测值jbstat
<5>[h,p,jbstat,critval]=jbtest(.....)
返回检验的临界值critval。当jbstat>=crival时,在显著性水平alpha下拒绝原假设
<6> [h,p,......]=jbtest(x,alpha,mctol)
指定一个终止容限mctol,利用蒙特卡洛模拟方法计算p值的近似值
注意:jbtest函数只是基于样本偏度和峰度进行正态性检验,结果受异常值的影响比较大,可能会出现比较大的偏差。
例:
randn('seed',0); %指定随机数生成器的初始种子为0
x=randn(10000,1); %生成10000个服从标准正态分布的随机数
h=jbtest(x) %调用jbtest函数进行正态性检验
x(end)=5;
h1=jbtest(x)
h =
0
h1 =
1
从以上结果可以发现,对于一个包含10000个元素的标准正态分布的随机数向量,指改变它的最后一个元素,就会导致检验的结论完全相反,这就充分说明了jbtest函数的局限性,受异常值的影响比较大。
下面调用jbtest函数对成绩数据进行正态性检验
%读取文件成绩.xls的第一个工作表中的G2:G52中的数据,即总成绩数据
score=xlsread('成绩.xls','G2:G52');
%去掉总成绩中的0,即缺考数据
score=score(score>0);
[h,p]=jbtest(score)
h =
1
p =
0.0193
由于返回值h=1,p<0.05,所以在显著性水平0.05下拒绝了原假设,认为总成绩数据不服从正态分布。不过由于jbtest函数的局限性,这个结论仅作为参考,还应结合其他函数的检验结果做出综合的推断。
(3)单样本的Kolmogorov-Smirnov(K-S)检验
kstest函数用来做单样本的K-S检验:它可以作双侧检验,检验样本是否服从指定的分布;也可做单侧检验,检验样本的分布函数是否在指定的分布函数之上或之下,这里的分布是完全确定的,不含有未知参数。kstest函数根据样本的经验分布函数Fn(x)和指定的分布函数G(x)构造检验统计量
KS=max(|Fn(x)-G(x)|)
kstest函数的调用格式如下:
<1> h=kstest(x)
检验样本x是否服从标准正态分布,原假设是x服从标准正态分布,备择假设是x不服从标准正态分布。当输出h=1时,在显著性水平=0.05下拒绝原假设;当h=0时,则在显著性水平=0.05下接受原假设
<2>h=kstest(x,CDF)
检验样本x是否服从由CDF定义的连续分布,这里的CDF可以是包含两列元素的矩阵,也可以是也可是是概率分布对象。当CDF是包含两列元素的矩阵时,它的第一列表示随机变量的可能取值,可以是样本x中的值,也可以不是。CDF的第二列是指定分布函数的取值,如果CDF为空,则建议样本x是否服从标准的正态分布。
<3> h=kstest(x,CDF,alpha)
指定检验的显著性水平alpha,默认值是0.05
<4>h=kstest(x,CDF,alpha,type)
用type参数指定检验的类型(双侧或单侧)。type参数的可能取值为
‘unequal’:双侧检验,备择假设是总体分布函数不等于指定的分布函数
'larger':单侧检验,备择假设是总体分布函数大于指定的分布函数
‘smaller’:单侧检验,备择假设是总体分布函数小于指定的分布函数
<5> [h,p,ksstat,cv]=kstest(......)
返回检验的p值、检验统计量和观测值ksstat和邻界值cv
例:调用kstest函数检验总成绩是否服从正态分布
%读取文件成绩.xls的第一个工作表中的G2:G52中的数据,即总成绩数据
score=xlsread('成绩.xls','G2:G52');
%去掉总成绩中的0,即缺考数据
score=score(score>0);
%首先调用kstest检验是否服从标准的正态分布
h=kstest(score)
%然后检验是否服从均值为ms,标准差为ss的正态分布
ms=mean(score);
ss=std(score);
%生成cdf矩阵,用来指定分布:均值为ms,标准差ss的正态分布
%cdf的第二列是指定分布函数的取值,由累积正态分布函数normcdf来确定
cdf=[score,normcdf(score,ms,ss)];
%调用kstest函数,检验总成绩是否服从由cdf指定的分布
[h1,p,ksstat,cv]=kstest(score,cdf)
h =
1
h1 =
0
p =
0.5486
ksstat =
0.1107
cv =
0.1903
由于h=1,所以在显著性水平0.05下,拒绝原假设(x服从标准的正态分布);h1=0,所以在显著性水平=0.05下,接受原假设,认为总成绩数据服从均值为ms、标准差为ss的正态分布。
(4)双样本的K-S检验
kstest2函数用来做两个样本的K-S检验,它可以作双侧检验,检验两样本是否服从相同的分布,也可以作单侧检验,检验一个样本的分布函数是否在另一个样本的分布函数之上或之下,这里的分布函数是完全确定的,不含未知数。kstest2函数对比两样本的经验分布函数,构造检验统计量
KS=max(|F1(x)-F2(x)|)
其中F1(x)和F2(x)分别为两样本的经验分布函数。
kstest2函数的调用格式如下:
<1>h=kstest2(x1,x2)
检验样本x1和x2是否具有相同的分布,原假设是x1与x2来自相同的连续分布,备择假设是来自不同的连续分布。当输出h=1时,在显著性水平=0。05下拒绝原假设;当h=0时,则在显著性水平=0.05下接受原假设。这里并不要求x1与x2具有相同的长度。
<2>h=kstest2(x1,x2,alpha)
指定检验的显著性水平alpha,默认是0.05
<3>h=kstest2(x1,x2,alpha,type)
用type参数指定检验的类型(双侧或单侧)。type参数的可能取值为
‘unequal’:双侧检验,备择假设是两个总体的分布函数不相等
‘larger’ :单侧检验,备择假设是第1个总体的分布函数大于第二个总体的分布函数
‘smaller’:单侧检验,备择假设是第1个总体的分布函数小于第二个总体的分布函数
<4>[h,p]=kstest2(.....)
返回检验的渐近p值,当p小于或等于显著性水平alpha时,拒绝原假设。样本容量越大,p值越精确,同样要求
(n1*n2)/(n1+n2)>=4
其中,n1,n2分别为样本x1和x2的样本容量。
<5>[h,p,ks2stat]=kstest2(......)
返回检验统计量的观测值ks2stat
例:
对成绩.xls中的数据,调用kstest2函数检验班级60101和班级60102两个班级的总成绩是否服从相同的分布。
%读取文件成绩.xls的第一个工作表中的班级数据即B2:B52
banji=xlsread('成绩.xls','B2:B52');
%读取文件中的第一个工作表中的总成绩数据,即G2:G52
score=xlsread('成绩.xls','G2:G52');
%去除缺考成绩
banji=banji(score>0);
score=score(score>0);
%分别提取60101和60102班的总成绩
score1=score(banji==60101);
score2=score(banji==60102);
%调用kstest2函数检验两个班级的总成绩是否服从相同的分布
[h,p,ks2stat]=kstest2(score1,score2)
h =
0
p =
0.7597
ks2stat =
0.1839
由于h=0,p>0.05,所以在显著性水平0.05下,接受原假设,认为两个班级的总成绩服从相同的分布。
(5)Lillefors检验
当总体均值和方差未知时,Lilliefor(1967年)提出了用样本均值和标准差代替总体的均值和标准差,然后使用K-S检验,这就是所谓的Lilliefors检验。
lillietest函数用来做Lilliefors检验,检验样本是否服从指定的分布,这里分布的参数都是未知的,根据样本数据做出估计,可用的分布有正态分布,指数分布,和极值分布。
lilltest函数的调用格式如下:
<1> h=lillietest(x)
检验样本x是否服从均值和方差未知的正态分布,原假设是x服从正态分布。当输出h=1时,表示在显著性水平=0.05下拒绝原假设;当h=0时,则在显著性水平=0.05下接受原假设,lillietest函数会把x中的NaN(不明确的数值)作为缺失数据忽略
<2>h=lillietest(x,alpha)
指定显著性水平alpha进行分布的检验,原假设和备择假设同上。
<3> h=lillietest(x,alpha,distr)
检验样本x是否服从参数distr指定的分布,distr为字符串变量,可能的取值为'norm'(正态分布,默认情况),‘exp’(指数分布),‘ev’(极值分布)
<4>[h,p]=lillietest(......)
返回检验的p值,当p小于或等于给定的显著性水平alpha时,拒绝原假设,大于显著性水平,接受原假设
<5>[h,p,kstat]=lillietest(........)
返回检验统计量的观测值kstat
<6>[h,p,kstat,critval]=lillietest(.....)
返回检验的临界值critval。当kstat>=critval时,在显著性水平alpha下拒绝原假设
<7>[h,p,....]=lillietest(x,alpha,distr,mctol)
指定一个终止容限mctol,直接利用蒙特卡洛模拟法计算p值
例:利用lillietest函数对总成绩数据进行正态性检验
%读取文件中的第一个工作表中的总成绩数据,即G2:G52
score=xlsread('成绩.xls','G2:G52');
score=score(score>0);
%调用lillietest函数进行Lilliefors检验,检验总成绩是否服从正态分布
[h,p]=lillietest(score)
%调用lillietest函数检验总成绩是否服从整数分布
[h1,p1]=lillietest(score,0.05,'exp')
h =
0
p =
0.1346
h1 =
1
p1 =
1.0000e-03
由于h=0,所以在显著性水平0.05下接受原假设,认为总成绩服从正态分布,由于Lilliefors检验用样本均值和样本标准差代替总体均值和标准差,因此正态分布的均值为mean(score),标准差为std(score);h1=1,所以在显著性水平0.05下,拒绝原假设,认为总成绩数据不服从指数分布。
(6)最终结论
通过前面分别用chi2gof、jbtest、kstest、kstest2、lillietest函数进行检验,只有jbtest函数的检验结果认为总成绩数据不符合正态分布,其他都符号正态分布,但由于jbtest函数的局限性(结果受异常值影响较大),所以可以认为总成绩数据服从正态分布,其均值为mean(score),标准差为std(score)