生成具有特定相关阈值的随机变量

Generating random variables with specific correlation threshold value

我正在生成具有指定范围的随机变量,dimension.I为此编写了以下代码。

generateRandom <- function(size,scale){
  result<- round(runif(size,1,scale),1)
  return(result)
}

flag=TRUE
x <- generateRandom(300,6)
y <- generateRandom(300,6)
while(flag){
  corrXY <- cor(x,y)
  if(corrXY>=0.2){
    flag=FALSE
  }
  else{
    x <- generateRandom(300,6)
    y <- generateRandom(300,6)
  }

}

我想跟随 6 个变量 大小 300比例 所有变量都在 1 到 6 除了 一个变量,它的比例为 1-7,其中具有以下相关结构。

1 0.45  -0.35  0.46  0.25 0.3
     1   0.25  0.29  0.5  -0.3
         1    -0.3   0.1   0.4
               1     0.4   0.6
                      1    -0.4
                             1

但是当我尝试增加阈值时,我的程序变得非常 slow.Moreover,我想要超过 7 个大小为 300 的变量,并且在每对这些变量之间我想要一些特定的相关性 threshold.How我做的有效率吗?

这个答案的灵感直接来自 here and there

我们想生成 300 个 6 变量均匀分布样本,相关结构等于

Rhos <- matrix(0, 6, 6)
Rhos[lower.tri(Rhos)] <- c(0.450, -0.35, 0.46, 0.25, 0.3,
                           0.25, 0.29, 0.5, -0.3, -0.3,
                           0.1, 0.4, 0.4, 0.6, -0.4)
Rhos <- Rhos + t(Rhos)
diag(Rhos) <- 1

我们首先从这个相关结构生成高斯copula的相关结构:

Copucov <- 2 * sin(Rhos * pi/6)

这个矩阵不是正定的,我们用最近的正定矩阵代替:

library(Matrix)
Copucov <- cov2cor(nearPD(Copucov)$mat)

这个相关结构可以作为MASS::mvrnorm的输入之一:

G <- mvrnorm(n=300, mu=rep(0,6), Sigma=Copucov, empirical=TRUE)

然后我们将 G 转换为一个多元均匀样本,其值范围为 1 到 6,除了最后一个变量范围为 1 到 7:

U <- matrix(NA, 300, 6)
U[, 1:5] <- 5 * pnorm(G[, 1:5]) + 1
U[, 6] <- 6 * pnorm(G[, 6]) + 1

四舍五入后(取离copula的协方差矩阵最近的正矩阵等),相关结构变化不大:

Ur <- round(U, 1)
cor(Ur)