经验生成的分布之间的距离(在 R 中)

机器算法验证 r 分布 距离
2022-03-29 02:02:14

我不是统计学家,但有时我需要摆弄数据。我有两个数据集,单位间隔内的值列表。我将它们绘制为直方图,因此我对它们的“距离”有一个直观的了解。但我想做一些更正式的事情。

我的第一个想法是仅将垃圾箱中值的差异相加,但这并不令人满意。然后我想对这些取一个三箱平均值和总和差异。(抱歉,如果我正在修改统计术语)

但我想我可能正在重新发明轮子,所以我来到了这里。类似的问题似乎指向“Kolmogorov Smirnov 测试”或类似的东西。

所以我的问题是:这是计算这些数据集相距多远的正确方法吗?有没有一种简单的方法可以在 R 中做到这一点?理想情况下只是KStest(data1,data2)还是什么?

编辑要强调的是,我对直接测量数据相距多远的方法特别感兴趣,而不是对每个数据拟合分布然后测量分布之间的距离。[这还有意义吗?我猜 R 中的数值计算将通过从分布中抽样来完成。]

3个回答

您可以使用该ks.test函数进行 Kolmogorov-Smirnov 测试。?ks.test

通常,当您在 R 中寻找一个函数(并且您不知道它的名称)时,请尝试使用??. 例如,??"Kolmogorov Smirnov". 如果没有任何问题RSiteSearch("whatever you're looking for")应该有帮助:)

比较分布的标准方法是使用Kullback-Leibler 散度像往常一样,有一个 R 包可以为你做这件事!从包?KLdiv中的帮助页面flexmix,我们得到以下代码:

## Gaussian and Student t are much closer to each other than
## to the uniform:
> library(flexmix)
> x = seq(-3, 3, length=200)
> y = cbind(u=dunif(x), n=dnorm(x), t=dt(x, df=10))
> matplot(x, y, type="l")

> round(KLdiv(y),3)
      u     n     t
u 0.000 1.082 1.108
n 4.661 0.000 0.004
t 4.686 0.005 0.000

请注意,比较不是对称的:所以 uniform vs Normal 不同于 Normal vs Uniform。

您没有解释为什么要比较分布。给出一个用例可能会让你得到更具体的答案。

第一件事:定义“距离”。这听起来像是一个愚蠢的问题,但你所说的距离是什么意思?数据是否配对?然后 - 只有这样 - 查看(平方)差异的总和以确定两个数据集之间的距离是有意义的。如果没有,你必须诉诸其他手段。

下一个问题是:数据是否以相同的方式分布?如果是这样,您可以将平均值之间的差异视为数据的“位置偏移”(或两个数据集之间的距离)。

但是,如果两者都不成立,那么您如何定义数据集之间的距离呢?例如,您是否考虑了分布的形状?在尝试计算距离之前,您确实必须考虑这些问题。

这表示:一种(天真的)可能性是使用所有可能的 xy 组合之间差异的平均值。正式化为:

Dist=1n1n2i=1n1j=1n2(XiYj)2

在 R 中:

x <- rnorm(10)
y <- rnorm(10,2)
sqrt(mean(outer(x,y,"-")^2))

如果您允许负距离,您可以删除 sqrt 和 ^2 :

mean(outer(x,y,"-"))

模拟很容易表明,这确实会给出示例中均值之间的差异,因为在这种情况下,两个分布都是相等的。但请注意,在许多应用中不允许使用负距离。在第一种情况下,这个数字总是比平均值之间的差值大一点。无论如何,如果您对数据集中心之间的差异感兴趣,请定义中心并计算这些中心之间的差异。这很可能就是你所追求的。

与其他建议相反,这种方法不对数据的分布做出任何假设。这使得它适用于所有情况,但也难以解释。