测试变量是否遵循相同的分布


16

如果要测试两个变量是否遵循相同的分布,将两个变量简单排序然后检查它们的相关性是否是一个很好的测试?如果它很高(至少为0.9?),则变量很可能来自相同的分布。

这里的分布是指“正态”,“卡方”,“伽玛”等。

Answers:


35

让我们找出这是否是一个很好的测试。 除了声称它是不好的或者一度表明它无法正常工作之外,它还有很多其他功能。大多数测试在某些情况下效果不佳,因此我们经常面临确定任何提议的测试可能是一个不错选择的情况。

测试说明

像任何假设检验一样,该假设由(a)空假设和交替假设以及(b)旨在区分假设的检验统计量(相关系数)组成。

零假设是两个变量来自同一分布。确切地说,让我们命名变量Xÿ并假定我们已经观察到X的ñX实例,称为x i = x 1x 2x n x,而Y的n y个实例,称为y。。零假设是XY的所有实例都是独立的并且分布相同(iid)。XX一世=X1个X2XñXñÿÿÿ一世Xÿ

让我们以作为备用的假设,即(a)中的所有实例是独立同分布的,根据一些潜在分布和(b)的所有实例是独立同分布的,根据一些潜在分布但(c)中不同于˚F ÿ。(因此,我们将不再寻找x i之间的相关性,y i之间的相关性,x iy j之间的相关性,或xy之间的分布差异:假定不是合理)F X Y F Y F XXFXÿFÿFXFÿX一世ÿ一世X一世ÿĴXÿ

拟议的测试统计量假设(称为该公共值n),并计算x [ i ]y [ i ]的相关系数通常,[ i ]表示第i 最小的)数据)。称其为t x y ñX=ñÿñ(x[i],y[i])[i]ithŤXÿ

排列测试

在这种情况下,无论提出什么统计,我们都可以始终进行排列检验。 在原假设下,数据x 1x 2x ny 1y 2y n的可能性与2 n的任何置换的可能性相同数据值。换句话说,将数据的一半分配给X,另一半分配给YŤX1个X2Xñÿ1个ÿ2ÿñ2ñXÿ是纯随机的巧合。这是iid假设和假设的简单直接的结果。FX=Fÿ

因此,采样分布有条件的观测X ÿ ,是所有值的分布达到对所有2 Ñ 数据的排列。我们对此感兴趣,因为对于任何给定的预期测试大小α,例如α = .05(对应于95%的置信度),我们将根据t的采样分布构造一个两侧临界区域:它包含最极端的ŤXÿX一世ÿ一世Ť2ñαα=.0595Ť的可能值的%(偏高,因为高相关性是类似的分布和相关性低一致是不是)。这就是我们确定相关系数必须多大才能决定数据来自不同分布的方法。100αŤ

模拟空采样分布

