首页 文章

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

提问于
浏览
3

我想为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

    我不确定我是否理解你的问题 .

    但是为了防止它对你有所帮助,我在这里提供了一个使用你的“数据”的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

    谢谢你的电子邮件,很高兴被问到!我不完全理解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
    

相关问题