生成具有特定相关阈值的随机变量
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我做的有效率吗?
我们想生成 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)
我正在生成具有指定范围的随机变量,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我做的有效率吗?
我们想生成 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)