Kolmogorov-Smirnov检验:当存在联系时,应用于离散变量的两样本检验的精确p值



我从不同的站点得到了两个样本。我感兴趣的参数是离散的(频率)。我对两个站点都做了模拟,所以我知道每个站点的随机分布概率。由于我的模拟,我知道我的参数与其平均值的偏差不是正态分布的,所以我进行了参数测试。我用一个样本Kolmogorov-Smirnov检查了样本是否可能来自这些随机分布(示例数据,不是真实的):

sample1 <- rep(1:5, c(25, 12, 12, 0, 1))
rand.prob1 <- c(.51, .28, .111, .08, 0.019)
StepProb1 <- stepfun(0:4, c(0, cumsum(rand.prob1)), right = T)
dgof::ks.test(sample1, StepProb1)
sample2 <- rep(1:5, c(19, 13, 10, 5, 3))
rand.prob2 <- c(.61, .18, .14, .05, 0.02)
StepProb2 <- stepfun(0:4, c(0, cumsum(rand.prob2)), right = T)
dgof::ks.test(sample2, StepProb2)

在下一步中,我想检查两个站点的样本是否来自同一分布。KS测试的两个实施例(包statsdgof)都会发出警告,因为我的样本有关联:

stats::ks.test(sample1, sample2)
dgof::ks.test(sample1, sample2)

如果我正确理解Dufour和Farhat(2001),有一种方法可以通过蒙特卡洛模拟来计算精确的p值。如果我正确理解dgof包的包描述,它的蒙特卡罗模拟实现只适用于一个样本测试。

所以我的问题是:当存在联系时,有人知道如何计算应用于离散变量的两样本Kolmogorov-Smirnov检验的R中的精确p值吗?

或者(尽管与R没有特别的关系):如果没有人知道如何在可承受的工作量下做到这一点,我会选择未校正的p值,因此会谨慎地讨论结果。但p值低于0.0001。我其实并不太担心。但是我知道什么。。。你认为这是对的,还是我在这件事上犯了严重的错误?

提前谢谢,我已经很感激你一直读到这里。

如注释中所述,包匹配的函数ks.boot实现Bootstrap Kolmogorov Smirnov,即使用nboots参数对任意数量的重新采样进行蒙特卡罗模拟。我认为这会给你所需要的。

根本不知道是否可以在这里应用KS
Kolmogorov-Smirnov是一个NON参数检验,仅适用于连续的x和y数据。我想你的sample1和sample2不是连续的"足够"。引用?stats::ks.test

如果y是数字,则x和y的零假设的两个样本检验从相同的连续分布中提取。

另请参阅:

  • https://stats.stackexchange.com/questions/1047/is-kolmogorov-smirnov-test-valid-with-discrete-distributions
  • http://en.wikipedia.org/wiki/Kolmogorov%E2%80%93Smirnov_test

解决方案:尝试在R中执行卡方拟合良好性测试
您可以使用?chisq.test执行此操作
理论可以在这里找到,例如:

  • http://www.stat.yale.edu/Courses/1997-98/101/chigf.htm
  • http://www.itl.nist.gov/div898/handbook/eda/section3/eda35f.htm

最新更新