如何重新排列2D数据以获得给定的相关性?


9

我有以下带有两个连续变量的简单数据集;即:

d = data.frame(x=runif(100,0,100),y = runif(100,0,100))
plot(d$x,d$y)
abline(lm(y~x,d), col="red")
cor(d$x,d$y) # = 0.2135273

基本分配

我需要重新排列数据,以使变量之间的相关性达到〜0.6。我需要使两个变量的均值和其他描述性统计信息(sd,min,max等)保持恒定。

我知道可以与给定数据进行几乎任何关联,即:

d2 = with(d,data.frame(x=sort(x),y=sort(y)))
plot(d2$x,d2$y)
abline(lm(y~x,d2), col="red")
cor(d2$x,d2$y) # i.e. 0.9965585

在此处输入图片说明

如果我尝试将sample函数用于此任务:

cor.results = c()
for(i in 1:1000){
    set.seed(i)
    d3 = with(d,data.frame(x=sample(x),y=sample(y)))
    cor.results =  c(cor.results,cor(d3$x,d3$y))
}

我得到了很多相关性:

> summary(cor.results)
     Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
-0.281600 -0.038330 -0.002498 -0.001506  0.034380  0.288800

但是此范围取决于数据帧中的行数,并且随着大小的增加而减少。

> d = data.frame(x=runif(1000,0,100),y = runif(1000,0,100))
> cor.results = c()
> for(i in 1:1000){
+ set.seed(i)
+ d3 = with(d,data.frame(x=sample(x),y=sample(y)))
+ cor.results =  c(cor.results,cor(d3$x,d3$y))
+ }
> summary(cor.results)
      Min.    1st Qu.     Median       Mean    3rd Qu.       Max. 
-0.1030000 -0.0231300 -0.0005248 -0.0005547  0.0207000  0.1095000

我的问题是:

如何重新排列此类数据集以获得给定的相关性(即0.7)?(如果方法消除了对数据集大小的依赖,那也将是一件好事)

Answers:


6

这是一种基于生成附加随机数来重新排列数据的方法。

我们从具有指定相关性的二元正态分布中抽取样本。接下来,我们计算获得的和值的等级。这些等级用于对原始值进行排序。对于这种方法,我们对原始和值都进行了顶级排序。Xÿxy

首先,我们创建实际的数据集(如您的示例中所示)。

set.seed(1)
d <- data.frame(x = runif(100, 0, 100), y = runif(100, 0, 100))

cor(d$x, d$y)
# [1] 0.01703215

现在,我们指定一个相关矩阵。

corr <- 0.7  # target correlation
corr_mat <- matrix(corr, ncol = 2, nrow = 2)
diag(corr_mat) <- 1
corr_mat
#      [,1] [,2]
# [1,]  1.0  0.7
# [2,]  0.7  1.0

我们根据二元正态分布生成随机数据 μ=0σ=1个(对于两个变量)和指定的相关性。在R中,可以使用包中的mvrnorm函数来完成此操作MASS。我们empirical = TRUE用来表明相关性是经验相关性(不是总体相关性)。

library(MASS)
mvdat <- mvrnorm(n = nrow(d), mu = c(0, 0), Sigma = corr_mat, empirical = TRUE)

cor(mvdat)
#      [,1] [,2]
# [1,]  1.0  0.7
# [2,]  0.7  1.0

随机数据与指定的相关性完全匹配。

接下来,我们计算随机数据的秩。

rx <- rank(mvdat[ , 1], ties.method = "first")
ry <- rank(mvdat[ , 2], ties.method = "first")

要对中的原始数据使用排名d,我们必须对原始数据进行排序。

dx_sorted <- sort(d$x)
dy_sorted <- sort(d$y)

现在,我们可以使用等级来指定排序数据的顺序。

cor(dx_sorted[rx], dy_sorted[ry])
# [1] 0.6868986

所获得的相关性与指定的相关性不完全匹配,但是差异较小。

dx_sorted[rx]dy_sorted[ry]中,是中原始数据的重新采样版本d


2
+1太酷了。步骤是:1)生成具有正确Pearson相关性的普通数据,2)使原始数据和生成的数据精确匹配等级相关性,3)现在原始数据具有大致相同的Pearson相关性。为什么这样做?是否有分析结果表明确实如此?边界不等式是否使各种相关度量对于行为良好的分布或其他事物而言彼此接近?
比尔

1
@条例草案我无法分析地解释这种方法。这只是一个想法。但是,您以很好的方式总结了这些步骤。谢谢。
Sven Hohenstein,2015年

2

为了生成具有指定相关性的两个均匀分布,Ruscio&Kaczetow(2008)算法将起作用。他们提供R代码。然后,您可以使用简单的线性函数进行变换,以获取目标的最小值,最大值,均值和SD。

Ruscio&Kaczetow算法

我将总结双变量情况,但它也可以处理多变量问题。不相关的XØÿØ以任何形状(例如,均匀)生成。然后,X1个ÿ1个 被生成为具有中间相关性的双变量正态。 X1个ÿ1个 被替换 X0ÿ0以保持等级的方式。根据r(X1个ÿ1个)太低或太高。 X2ÿ2生成具有新的中间相关性的双变量正态。重复。

请注意,这与@Sven Hohenstein的解决方案非常相似,不同之处在于它是迭代的,因此中间相关性将越来越接近目标相关性,直到它们无法区分为止。另外,请注意,该算法可用于生成大量样本(例如N = 1百万),以从中提取较小的样本-如果您需要采样误差,这很有用。

对于相关文章:相关和非正态分布

保留描述性统计

不能保证算法会产生完全相同的描述。但是,由于均匀分布的均值和SD由其最小值和最大值确定,因此您只需调整最小值和最大值即可固定所有内容。

XGÿG 是您在Ruscio&Kaczetow算法的最后一次迭代中生成的变量, XFÿF 是您希望拥有的最终变量(带有目标描述),并且 Xÿ 是您数据集中的原始变量。

计算 XF=XG-一世ñX一个XX-一世ñX/一个XXG-一世ñXG

为...做同样的事情 ÿF

参考:

Ruscio,J。和Kaczetow,W。(2008)。使用迭代算法模拟多元非正态数据。多元行为研究,43,355–381。doi:10.1080 / 00273170802285693


1

我猜想,当您说“重新采样”时,您的意思是“模拟”,这更为笼统。以下是我所知道的模拟具有指定相关性的正态,双变量数据的最简洁方法。用您自己想要的r和n值代替。

r = .6
n = 1000
x = rnorm(n) 
z = rnorm(n) 
y = (r/(1-r^2)^.5)*x + z

cor(x,y)
plot(x,y)
abline(lm(y~x), col="red")

3
不,我的意思是“重采样”。我需要使两个变量的均值和其他描述性统计信息(sd,min,max)保持恒定。更新了问题。
Yuriy Petrovskiy
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.