从相关矢量中抽样并应用它来生成相关数据

时间:2015-02-28 20:32:13

标签: r correlation

我想为20项研究产生三个相关结果。每项研究有3组(对照组,治疗组1和治疗组2)。对于对照组,我的生成值是:mean = 0,sd = 1;对于两个治疗组,我的生成值是:mean = 0.40,sd = 1。我想要完成的两件事(我遇到了麻烦):

1)条件1:我想生成相关结果,以便每对结果之间存在不同的相关性。应从相关矢量中采样相关,rho = c(0.6,0.7,0.8);和

2)条件2:我想生成相关结果,以便研究的一个子集(一半)将来自相关向量的样本,rho1 = c(0.6,0.7,0.8),另一个子集(剩余的)将从相关矢量中采样一半,rho2 = c(0.3,0.4,0.5)

我正在使用“mvtnorm”包来生成每个组的结果。这是我的代码(请原谅我对模拟和R的基本知识):

 library(“mvtnorm”)
 set.seed(0307)
 mean_c = c(0, 0, 0)
 mean_t1 = c(0.4, 0.4, 0.4)
 mean_t2 = c(0.4. 0.4, 0.4)
 k <- 20    # no. of studies
 n <- 50    # sample size

 rho <-     # the value is sampled from a vector of correlations 
 for (i in 1:k) {
   Yc <-rmvnorm(n=n, mean=mean_c, sigma=rho)
   Yt1<-rmvnorm(n=n, mean=mean_t1, sigma=rho)
   Yt2 <-rmvnorm(n=n, mean=mean_t2, sigma=rho)
 }

我感谢编程专家提供的任何意见。谢谢!

2 个答案:

答案 0 :(得分:1)

我不确定我是否明白你的问题。

但是为了防止它对你有所帮助,我在这里提供了一个使用你的&#34;数据&#34;的rmvnorm函数的例子。我修改了一些数字以清除所有依赖项

library(mvtnorm)
set.seed(1234)

k = 10000
means = c(0, 0.4, 0.4)
sigmas = c(2, 1, 1)
rhoXY = 0.6
rhoXZ = 0.7
rhoYZ = 0.8
varMatrix <- matrix(c(
    sigmas[1]*sigmas[1], rhoXY*sigmas[1]*sigmas[2], rhoXZ*sigmas[1]*sigmas[3],
    rhoXY*sigmas[1]*sigmas[2], sigmas[2]*sigmas[2], rhoYZ*sigmas[2]*sigmas[3],
    rhoXZ*sigmas[1]*sigmas[3], rhoYZ*sigmas[2]*sigmas[3], sigmas[3]*sigmas[3]
    ), 
    ncol=3, byrow=TRUE)

# Generate data
Yc <- rmvnorm(n = k, 
             mean = means, 
             sigma = varMatrix, method="chol")


# Check data satisfies what it should
colMeans(Yc)
var(Yc)
cor(Yc[,1], Yc[,2])
cor(Yc[,1], Yc[,3])
cor(Yc[,2], Yc[,3])

检查输出

> colMeans(Yc)
[1] 0.007118385 0.406214538 0.401605464
> var(Yc)
         [,1]      [,2]      [,3]
[1,] 4.024896 1.2026685 1.4204561
[2,] 1.202668 0.9998153 0.8046641
[3,] 1.420456 0.8046641 1.0052659
> cor(Yc[,1], Yc[,2])
[1] 0.599527
> cor(Yc[,1], Yc[,3])
[1] 0.7061712
> cor(Yc[,2], Yc[,3])
[1] 0.802628

答案 1 :(得分:0)

感谢您的电子邮件,很高兴被问到!我不完全理解rmvnorm函数(或你的请求!),但看起来Roc回答了你的问题。然而,使用两半中的不同rho值,执行该功能20次是很简单的。我的代码可能不是最优雅的 - 有可能通过一次调用rmvnorm来生成所有这些数据,而不是像我的代码那样生成20,但这似乎工作得很好。您可以像使用方括号一样访问20项研究的结果。

library(mvtnorm)
set.seed(1234)


k = 10000
means = c(0, 0.4, 0.4)
sigmas = c(1, 1, 1)
rho.type1 <- c(0.3, 0.4, 0.5)
rho.type2 <- c(0.6, 0.7, 0.8)
study.number <-20
Yc <- matrix(0, ncol = 3, nrow = k* study.number)

for(i in 1: study.number)
{
  ifelse(i < 11, rho <- rho.type1, rho <- rho.type2)
  varMatrix <- matrix(c(
      sigmas[1]*sigmas[1], rho[1]*sigmas[1]*sigmas[2], rho[2]*sigmas[1]*sigmas[3],
      rho[1]*sigmas[1]*sigmas[2], sigmas[2]*sigmas[2], rho[3]*sigmas[2]*sigmas[3],
      rho[2]*sigmas[1]*sigmas[3], rho[3]*sigmas[2]*sigmas[3], sigmas[3]*sigmas[3]
      ), 
      ncol=3, byrow=TRUE)

# Generate data, and save the 20 datasets in a list called Yc
  Yc[(1 + (i-1)*k):(i*k), ] <- rmvnorm(n = k, 
                mean = means, 
                sigma = varMatrix, method="chol")
}
Yc <- data.frame(Yc, study = rep(1:20, each = k))

# Check output 
cor(Yc[Yc$study==1,1], Yc[Yc$study==1,2]) # To check the first entry in the list
for(i in 1:20) print(cor(Yc[Yc$study==i,1], Yc[Yc$study==i,2])) # To check the lot