本文是为KS检验的学习者打造,旨在运用,如有谬误,还烦请联系本人修改
本文只针对连续的一维概率分布的KS检验
KS检验是一种非参数检验,常用于判断样本与预先给定的分布是否一致,或两个样本的概率分布是否不同。换言之,就是观测得到的样本,声称其服从某一分布是否可信。 经验分布(累积概率)函数:
对于 n 个样本 X_1,X_2,...,X_n ,其经验分布函数为 F_n(x)= \begin{cases}0&&x<X_{(1)}\\ \frac{k}{n}&&X_{(k)}\le x< X_{(k+1)}\\ 1&&x\ge X_{(n)} \end{cases}
单样本Kolmogorov-Smirnov检验
假设检验的问题如下: H_0:样本来自的总体服从某分布\\ H_1:样本来自的总体不服从某分布
F_n(x) 为待检验分布的分布函数,Kolmogorov–Smirnov统计量为: D=\max{|F_n(x)-F_0(x)|} ,
这其实代表着样本所属总体的分布与给定分布之间的 \color {red}{\text{距离}} 。显然,当两分布相近的时候,距离自然就非常小,这个统计量就是描述的距离的最大值,然后与KS检验D统计量的临界值作比较.
注意 H_0 的拒绝域为 D>D_{n,\alpha } 。
\text{Kolmogorov–Smirnov} D 临界值(单一样本)

Kolmogorov–Smirnov D 临界值(单一样本)
举个栗子:
例题1.1
\mathbf Q: 给定10个散点,这些散点是否均匀分布于 (0,5)\begin{array} \\ \hline x & 0.6&1.1&1.6&2.2&2.4&2.9&3.4&4.0&4.3&4.8 \\ F_0(x) & 0.1&0.2&0.3&0.4&0.5&0.6&0.7&0.8&0.9&1.0 \\ \hline \end{array}\\

可以预见有些误差并不一定出现在 F_n(x_i)\&F_0(x_{i}) 之间,还有可能出现在 F_n(x_i)\&F_0(x_{i-1}) 之间,因此在运用KS检验的时候,通常同时考虑后者,因此通常我们用的是这个统计量 D=\max(\delta _k) ,其中: d_{k_1}={|F_n(x_{(k)})-F_0(x_{(k)})|},d_{k_2}={|F_n(x_{(k)})-F_0(x_{(k-1)})|},\\\delta_k=\max(d_{k_1},d_{k_2})
H_0:x服从(0,5)上的均匀分布\\ H_1:x不服从如上分布
这道题的给定累积分布为 F_0(x)=\frac{x}{5} 因此这道例题的KS检验方法如下,列出表格:
注意:
F_{n}(x_{(k)}) 代表的是 实际 累计分布,用这个数据点累计点数除以总数即 F_n(x)=\frac{N}{n} ,比方说 2.2 那一行,到这个数据点已经累计有4个数据点了,因此 F_{n}(x_{(k)})=4/10=0.4
F_{0}(x_{(k)}) 代表的是 待验证 的累积分布,比方说这里是验证均匀分布,就要\color{fuchsia}{用均匀分布的CDF函数} 代入数值点计算,如2.2这一行, F_{0}(x_{(k)})=2.2/5=0.44
\begin{array}{c} \\ \hline x_{(k)}&F_0(x_{(k)})&F_n(x_{(k)})&|F_n(x_{(k)})-F_0(x_{(k)})|&|F_n(x_{(k)})-F_0(x_{(k-1)})|&\delta_k\\ \hline 0.6&0.12&\color{fuchsia}{0.1}&0.02&0.12&0.12\\ 1.1&\color{fuchsia}{0.22}&0.2&0.02&\color{fuchsia}{0.12}&0.12\\ 1.6&0.32&\color{cyan}{0.3}&0.02&0.12&0.12\\ 2.2&\color{cyan}{0.44}&0.4&0.04&\color{cyan}{0.14}&0.14\\ 2.4&0.48&\color{lime}{0.5}&0.02&0.08&0.08\\ 2.9&\color{lime}{0.58}&0.6&0.02&\color{lime}{0.08}&0.08\\ 3.4&0.68&0.7&0.02&0.08&0.08\\ 4.0&0.80&0.8&0&0.1&0.1\\ 4.3&0.86&0.9&0.04&0.06&0.06\\ 4.8&0.96&1.0&0.04&0.06&0.06 \\ \hline \end{array}\\
计算方面,其实这里就是算出第二第三列的距离之后,再求同样颜色位置的数值相减,观测累积分布最顶上的0.12直接减0.
目测得知 D=\max(\delta_k)=0.14<D_{10,0.05}=0.410 ,因此接受 H_0 ,即认为 x 服从 (0,5) 上的均匀分布.
用R检验一下, \text{ks.test} 的第二个参数填入待验证的分布类型,比如说 " \text{punif} "均匀分布,“pnorm”正态分布等等
> x = c(0.6,1.1,1.6,2.2,2.4,2.9,3.4,4.0,4.3,4.8)
> ks.test(x,"punif",0,5)
One-sample Kolmogorov-Smirnov test
data: x
D = 0.14, p-value = 0.9744
alternative hypothesis: two-sided
D值是一样的;p值大于0.05,不拒绝 H_0 ,认为数据服从(0,5)上的均匀分布。
例题1.2:使用 \text{Kolmogorov-Smirnov} 进行正态性检验。
注明:使用KS检验时不进行参数的估计,因为他是“非参数”检验 \mathbf Q: 给定下列数据,试问其是否服从 \mu=209;\sigma =6.5 的正态分布?
\begin{array} \\ \hline 190& 193& 194& 196& 197& 198& 199&199&200& 200&\\ 201&201&201& 202&202&202&202&202& 203&203\\203&203&203& 204&204&204&204&205& 206&206&\\206&206&206&206&206&206&206&206&206&206\\ 207&207&207&207&207&207&207& 208&208&208\\208&208&208&208&208&208&208&208&208&208\\208& 209&209&209&209&209&209&209& 210&210&\\ 211&211&211&211&211&211&211&211&211&211\\211&211& 212&212& 213&213&213&213&213&213\\213&213& 214&214&214&214&214&214&214& 216\\216&216&216&216&216&216& 217& 218&218&218\\218& 219&219&219& 221&221& 222& 223& 224& 226& \\ \hline \end{array}\\
题目给的数据一般是没排序的,需要自己排序。整理成表格。 H_0:X\sim N(209,6.5^2 ) \\ H_1:X不服从如上分布
先查表: \alpha=0.05 ; n=120;D_{120,0.05}\approx \frac{1.36}{\sqrt{120}}\approx0.1241 ,
即 H_0 的拒绝域 D>D_{120,0.05}=0.1241 ,跟上一题一样:
d_{k_1}={|F_n(x_{(k)})-F_0(x_{(k)})|},d_{k_2}={|F_n(x_{(k)})-F_0(x_{(k-1)})|},\\\delta_k=\max(d_{k_1},d_{k_2}),D=\max(\delta _k)
不过正态性检验这里, F_n(x)=\frac{N}{n} ,其中 N 为累计次数, n=120 一共120个数字。列个表就很清楚了,如下图(知乎只能用矩阵的环境制表,我就懒得一个个制了,直接上图了)

