概述
在统计学中,Kolmogorov-Smirnov检验(通常称为K-S检验)是基于累积分布函数的,通常用于确定两个观测数据的潜在概率分布是否存在显著的差异,或者观测数据的潜在概率分布是否与假设分布(比如正态分布)存在显著的差异(上述两种情况均基于有限样本)。
在单样本情况下,KS检验将观测数据的累积分布函数与零假设所指定的累积分布函数进行比较。在两样本情况下,KS检验将两个观测数据的累积分布函数进行比较。其中,两个样本的KS检验是比较两个样本的最有用且最通用的非参数方法之一,因为它对两个样本的累积分布函数的位置和形状的差异都敏感。
KS检验作为一种非参数检验,与参数检验(如t-检验)方法不同是KS检验不需要知道数据的概率分布情况。换句话说,当未知数据的概率分布情况时,KS检验等非参数检验要优于参数检验(如t-检验)。但是,当观测数据的概率分布符合已知概率分布时,KS检验的灵敏度将低于参数检验。
然而,当样本量比较小的时候,KS检验(非参数检验)是分析两组数据之间是否存在显著差异时的最佳选择。对于不满足正态分布的大样本数据而言t-检验还是相当精确有效的统计方法。
KS检验的直观理解
接下来,我们以一种比较直观的方式来理解KS检验的步骤。
准备数据集
> controlB = c(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= c(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)
> summary(controlB)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.080 0.315 0.600 3.607 1.415 50.570
> summary(treatmentB)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.110 1.272 2.265 8.357 7.165 41.040
> layout(matrix(1:2, nrow = 2, ncol = 1))
# qqplot和显著性检测正态性
> qqnorm(controlB);qqline(controlB, col = 2);shapiro.test(controlB)
Shapiro-Wilk normality test
data: controlB
W = 0.32469, p-value = 1.163e-08
> qqnorm(treatmentB);qqline(treatmentB, col = 2);shapiro.test(treatmentB)
Shapiro-Wilk normality test
data: treatmentB
W = 0.65484, p-value = 1.152e-05
通过Q-Q图及正态性检验,发现两个数据集是非正态性数据集。因此,当采用t-检验(存在正态性假设)时,结果的可靠性存在质疑。
观察数据集的累积分布函数
在这里,累积分布值就是所有比x小的数在数据集中所占的比例。下面对controlB数据集进行统计及绘图
# cumlative fraction plot
cdf <- function(x){
df <- as.data.frame(table(x))
total.num <- sum(df$Freq)
cdf.freq <- 0
idx <- 1
tmp <- rep(0, nrow(df))
for (n in df$Freq){
cdf.freq <- cdf.freq + n
tmp[idx] <- cdf.freq
idx <- idx +1
}
df$x <- as.numeric(as.character(df$x))
df$CDF <- tmp
df$CDF.freq <- tmp / sum(df$Freq)
return(df)
}
cdf.ctl <- cdf(controlB)
plot(x = cdf.ctl$x, y = cdf.ctl$CDF.freq,
type = 'S',
main = "Cumlative Fraction PLot",
xlab = "X",
ylab = "Cumlative Frequency")
基于累积分布图,我们发现大多数数据集中在左侧(数据值比较小),展示了非正态分布现象。为了更好的观测数据在x轴上的分布,可以对x轴的坐标进行非等分的划分。在数据都为正的时候有一个很好的方法就是对x轴进行log转换。对其进行log转换,其结果如下。
将treatmentB的数据也做相同的累积分布图(如下),可以发现treatmentB和controlB的数据分布范围大致相同。但是对于大部分x值,在controlB数据集中比x小的数据所占的比例比在treatmentB中要高,也就是说达到相同累计比例的值在treatment组中比control中要高。KS检验是以两条累计分布曲线之间的最大垂直差(D值)作为检验统计量,来描述两组数据之间的差异 。在此图中这个D值出现在x=1附近,而D值为0.45(0.65-0.25)。
注意 : 虽然累计分布曲线的形状会随着数据转换处理而改变(如log转换),但是D值的大小是不会改变。
KS检验的数学推导
- 检验统计量为: D n = m a x { F n ( x ) − F ( x ) } D_n = max\{F_n(x) - F(x)\} Dn=max{ Fn(x)−F(