因为(或者,如果你喜欢, 2 ñ2ñ(计数将2n个数据拆分为大小为n的两个片段的方法的数目)即使对于很小的n也会变大,精确地计算采样分布是不可行的,因此我们使用模拟对其进行采样。(例如,当n=16时 2n2ññ/22ññññ=162Ñ2.63×1035)。大约一千个样本往往足够的(当然也会为我们即将承接探索)。2ññ/2=300 540 1952ñ2.63×1035

我们需要找出两件事:首先,在原假设下抽样分布是什么样的。第二,此测试在不同分布之间的区别程度如何?

有一个复杂的问题:采样分布取决于数据的性质。我们所能做的就是查看现实数据,这些数据被创建为模仿我们感兴趣的研究内容,并希望我们从模拟中学到的知识将适用于我们自己的情况。

实作

为了说明这一点,我在中进行了这项工作R。它自然分为三部分。

  1. 计算检验统计量函数。因为我想更通用一些,所以我的版本通过在(排序的)较大数据集中的值之间线性插值以创建与(排序的)较小数据集的匹配,来处理不同大小的数据集(n xn y)。因为此功能已经由函数完成,所以我只是得出其结果:ŤXÿñXñÿRqqplot

    test.statistic <- function(x, y) {
      transform <- function(z) -log(1-z^2)/2
      fit <- qqplot(x,y, plot.it=FALSE)
      transform(cor(fit$x, fit$y))
    }

    稍微扭曲-不必要但有助于可视化-以使空统计的分布近似对称的方式重新表达相关系数。那transform是在做什么。

  2. 抽样分布的模拟。对于输入,此函数接受迭代次数n.iter以及数组x和中的两组数据y。它输出n.iter测试统计值的数组。即使对于非R用户,其内部工作也应该透明:

    permutation.test <- function(n.iter, x, y) {
      z <- c(x,y)
      n.x <- length(x)
      n.y <- length(y)
      n <- length(z)
      k <- min(n.x, n.y)
      divide <- function() {
        i <- sample.int(n, size=k)
        test.statistic(z[i], z[-i])
      }
      replicate(n.iter, divide())
    }
  3. 尽管这只是我们进行测试所需的全部,但是为了进行研究,我们将需要重复多次测试。因此,我们进行一次测试,并将该代码包装在第三个功能层中(通常f在此处命名),可以重复调用。为了使它对于广泛的研究足够通用,对于输入,它接受要模拟的数据集的大小(n.xn.y),每个置换检验的迭代次数(n.iter),test对计算检验统计量的函数的引用(您将看到暂时说明为什么我们不希望对此进行硬编码)和两个函数来生成iid随机值,一个用于(),一个用于Y()。一个选项Xdist.xÿdist.yplot.it 有助于查看发生了什么情况。

    f <- function(n.x, n.y, n.iter, test=test.statistic, dist.x=runif, dist.y=runif, 
        plot.it=FALSE) {
      x <- dist.x(n.x)
      y <- dist.y(n.y)
      if(plot.it) qqplot(x,y)
    
      t0 <- test(x,y)
      sim <- permutation.test(n.iter, x, y)
      p <- mean(sim > t0) + mean(sim==t0)/2
      if(plot.it) {
        hist(sim, xlim=c(min(t0, min(sim)), max(t0, max(sim))), 
             main="Permutation distribution")
        abline(v=t0, col="Red", lwd=2)
      }
      return(p)
    }

    输出是一个模拟的“ p值”:模拟的比例产生的统计量看起来比为数据实际计算的统计量更为极端。

第(2)部分和第(3)部分非常笼统:您可以通过用test.statistic其他一些计算代替来进行类似的研究,以进行不同的测试。我们在下面做。

初步结果

默认情况下,我们的代码比较从两个均匀分布中提取的数据。我让它做(对,这是相当小的数据集,并因此存在的中等难度的测试用例),然后重复它对于均匀正常比较和均匀的指数比较。(除非您的值大于16,否则不容易将均匀分布与正态分布区分开来,但是通常容易将均匀分布与指数分布(偏度高且右尾长)相区别。)ñX=ñÿ=1616

set.seed(17)             # Makes the results reproducible
n.per.rep <- 1000        # Number of iterations to compute each p-value
n.reps <- 1000           # Number of times to call `f`
n.x <- 16; n.y <- 16     # Dataset sizes

par(mfcol=c(2,3))        # Lay results out in three columns
null <- replicate(n.reps, f(n.x, n.y, n.per.rep))
hist(null, breaks=20)
plot(null)

normal <- replicate(n.reps, f(n.x, n.y, n.per.rep, dist.y=rnorm))
hist(normal, breaks=20)
plot(normal)

exponential <- replicate(n.reps, f(n.x, n.y, n.per.rep, dist.y=function(n) rgamma(n, 1)))
hist(exponential, breaks=20)
plot(exponential)

关联测试结果

XÿXÿ

16X一世16ÿ一世f0.051116各自独立的价值观。那是相当低的功率。但是也许这是不可避免的,所以让我们继续。

右侧图类似地针对指数分布测试均匀分布。 这个结果很奇怪。 该测试往往会得出以下结论:统一数据和指数数据看起来相同。似乎“认为”统一变量和指数变量比两个统一变量相似!这里发生了什么?

问题在于,来自指数分布的数据将倾向于具有一些极高的值。当您针对均匀分布的值进行散点图绘制时,所有其余部分的右上方将有一些点。这对应于非常高的相关系数。因此,每当两个分布中的任何一个产生几个极值时,相关系数都是用于测量分布有多不同的糟糕选择。 这导致了另一个更严重的问题:随着数据集大小的增加,获得一些极端观测值的机会也会增加。因此,随着数据量的增加我们可以预期该测试的性能会越来越差。 多么可怕...

更好的测试

ÿ=X

这是一个R实现:

test.statistic <- function(x, y) {
  ks.test(x,y)$statistic
}

没错:它内置在软件中,因此我们只需要调用它即可。可是等等!如果您仔细阅读本手册,您将了解到(a)试验设备的p值,但(b)该p值(严重)不正确时,这两个xy的数据集。当您相信自己确切地知道数据x来自什么分布并且想要查看是否正确时,可以使用它。因此,该测试无法适当地容纳有关数据y来源分布的不确定性。

没问题!排列测试框架仍然有效。通过对进行先前的更改test.statistic,我们所要做的就是重新运行先前的研究,并且保持不变。这是结果。

KS测试研究

p=0.20

700.0511

30α=550α=100.10

结论

因此,相关性测试的问题不是由于此设置中的某些固有困难。相关性测试不仅性能非常差,而且与广为人知的可用测试相比也很差。(我想这是不可接受的,这意味着它的平均性能通常会比KS测试的排列版本差,这意味着没有理由使用它。)


很好的解释,我喜欢看到其他人做一些模拟。我仍然很难理解为什么关联似乎可以预测一点(或者我们甚至不能说那么多吗?)。另外,唯一模糊的部分(但仍然是了解KS为什么起作用的关键部分)是关于“ x = y”线的(“它计算出在其QQ图中与y = x线的最大垂直偏差。)(当数据来自相同的分布,QQ图趋于遵循这条线。”)尽管如此,我还是学到了很多东西
PascalVKooten

1
1个

KS测试两个数据集是否来自相同的分布函数,即它们的CDF是否相同。但是在我看来,OP可能正在寻找一个测试,该测试将说Exp(0.1)与Exp(100)是相同的事物,而Normal(0,5)与Normal(10,.2)是相同的)。KS根本不执行此操作,实际上一般来说这可能是不可能的(而且我真的不知道您何时需要它)。但是在一个简单的情况下,可以进行一些测试以测试一个变形如何转换到另一个变形中(例如,居中和标准化将很好地处理法线,尽管不是指数形式)。
道加尔,

