如何模拟与其他两个现有向量相关(以不同方式)的向量

时间:2017-12-12 14:47:58

标签: r simulate

我想模拟一个与另外两个现有变量相关的向量。到目前为止我尝试了什么

# some correlation matrix
desiredCorrelations = matrix(c(1, .4, 0, 
                              .4, 1, .3,
                               0, .3, 1), nrow = 3)

# some simulated data based on the correlation matrix
dat = mvrnorm(n = 1000, mu = rep(3, 3), Sigma = desiredCorrelations, empirical = TRUE) 

n = nrow(dat)
k = ncol(desiredCorrelations)
x = matrix( rnorm(n*k), nc=k )
x[,1] = dat[,1]
y = x %*% solve(chol(var(x))) %*% chol(desiredCorrelations)
# cor(y)      # Desired correlation matrix

apply(dat, 2, summary)
apply(y, 2, summary)

基于这段代码,相关性是正确的,但只有y的第一列与原始模拟数据的第一列相同。但是,我希望两列保持不变,而第三列则使用所需的相关矩阵进行模拟。

提前感谢任何建议或提示!

1 个答案:

答案 0 :(得分:0)

我为此基于MattBagg's code为此编写了一个函数,该函数采用向量x并返回具有指定均值,标准差和相关性的向量:

simcor <- function (x, ymean=0, ysd=1, correlation=0) {
    n <- length(x)

    y <- rnorm(n)
    z <- correlation * scale(x)[,1] + sqrt(1 - correlation^2) * 
         scale(resid(lm(y ~ x)))[,1]
    yresult <- ymean + ysd * z
    yresult
}