假设我想用三个变量进行两次模拟。在第一个模拟中(让我们称之为sima)我想生成三个统一或正态的分布式变量,这些变量是不相关的。然后我想要一些分析的东西。 之后我想重复分析,但我现在想要的是,我从第一次模拟(sima)生成的变量是相关的:
我知道,我可以使用mvrnorm函数,但我不知道如何“关联”我从第一次模拟生成的数据
例如
a <- rnorm(1000)
b <- rnorm(1000)
c <- rnorm(1000)
x <- matrix(c(a,b,c), ncol=3)
然后我想将矩阵x与例如:
的相关性相关联cor(a,b)=0.4
cor(a,c)=0.3
cor(b,c)=0.5
答案 0 :(得分:1)
如果我理解正确,您可以使用MASS::mvrnorm
samples <- 200
rab <- 0.4
rac <- 0.3
rbc <- 0.5
data <- MASS::mvrnorm(n=samples,
mu=c(0, 0, 0),
Sigma=matrix(c(1, rab, rac,
rab, 1, rbc,
rac, rbc, 1),
nrow=3),
empirical=TRUE)
A <- data[, 1]
B <- data[, 2]
C <- data[, 3]
cor(data)
cor(A, B)
cor(A, C)
cor(B, C)
> cor(data)
[,1] [,2] [,3]
[1,] 1.0 0.4 0.3
[2,] 0.4 1.0 0.5
[3,] 0.3 0.5 1.0
> cor(A, B)
[1] 0.4
> cor(A, C)
[1] 0.3
> cor(B, C)
[1] 0.5
答案 1 :(得分:0)
你可以切换它。首先创建相关数据,如上面DJV的帖子。然后通过随机洗牌去相关。这并不能保证样本中的零相关性 - 但对于独立采样数据也是如此。
# first create `data` as in DJV's post. Then:
data_indep <- apply(data, 2, sample)
cor(data2)
[,1] [,2] [,3]
[1,] 1.00000000 0.07503708 -0.13515778
[2,] 0.07503708 1.00000000 -0.02912137
[3,] -0.13515778 -0.02912137 1.00000000
为了显示平均而言,重新洗牌的数据是不相关的(这在分析上是正确的,但让我们检查一下):
replicate(10000, {data2 <- apply(data, 2, sample); cor(data2)}) -> cors
apply(cors, 1:2, mean)
[,1] [,2] [,3]
[1,] 1.0000000000 -0.0009533055 0.0014867635
[2,] -0.0009533055 1.0000000000 0.0002847576
[3,] 0.0014867635 0.0002847576 1.0000000000
我觉得还不错。