这里面有一个标准化,也就是 x'=\frac{x-\mu}{\sigma},\mu=209,\sigma=6.5 ,因为要根据这个查表得知他的 \color{red}{给定分布下的} 累积分布 F_0(x) ,如果你不需要手算,在excel里面有现成的函数 =\text{NORM.DIST(x,mean,sd,TRUE)} 其中 \text{mean,sd} 就是 \mu,\sigma
之后就如法炮制,求 间距D的最大值,也就是最后一列的最大值 \max(\delta_{(k)})=0.08887<D_{120,0.05}=0.1241 ,因此接受 H_0
正态性检验的步骤就是:
- 写出假设,查表得到 H_0 的拒绝域
- 排序,注意有结点的重复数字,记录其结点长度
- 求和得到累计次数
- 根据给出的参数求出标准化之后的值,据此求得理论的累积分布(或者说给定的累积分布)
- 求间距的最大值。 d_{k_1}={|F_n(x_{(k)})-F_0(x_{(k)})|},d_{k_2}={|F_n(x_{(k)})-F_0(x_{(k-1)})|},\\\delta_k=\max(d_{k_1},d_{k_2}),D=\max(\delta _k)
- 与临界值作比较判断是否落入拒绝域。
\color{purple}{R的实现及结果}
------------------------------------------------
| 单样本K-S Test |
------------------------------------------------
>x<-c(190,193,194,196,197,198,199,199,200,200,201,201,201,202,202,202,202,202,203,203,203,203,203,204,204,204,204,205,206,206,206,206,206,206,206,206,206,206,206,206,207,207,207,207,207,207,207,208,208,208,208,208,208,208,208,208,208,208,208,208,208,209,209,209,209,209,209,209,210,210,211,211,211,211,211,211,211,211,211,211,211,211,212,212,213,213,213213,213,213,213,213,214,214,214,214,214,214,214,216,216,216,216,216,216,216,217,218,218,218,218,219,219,219,221,221,222,223,224,226)
>ks.test(x,"pnorm",209,6.5)
One-sample Kolmogorov-Smirnov test
data: x
D = 0.088873, p-value = 0.2995
alternative hypothesis: two-sided
------------------------------------------------
| 两样本K-S Test |
------------------------------------------------
>ks.test(Data1,Data2)这里 p-\text{value}\le0.05 的时候拒绝 H_0 (\alpha=0.05) ,否则接受 H_0 ,你熟练的话看 D 值也一目了然 有人好奇 D 临界值表怎么得到的:
在零假设下,有 \sqrt{n}D_n \overset{n\rightarrow \infty}{\longrightarrow} \underset{t}{\text{sup}}|B(F(t))|
B(t)=W(t)-\frac{t}{T}W(T) \quad \text{for } t\in [0,1]
B(t) 是布朗桥Brownian bridge
W(t) 是维纳过程Wiener Process f_{W_t}(x)=\frac{1}{\sqrt{2\pi t}}e^{\frac{-x^ 2}{2t}}
\text{Let }K= \underset{t\in [0,1]}{\text{sup}}|B(t)|, \text{we have }
\text{Pr}(K<x)=\frac{\sqrt{2\pi}}{x}\sum_{k=1}^{\infty}e^{\frac{-(2k-1)^2\pi^2}{8x^2}}
这玩意在 n 有限时可以这样做近似:
\text{CDF}(K)\simeq \vartheta_{01}(z=0;\tau =2iy^2/\pi), \quad \text{where }y=x+\frac{1}{6\sqrt{n}}+\frac{x-1}{4n}
你把一系列 \alpha 值和样本数量 n 带进去算就得到了,跟其他的临界值表大同小异,就是很难很难了hhhh~
未完待续
原文地址:https://zhuanlan.zhihu.com/p/146781665 |