了解 R 中的 Kolmogorov-Smirnov 检验

机器算法验证 r kolmogorov-smirnov 测试 领带
2022-01-19 02:13:21

我试图了解 Kolmogorov-Smirnov 测试函数的输出(两个样本,双面)。这是一个简单的测试。

x <- c(1,2,2,3,3,3,3,4,5,6)
y <- c(2,3,4,5,5,6,6,6,6,7)
z <- c(12,13,14,15,15,16,16,16,16,17)

ks.test(x,y)

#   Two-sample Kolmogorov-Smirnov test
#
#data:  x and y
#D = 0.5, p-value = 0.1641
#alternative hypothesis: two-sided
#
#Warning message:
#In ks.test(x, y) : cannot compute exact p-value with ties

ks.test(x,z)

#Two-sample Kolmogorov-Smirnov test

#data:  x and z
#D = 1, p-value = 9.08e-05
#alternative hypothesis: two-sided
#
#Warning message:
#In ks.test(x, z) : cannot compute exact p-value with ties


ks.test(x,x)

#Two-sample Kolmogorov-Smirnov test

#data:  x and x
#D = 0, p-value = 1
#alternative hypothesis: two-sided
#
#Warning message:
#In ks.test(x, x) : cannot compute exact p-value with ties

这里有几件事我不明白。

  1. 帮助看来,p 值是指假设var1=var2但是,这意味着测试显示 ( p<0.05):

    一种。不能这么说X = Y

    湾。可以这么说X = Z

    C。不能这么说X = X(!)

除了看起来 x 与自身不同(!)之外,我也很奇怪x=z,因为这两个分布的重叠支持为零。这怎么可能?

  1. 根据测试的定义,D应该是两个概率分布之间的最大差异,但例如在这种情况下(x,y)它应该是D = Max|P(x)-P(y)| = 4(在P(x)P(y)未归一化的情况下)或D=0.3 (如果它们被归一化)。为什么 D 与此不同?

  2. 我特意做了一个有很多关系的例子,因为我正在使用的数据有很多相同的值。为什么这会混淆测试?我认为它计算了一个不受重复值影响的概率分布。任何的想法?

2个回答

KS 测试的前提是测试来自连续分布的两个独立样本的“相同性” (如帮助页面所述)。如果是这样的话,那么平局的可能性应该小得惊人(也说明了)。检验统计量是两个样本的 ECDF 之间的最大距离。如果两个样本来自同一分布,则 p 值是看到检验统计量高于或高于观察到的检验统计量的概率。(这不是“var1 = var2 的概率”。此外,1-p_value 也不是那个概率。)高 p 值表示你不能声称差异的统计支持,但低 p 值并不是相同的证据。低样本量(如您的示例所提供)或存在有趣但小的差异(例如叠加的振荡干扰)时可能会出现低 p 值。如果您正在处理具有大量关系的情况,则表明您可能需要使用更适合您的数据情况的测试。

我对为什么关系违反假设的解释并不是说关系使结果无效。KS 检验的统计特性在实践中相对抵抗或稳健地抵抗该假设的失败。正如我所看到的,KS 测试的主要问题是它过于笼统,因此无法识别有趣性质的有意义的差异。KS 检验是一种非常通用的检验,对于更具体的假设而言,功效相当低。

另一方面,我还看到 KS 测试(或“更强大的”Anderson Darling 或 Lillefors(sp?) 测试)用于在这种测试完全没有根据的情况下测试“正态性”,例如测试在拟合之前在回归模型中用作预测变量的变量的正态性。人们可能有理由想要测试残差的正态 因为这是建模理论中的假设。即使这样,与残差正态性的适度偏离通常也不会挑战结果的有效性。人们最好使用稳健的方法来检查“非正态性”对统计显着性结论的重要影响。

也许您应该咨询当地的统计学家?它可能会帮助您更精确地定义统计问题,因此如果确实存在差异,则更有可能识别差异。这将避免“第二类错误”:当存在这种差异时,无法支持差异结论。

要计算 D(来自ks.test代码):

ks.test(x,y)

    Two-sample Kolmogorov-Smirnov test

data:  x and y
D = 0.5, p-value = 0.1641
alternative hypothesis: two-sided

alternative <- "two.sided"
x <- x[!is.na(x)]
n <- length(x)
  y <- y[!is.na(y)]
  n.x <- as.double(n)
  n.y <- length(y)
  w <- c(x, y)
  z <- cumsum(ifelse(order(w) <= n.x, 1/n.x, -1/n.y))
  z <- z[c(which(diff(sort(w)) != 0), n.x + n.y)] #exclude ties
  STATISTIC <- switch(alternative, two.sided = max(abs(z)), 
                      greater = max(z), less = -min(z))
  STATISTIC

[1] 0.5