Answers:
让我们找出这是否是一个很好的测试。 除了声称它是不好的或者一度表明它无法正常工作之外,它还有很多其他功能。大多数测试在某些情况下效果不佳,因此我们经常面临确定任何提议的测试可能是一个不错选择的情况。
像任何假设检验一样,该假设由(a)空假设和交替假设以及(b)旨在区分假设的检验统计量(相关系数)组成。
零假设是两个变量来自同一分布。确切地说,让我们命名变量和并假定我们已经观察到X的实例,称为x i = (x 1,x 2,… ,x n x),而Y的n y个实例,称为y。我。零假设是X和Y的所有实例都是独立的并且分布相同(iid)。
让我们以作为备用的假设,即(a)中的所有实例是独立同分布的,根据一些潜在分布和(b)的所有实例是独立同分布的,根据一些潜在分布但(c)中不同于˚F ÿ。(因此,我们将不再寻找x i之间的相关性,y i之间的相关性,x i和y j之间的相关性,或x或y之间的分布差异:假定不是合理)F X Y F Y F X
拟议的测试统计量假设(称为该公共值n),并计算(x [ i ],y [ i ])的相关系数(通常,[ i ]表示第i 个最小的)数据)。称其为t (x ,y )。
在这种情况下,无论提出什么统计,我们都可以始终进行排列检验。 在原假设下,数据((x 1,x 2,… ,x n),(y 1,y 2,… ,y n))的可能性与2 n的任何置换的可能性相同数据值。换句话说,将数据的一半分配给X,另一半分配给Y是纯随机的巧合。这是iid假设和假设的简单直接的结果。
因此,采样分布,有条件的观测X 我和ÿ 我,是所有值的分布吨达到对所有(2 Ñ )!数据的排列。我们对此感兴趣,因为对于任何给定的预期测试大小α,例如α = .05(对应于95%的置信度),我们将根据t的采样分布构造一个两侧临界区域:它包含最极端的的可能值的%吨(偏高,因为高相关性是类似的分布和相关性低一致是不是)。这就是我们确定相关系数必须多大才能决定数据来自不同分布的方法。
因为(或者,如果你喜欢,( 2 ñ(计数将2n个数据拆分为大小为n的两个片段的方法的数目)即使对于很小的n也会变大,精确地计算采样分布是不可行的,因此我们使用模拟对其进行采样。(例如,当n=16时,( 2n和(2Ñ)!≈2.63×1035)。大约一千个样本往往足够的(当然也会为我们即将承接探索)。
我们需要找出两件事:首先,在原假设下抽样分布是什么样的。第二,此测试在不同分布之间的区别程度如何?
有一个复杂的问题:采样分布取决于数据的性质。我们所能做的就是查看现实数据,这些数据被创建为模仿我们感兴趣的研究内容,并希望我们从模拟中学到的知识将适用于我们自己的情况。
为了说明这一点,我在中进行了这项工作R
。它自然分为三部分。
计算检验统计量函数。因为我想更通用一些,所以我的版本通过在(排序的)较大数据集中的值之间线性插值以创建与(排序的)较小数据集的匹配,来处理不同大小的数据集(n x ≠ n y)。因为此功能已经由函数完成,所以我只是得出其结果:R
qqplot
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
是在做什么。
抽样分布的模拟。对于输入,此函数接受迭代次数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())
}
尽管这只是我们进行测试所需的全部,但是为了进行研究,我们将需要重复多次测试。因此,我们进行一次测试,并将该代码包装在第三个功能层中(通常f
在此处命名),可以重复调用。为了使它对于广泛的研究足够通用,对于输入,它接受要模拟的数据集的大小(n.x
和n.y
),每个置换检验的迭代次数(n.iter
),test
对计算检验统计量的函数的引用(您将看到暂时说明为什么我们不希望对此进行硬编码)和两个函数来生成iid随机值,一个用于(),一个用于Y()。一个选项dist.x
dist.y
plot.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,否则不容易将均匀分布与正态分布区分开来,但是通常容易将均匀分布与指数分布(偏度高且右尾长)相区别。)
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)
f
各自独立的价值观。那是相当低的功率。但是也许这是不可避免的,所以让我们继续。
右侧图类似地针对指数分布测试均匀分布。 这个结果很奇怪。 该测试往往会得出以下结论:统一数据和指数数据看起来相同。似乎“认为”统一变量和指数变量比两个统一变量更相似!这里发生了什么?
问题在于,来自指数分布的数据将倾向于具有一些极高的值。当您针对均匀分布的值进行散点图绘制时,所有其余部分的右上方将有一些点。这对应于非常高的相关系数。因此,每当两个分布中的任何一个产生几个极值时,相关系数都是用于测量分布有多不同的糟糕选择。 这导致了另一个更严重的问题:随着数据集大小的增加,获得一些极端观测值的机会也会增加。因此,随着数据量的增加,我们可以预期该测试的性能会越来越差。 多么可怕...
这是一个R
实现:
test.statistic <- function(x, y) {
ks.test(x,y)$statistic
}
没错:它内置在软件中,因此我们只需要调用它即可。可是等等!如果您仔细阅读本手册,您将了解到(a)试验设备的p值,但(b)该p值(严重)不正确时,这两个x
和y
的数据集。当您相信自己确切地知道数据x
来自什么分布并且想要查看是否正确时,可以使用它。因此,该测试无法适当地容纳有关数据y
来源分布的不确定性。
没问题!排列测试框架仍然有效。通过对进行先前的更改test.statistic
,我们所要做的就是重新运行先前的研究,并且保持不变。这是结果。
因此,相关性测试的问题不是由于此设置中的某些固有困难。相关性测试不仅性能非常差,而且与广为人知的可用测试相比也很差。(我想这是不可接受的,这意味着它的平均性能通常会比KS测试的排列版本差,这意味着没有理由使用它。)
不,相关性不是对此的良好测试。
x <- 1:100 #Uniform
y <- sort(rnorm(100)) #Normal
cor(x,y) #.98
我不知道有一个很好的测试来比较例如两个分布是否均是正态分布,但可能具有不同的均值和标准差。间接地,您可以分别测试每个分布的正态性,如果两个分布均看起来正常,则猜测它们都是正态分布。
如果存在足够多的变量,则这可能显示与大小排序值的更多相关性。但是,它似乎并不是一种特别有用的方法,尤其是因为它几乎没有提供估计他们可能使用相同模型的置信度的方法。
您可能会遇到的一个问题是,当您的模型具有相似的均值和偏度,但峰度有所不同时,因为适度的度量值可能足以很好地拟合相关性。
将两个变量针对不同的分布建模以查看每个变量最有可能并比较结果似乎更为合理。
标准化两个值,对每个值进行排序和绘制可能会有一些好处-这将使您能够看到拟合比较-并且您还可以为两个值绘制一个可能的模型,这与您的建议有关,而不是期待一个具体的答案,只是关于分布的紧密程度的直观想法。