了解R中的Kolmogorov-Smirnov检验


17

我正在尝试了解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;

    b。可以说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. 我故意制作了一个具有很多联系的示例,因为我使用的数据具有很多相同的值。为什么这会混淆测试?我认为它计算出的概率分布应该不受重复值的影响。任何想法?

Answers:


21

KS测试的前提是测试连续分布中两个独立样本的“相同性” (如帮助页面所述)。如果真是这样,那么平局的可能性应该非常小(也有陈述)。测试统计量是两个样本的ECDF之间的最大距离。如果两个样本是从相同的分布中抽取的,则p值是检验统计数据高于或高于所观察到的统计数据的概率。(这不是“ var1 = var2的概率。”而且,1-p_value也不是该概率。)高p值表示您不能声称支持差异,但p值低并不表示相同。如果样本量较小(如您的示例所提供),或者存在有趣但很小的差异(例如叠加的振荡干扰),则可能会出现低p值。如果您正在处理具有大量联系的情况,则建议您可能需要使用更适合您的数据情况的测试。

我对关系为什么会违反假设的解释并不是说关系使结果无效。实际上,KS测试的统计特性相对于该假设的失败具有较强的抵抗力或鲁棒性。如我所见,KS测试的主要问题在于它过于笼统,因此无法有效地识别有意义的差异。KS检验是一种非常通用的检验,对于更具体的假设而言,功效很低。

另一方面,我还看到KS测试(或“功能更强大的”安德森·达林或Lillefors(sp?)测试)用于在完全不需要这种测试的情况下测试“正常”,例如拟合之前在回归模型中用作预测变量的变量的正态性。人们可能合法地希望测试残差的正态 因为建模理论中假设了这一点。即使这样,一般也不会对残差的正态性有一定的偏离,也不会挑战结果的有效性。人们最好使用健壮的方法来检查“非正态性”对有关统计意义的结论的重要影响。

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



我已经使用dgof::ks.test(x,y,simulate.p.value=TRUE, B=1000)Matching::ks.boot(x,y, nboots=1000)sekhon.berkeley.edu/matching/ks.boot.html)测试了相同的示例。在两种情况下,D和计算出的p值都绝对相同。这使我认为,即使一个人有多个联系并且不能保证该方法行得通,KS也不是那么糟糕?我之所以喜欢KS,是因为它不是参数性的,即我不需要假设样本的分布。
Nonancourt

但是,我仍然无法理解D的值。我认为它可能是这里的sqrt(m * n /(m + n))的先决条件,但这会使D(x,y) = sqrt(100/20)*0.3=0.67仍然不同。
Nonancourt

3

要计算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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.