ks.test 和 ks.boot - 精确的 p 值和关系

机器算法验证 r kolmogorov-smirnov 测试 领带
2022-03-13 17:45:25

我对 ks.test (package stat) a) 在存在领带的情况下的行为感到困惑,并且 b) 如果在进行两个样本测试时偏向一边。文档:“如果单边或存在关系,则两个样本情况下的精确 p 值不可用。”

我问黑色(实验)和红色(对照)是否遵循相同的分布函数而不知道底层分布函数。

在我手中,如果单边且存在平局(根据警告消息),则会计算出精确的 p 值。但是两侧的 p 值只是 < 2.2e-16,但不是“完全”报告的。

如果有兴趣,您可以将数据下载为 .Rda(向量长度 ~ 9000):

https://www.dropbox.com/s/xl29jvpurkbwqpm/black.Rda?dl=0

https://www.dropbox.com/s/5biptm1xet36v3v/red.Rda?dl=0

例子:

ks.test (black, red)

    Two-sample Kolmogorov-Smirnov test

data:  black and red
D = 0.0731, p-value < 2.2e-16
alternative hypothesis: two-sided

ks.test (black, red)$p.value 

[1] 0
Warnmeldung: # means warning message
In ks.test(black, red) :
  im Falle von Bindungen sind die p-Werte approximativ # "Bindungen" means ties

ks.test (black, red, alternative="g")$p.value # not as expected

[1] 1.235537e-23
Warnmeldung:
In ks.test(black, red, alternative = "g") :
  im Falle von Bindungen sind die p-Werte approximativ

ks.test (black, red, alternative="l")$p.value

[1] 0.0005651143
Warnmeldung:
In ks.test(black, red, alternative = "l") :
  im Falle von Bindungen sind die p-Werte approximativ

我尝试ks.boot了(包“Matching”),它声称适用于带关系的两个.sample 测试,并且“即使在被比较的分布不完全连续的情况下也能提供正确的覆盖率”。相同的故事。我只得到了单方面条件的精确 p 值。例如:

ks.boot (black, red, alternative="l")

$ks.boot.pvalue
[1] 0.001

$ks

Two-sample Kolmogorov-Smirnov test

data:  Tr and Co
D^- = 0.0275, p-value = 0.0005651
alternative hypothesis: the CDF of x lies below that of y

$nboots
[1] 1000

attr(,"class")
[1] "ks.boot"

我是否误解了这句话“如果单边或存在关系,则两个样本的情况下无法获得精确的 p 值?” 我认为感觉是:如果单边或......没有确切的p值

ks.test (two.sample, one side) 的 p 值是否“正确”?

在提供精确的 p 值方面,ks.boot 并不优越。

有人可以对此发表评论吗?谢谢赫尔曼


@Roland我的问题:“如果单边或存在联系,则两个样本情况下的精确p值不可用”(ks.test)。也许我对(统计)方法定义的“精确”一词感到困惑。但是我得到了单边的“精确”(在精确数字的意义上)p值,而不是双边测试的p值......

  ks.test (black, red, alternative="g")$p.value # one-sided
  [1] 1.235537e-23 # precise p-value
  Warnmeldung:
   In ks.test(black, red, alternative = "g") :
  im Falle von Bindungen sind die p-Werte approximativ

  ks.test(black, red)$p.value # two.sided
  [1] 0 # Is this precise?

最“精确”的 p 值(ks.test,two.lateral)...

 ks.test (black, red)

 Two-sample Kolmogorov-Smirnov test

 data:  black and red
  D = 0.0731, p-value < 2.2e-16
  alternative hypothesis: two-sided

  Warnmeldung:
  In ks.test(black, red) :
  im Falle von Bindungen sind die p-Werte approximativ

我很困惑,如果 p.value < 2.2e-16 (two.lateral, ks.test) 会报告 p 值为 0。这很可能与“精确” p.values 没有任何关系。所以答案可能是:这些是近似的 p.values(根据文档,因为存在联系,而且是片面的)。但这并不能解释根据报告的 p 值的不同行为。我得到一个“精确”(近似)p.value 单面但不是双面......由于统计原因?

此外,我也没有得到双向 ks.boot 的“精确” p 值(应该是“精确的”)。它是 < 2.2e-16 并且 ks.boot.pvalue 再次为 0。那么对于双向测试,“准确”的 ks.boot.pvalue 在哪里?ks.test 只有 p.value。

ks.boot (black, red)
$ks.boot.pvalue [1] 0 # 没有 ks.boot.pvalue 报告

    $ks

Two-sample Kolmogorov-Smirnov test

     data:  Tr and Co
    D = 0.0731, p-value < 2.2e-16
    alternative hypothesis: two-sided

       $nboots
    [1] 1000

    attr(,"class")
    [1] "ks.boot"

“精确” p 值(ks.boot)是否仅针对单面条件报告?

谢谢赫尔曼

2个回答

有两点令人困惑。第一个是关于统计上下文中的“精确”和“近似”的词。“精确”一词意味着在进行计算时,不使用任何简化。“近似” p 值并不意味着该值被四舍五入到某种精度。这意味着在计算它时,已经使用了一些简化。但是,“精确”和“近似”计算都给出了精确的数值。只是我们的信心可能会有所不同。现在是第二点:它只是格式化输出的方式给你不精确的值。实际上,您正在以不同的方式调用相同的输出。

ks.test (black, red, alternative="l")$p.value
ks.test (black, red, alternative="g")$p.value
ks.test (black, red)$p.value

都给你精确的(不是四舍五入的)值,因为你正在调用变量的值。在最后一种情况下,p 值非常小,低于机器精度,因此被列为 0。但是,当您只是调用一个函数时,该函数会为您提供人类可读的输出。在准备此输出期间,p 值正在通过format.pval()函数。首先,检查和的一致性ks.test (black, red)- ks.test (black, red, alternative="g")p 值在非精确格式中是相同的。现在比较

ks.test (black, red, alternative="g")$p.value

format.pval(ks.test (black, red, alternative="g")$p.value)

现在清楚它p-value < 2.2e-16是如何产生的了吗?

最后关于ks.boot()它使用自举。虽然ks.test()从 Kolmogorov 分布中获得检验统计量的概率(该分布描述了当两个样本确实来自同一分布时检验统计量的分布方式),ks.boot()但从在原假设下得出的经验分布中获得检验统计量的概率。也就是说,将所研究的两个样本组合在一起,并从这个联合集中随机抽取两个新样本并进行替换。这些新样本肯定来自相同的分布,并记录了它们的测试统计数据。多次重复这样的过程,我们得到了零假设下检验统计量的经验分布。你正在做的重复次数是nboots可变的ks.boot()输出。您使用了默认值 1000。这样,您在原假设下模拟了 1000 个检验统计值。您的实际测试统计量大于所有这 1000 个。这意味着 p 值至少等于或小于 0.001 - 即ks.boot.p.value打电话ks.boot(red,black,nboots=10000),你会得到ks.boot.p.value=0.0001要获得合理的 p 值,ks.boot()您的nboots订单应该比预期的 p 值更大(即超过)。我建议你不要1023这样做,因为它会挂断您的计算机或引发内存异常。实际上,如此小阶的精确 p 值没有任何实际用途。确实,它们对数据的微小变化非常敏感,因此重复实验会导致 p 值大不相同,因此可以说 p 值越小 - 对其精确值的置信度就越低。

更令人困惑的是,当两个样本大小的乘积大于 10,000 时,两个样本ks.test默默地求助于近似值。您可能需要考虑这个github 页面作为示例和解决方案。