K-S检验

# [K-S检验](https://www.jianshu.com/p/8556830b5839) K-S检验基于累计分布函数,用以**检验两个经验分布是否不同或一个经验分布与另一个理想分布是否不同**(即检验两总体分布是否存在显著差异)。 --- **其原假设H0:两个数据分布一致或者数据符合理论分布(无显著差异)** 计算 $\mathrm{D}_{n}=\max \left\{\left|\mathrm{F}(\mathrm{x})-\mathrm{F}_{\mathrm{n}}(\mathrm{x})\right|\right\}$,当实际观测值$D_{n}$>$D_{n}(α)$则拒绝H0,否则则接受H0假设。(此处n为样本数,α为置信度) **F值公式** 用$F_{n}(x)$表示样本量为n的随机样本观察值的<font color=Blue>**累计分布函数**</font>,且$F_{n}(x)=i / n$ (i是等于或小于x的所有观察结果的数目,i=1, 2,...,n)。$F(x)$表示理论分布的累计概率分布函数。K-S单样本检验通过样本的累计分布函数$F_{n}(x)$和理论分布函数$F(x)$的比较来做拟合优度检验。检验统计量是$F(x)$与$F_{n}(x)$间的最大偏差 $\mathrm{D}_{n}=\max \left\{\left|\mathrm{F}(\mathrm{x})-\mathrm{F}_{\mathrm{n}}(\mathrm{x})\right|\right\}$ 若对每一个x值来说,$F_{n}(x)$与$F(x)$都十分接近,则表明实际样本的分布函数与理论分布函数的拟合程度很高。 **例:对于以下两组数据:** controlB={1.26, 0.34, 0.70, 1.75, 50.57, 1.55, 0.08, 0.42, 0.50, 3.20, 0.15, 0.49, 0.95, 0.24, 1.37, 0.17, 6.98, 0.10, 0.94, 0.38} treatmentB= {2.37, 2.16, 14.82, 1.73, 41.04, 0.23, 1.32, 2.91, 39.41, 0.11, 27.44, 4.51, 0.51, 4.50, 0.18, 14.68, 4.66, 1.30, 2.06, 1.19} **观察数据的累计分段函数** 对controlB数据从小到大进行排序: sorted controlB={0.08, 0.10, 0.15, 0.17, 0.24, 0.34, 0.38, 0.42, 0.49, 0.50, 0.70, 0.94, 0.95, 1.26, 1.37, 1.55, 1.75, 3.20, 6.98, 50.57}。 10%的数据(2/20)小于0.15,85%(17/20)的数据小于3。所以,对任何数x来说,其累计分段就是所有比x小的数在数据集中所占的比例。下图就是controlB数据集的累计分段图 ![image.png](https://cos.easydoc.net/17082933/files/kettxcqg.png) 可以看到大多数数据都几种在图片左侧(数据值比较小),这就是非正态分布的标志。为了更好的观测数据在x轴上的分布,可以对x轴的坐标进行非等分的划分。在数据都为正的时候有一个很好的方法就是对x轴进行log转换。下图就是上图做log转换以后的图: ![image.png](https://cos.easydoc.net/17082933/files/kettxucm.png) 将treatmentB的数据也做相同的图(如下),可以发现treatmentB和controlB的数据分布范围大致相同(0.1 - 50)。但是对于大部分x值,在controlB数据集中比x小的数据所占的比例比在treatmentB中要高,也就是说达到相同累计比例的值在treatment组中比control中要高。 KS检验使用的是两条累计分布曲线之间的最大垂直差作为D值(statistic D)作为描述两组数据之间的差异。在此图中这个D值出现在x=1附近,而D值为0.45(0.65-0.25)。 ![image.png](https://cos.easydoc.net/17082933/files/ketty143.png) 值得注意的是虽然累计分布曲线的性状会随着对数据做转换处理而改变(如log转换),但是D值的大小是不会变的。 一般如果$D_n$ >$D_{n}(0.05)$。则认为有显著性差异 **$D_{n}(α)$的计算方法**: $D_{n}(0.05)$的经验算法:1.36/SQRT(N) 其中SQRT为平方根,N为样本数。$D_{n}(0.01)$经验算法1.64/SQRT(N) 。当然最准确的办法还是去查KS检定表。不过大多数软件如CLAMPFIT,MINIANALYSIS统计出来的结果都是直接有P值。根据这个值(alpha=0.05)就可以断定有没有差异了。 >**K-S 检验优缺点:** > 优点:该检验不依赖于要测试的累积分布函数,相比于卡方拟合检验(卡方检验需要50个以上的样本),不需要大量的样本。 > > 缺点:易受异常值影响 在Python中有现成的包可以直接用于KS检验: ```python from scipy.stats import kstest kstest(x,cdf = "norm") # x表示待检验的样本集 # cdf用来指明要判断的已知分布类型,有:‘norm’,’expon’,’logistic’,’gumbel’,’gumbel_l’, gumbel_r’,‘extreme1’值可以选,其中norm表示正态分布检验。 # kstest会返回两个值:statistic → D值,pvalue → P值 # p值大于0.05,则不拒绝原假设,分布为正态分布 ``` ---