如何在R中模拟重复测量的多元结果?


9

@whuber已经演示了如何在一个时间点上模拟多元结果(,和)。y1y2y3

众所周知,纵向数据经常出现在医学研究中。我的问题是如何在R中模拟重复测量的多元结果?例如,对于两个不同的治疗组,我们在5个不同的时间点重复测量,和。y1y2y3

Answers:


2

要生成具有指定相关结构的多元正态数据,您需要构造方差协方差矩阵并使用该chol函数计算其Cholesky分解。所需vcov矩阵的Cholesky分解与观测值的独立随机法线向量的乘积将产生带有该方差协方差矩阵的随机法线数据。

v <- matrix(c(2,.3,.3,2), 2)
cv <- chol(v)

o <- replicate(1000, {
  y <- cv %*% matrix(rnorm(100),2)

  v1 <- var(y[1,])
  v2 <- var(y[2,])
  v3 <- cov(y[1,], y[2,])

  return(c(v1,v2,v3))
})

## MCMC means should estimate components of v
rowMeans(o)

2

使用rmvnorm()函数,它包含3个参数:方差协方差矩阵,均值和行数。

sigma将具有3 * 5 = 15行和列。每个变量的每个观察值一个。设置这些15 ^ 2参数的方法有很多(弧形,双侧对称,非结构化...)。但是,您在填写此矩阵时要注意这些假设,尤其是当您将相关性/协方差设置为零时,或者将两个方差设置为相等时。首先,一个sigma矩阵可能看起来像这样:

 sigma=matrix(c(
    #y1             y2             y3 
    3 ,.5, 0, 0, 0, 0, 0, 0, 0, 0,.5,.2, 0, 0, 0,
    .5, 3,.5, 0, 0, 0, 0, 0, 0, 0,.2,.5,.2, 0, 0,
    0 ,.5, 3,.5, 0, 0, 0, 0, 0, 0, 0,.2,.5,.2, 0,
    0 , 0,.5, 3,.5, 0, 0, 0, 0, 0, 0, 0,.2,.5,.2,
    0 , 0, 0,.5, 3, 0, 0, 0, 0, 0, 0, 0, 0,.2,.5,
    0 ,0 ,0 ,0 , 0, 3,.5, 0, 0, 0, 0, 0, 0, 0, 0,
    0 ,0 ,0 ,0 ,0 ,.5, 3,.5, 0, 0, 0, 0, 0, 0, 0,
    0 ,0 ,0 ,0 ,0 ,0 ,.5, 3,.5, 0, 0, 0, 0, 0, 0,
    0 ,0 ,0 ,0 ,0 ,0 ,0 ,.5, 3,.5, 0, 0, 0, 0, 0,
    0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,.5, 3, 0, 0, 0, 0, 0,
    .5,.2,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0, 3,.5, 0, 0, 0,
    .2,.5,.2,0 ,0 ,0 ,0 ,0 ,0 ,0 ,.5, 3,.5, 0, 0,
    0 ,.2,.5,.2,0 ,0 ,0 ,0 ,0 ,0 ,0 ,.5, 3,.5, 0,
    0 ,0 ,.2,.5,.2,0 ,0 ,0 ,0 ,0 ,0 ,0 ,.5, 3,.5,
    0 ,0 ,0 ,.2,.5,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,.5, 3

    ),15,15)

因此sigma [1,12]为.2,这意味着Y1的第一个观测值与Y3的第二个观测值之间的协方差为.2,并且以所有其他13个变量为条件。对角行不一定都必须是相同的数字:这是我所做的简化假设。有时候这很有意义,有时候却没有。通常,这意味着第三观察值与第四观察值之间的相关性与第一观察值与第二观察值之间的相关性相同。

您还需要手段。可能很简单

 meanTreat=c(1:5,51:55,101:105)
 meanControl=c(1,1,1,1,1,50,50,50,50,50,100,100,100,100,100)

在这里,前5个是Y1,...的5个观测值的均值,后5个是Y3的观测值

然后使用以下方法对您的数据进行2000次观察:

sampleT=rmvnorm(1000,meanTreat,sigma)
sampleC=rmvnorm(1000,meanControl,sigma)
 sample=data.frame(cbind(sampleT,sampleC) )
  sample$group=c(rep("Treat",1000),rep("Control",1000) )

colnames(sample)=c("Y11","Y12","Y13","Y14","Y15",
                   "Y21","Y22","Y23","Y24","Y25",
                   "Y31","Y32","Y33","Y34","Y35")

其中Y11是Y1的第一个观测值,...,Y15是Y1的第5个观测值。


1
要像第一个示例Seth一样创建矩阵,请尝试以下操作:n <- 3*5; sigma <- diag(1, nrow=n, ncol=n); sigma[rbind(cbind(1:n-1,1:n),cbind(1:n,1:n-1))] <- 1/2。类似的方法将生成第二个示例。但是,它们有一个共同的问题:您在每个期间都丢失了之间的协方差这些矩阵不能反映出重复的度量结构。y
whuber

@whuber,您的语法很有用,但与我写的有所不同。我认为差异有点重要。我想到了我写为AR(1)的内容,并且您在一个变量的最后一次观察与下一个变量的第一次观察之间的互相关中有一个条目。换句话说,我认为sigma [5,6]应该为0。–
Seth

嗯,现在我知道您在做什么:在第一个示例中,您将创建三个AR(1)系列。我之所以错过,是因为我认为OP也关注该系列之间的相关性:这就是“多变量结果”的含义。从该角度看,您似乎想将这些相关矩阵视为 ×块矩阵,每个条目具有 ×矩阵,而不是 ×块矩阵与 ×块。55333355
whuber

我以为我的第二个西格玛是允许Y1和Y3之间的差异为正的简单示例。我对答案进行了一些编辑,以使矩阵更加清晰,可以根据数据生成过程来配置矩阵。肯定有很多方法可以使这只猫皮肤化。
赛斯2012年

足够公平,但是您的方法会带来困难,因为将与AR模型之间的多元相关性结合起来并非易事。例如,您是否知道第二个矩阵不能为正定?(C(-102,177,-204,177,-102,0,0,0,0,0,102,-177,204,-177的“方差”,102)为负。)yi
whuber
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.