具有数据点错误的两样本 Kolmogorov-Smirnov 检验

机器算法验证 分布 错误 样本 偏度 kolmogorov-smirnov 测试
2022-04-13 00:57:26

精简版

我想测试两个遵循偏态分布的样本是否可以相互区分。如果有办法包含错误,则两个样本的 Kolmogorov-Smirnov 统计量就足够了。我拥有的每个数据点都附加了一个误差测量值,这些误差相对较大,并且彼此之间变化很大。

长版

在下图中,我绘制了两个数据集的直方图,每个数据集包含两个样本,一个红色样本和一个蓝色样本。垂直线表示平均值。可以看出,在这两种情况下,两个样本分布都相互倾斜。两个数据集的每个直方图中大约有 240 个数据点,其中数据集中的红色和蓝色样本大小相同。数据限制在 [-0.2, 0.4] 范围内,每个数据点的平均误差大小为 0.12(欢迎来到我的世界!)。

两个样本分布的第一个直方图和均值 两个样本分布的第二个直方图和均值

2 个样本的 Kolmogorov-Smirnov 统计量告诉我 p 值为 6e-79,第一个数据集的 KS 统计量为 0.85,第二个数据集的 p=6e-40,KS 统计量为 0.57(计算公式为scipy.stats.ks_2samp)。正如您可以从平均误差条的大小中猜到的那样,这听起来太不可思议了。

不幸的是,在互联网上搜索考虑错误的加权 Kolmogorov-Smirnov 测试一无所获。这就是我所需要的,除非我能得到一些统计保证,我不需要担心我的案例中的数据点错误。

2个回答

这是一个很好的问题,让我大吃一惊的是没有一个明显的答案,因为这本质上是科学家所做的最基本的统计比较我来这里是为了问完全相同的问题。我没有完整的答案,但我可以告诉你我处理这个问题的不雅方式。

1) 不要将每个元素视为一个精确值,而是为样本中的每个元素构建一个概率分布 (Pi(x))。如果您的误差大致正常,那么这可能是一个以您的测量值为中心的高斯分布。在您的情况下,这为每个样本提供了大约 240 个不同的概率分布。

2) 共同添加每个样本中的所有概率分布(并通过样本中的测量次数进行归一化)以创建总样本的分布概率密度 (D(x)):D(x)=( SUM[Pi(x) )] 从 i=1 到 N ) / N(其中 N 是样本中的源数)对两个样本都执行此操作。

3) 使用分布概率密度得出每个样本的累积密度函数: CDF(x)=Integral[ D(y) dy] from y=-infinity to x 对两个样本都这样做。

4) 像在正常的 KS 测试中一样比较这些 CDF。找到它们的最大差异,D。

这个 D 本质上等同于 KS D 统计量,但它是否以同样的方式转化为拒绝原假设的概率?我认为KS测试理论上植根于具有单一值的数据,所以我不确定我们是否可以确定。为了解决这种理论上的不适,我们至少可以检查您测量的 D 值是否显着大于由两个样本中的所有元素组成的样本的任何随机排列。

5)一旦你有了“真实”的 D 值,返回并随机打乱样本 1 中的元素和样本 2 中的元素(但保持每个样本中的元素总数与以前相同)。重复步骤 1-4,为这个随机组装的样本比较得出一个 D 值。这样做几百或几千次,你就会得出 D 值的分布。

6) 你的“真实”D 值与这个分布相比如何?如果它大于其中的 99%(或 95% 或 90%...),这很好地表明您的样本分布的差异明显大于它们真正代表相同基础分布时所预期的差异。

由于这是一个如此重要和基本的科学问题,我的一部分假设必须有一个基于理论的方法来解决它。到目前为止,我还没有找到它。

KS 测试比较了两个概率密度函数(参见例如Wikipedia)。据我所知,这并不意味着将测量值与误差进行比较。

解决您的问题的一种方法可能是将 PDF 模型的集合拟合到您的数据中,例如使用蒙特卡洛方法对合理的模型参数进行采样。这会产生两组模型,一组用于您的每个分布。然后使用 KS 测试将一组中的所有模型与另一组中的所有模型进行比较。然后,您可以研究生成的 KS 统计数据集,例如通过查看其分布,或仅取平均值和方差。这样你就回到了一个 KS 统计数据和那个值的错误。

这是否是可靠的统计数据,我不敢说。

编辑:维基百科页面还建议使用蒙特卡洛:

如果从数据的形式或参数,则以这种方式确定的临界值无效。在这种情况下,可能需要使用 Monte Carlo 或其他方法,但已为某些情况准备了表格。对检验统计量的必要修改以及正态分布和指数分布的临界值的详细信息已经发布,[5] 并且后来的出版物还包括 Gumbel 分布。 [6] Lilliefors 检验代表了正态分布的一个特例。对数变换可能有助于克服 Kolmogorov 测试数据似乎不符合其来自正态分布的假设的情况。F(x)Xi