@Dougal我重新阅读了您的评论。说“分布相同”是指CDF相同是正确的吗?
PascalVKooten 2014年

μσ2

5

不,相关性不是对此的良好测试。

x <- 1:100 #Uniform
y <- sort(rnorm(100)) #Normal
cor(x,y) #.98

我不知道有一个很好的测试来比较例如两个分布是否均是正态分布,但可能具有不同的均值和标准差。间接地,您可以分别测试每个分布的正态性,如果两个分布均看起来正常,则猜测它们都是正态分布。


0

如果存在足够多的变量,则这可能显示与大小排序值的更多相关性。但是,它似乎并不是一种特别有用的方法,尤其是因为它几乎没有提供估计他们可能使用相同模型的置信度的方法。

您可能会遇到的一个问题是,当您的模型具有相似的均值和偏度,但峰度有所不同时,因为适度的度量值可能足以很好地拟合相关性。

将两个变量针对不同的分布建模以查看每个变量最有可能并比较结果似乎更为合理。

标准化两个值,对每个值进行排序和绘制可能会有一些好处-这将使您能够看到拟合比较-并且您还可以为两个值绘制一个可能的模型,这与您的建议有关,而不是期待一个具体的答案,只是关于分布的紧密程度的直观想法。


(1)我的分析发现,第一句中表达的期望没有得到证实:如果变量足够多,则如果一个分布的尾巴较短,而另一个分布则有较小的机会表现出更多的极值,则相关性往往过高。(2)当您“针对不同的分布建模...”时,如何控制该处方所隐含的多个相关测试?
ub
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.