¿Cómo simular medidas repetidas de resultados multivariados en R?


9

@whuber ha demostrado cómo simular resultados multivariados ( y1 , y2 e ) para un punto de tiempo.y3

Como sabemos, los datos longitudinales a menudo ocurren en estudios médicos. Mi pregunta es cómo simular resultados multivariados de medidas repetidas en R? Por ejemplo, medimos repetidamente , e en 5 puntos de tiempo diferentes para dos grupos de tratamiento diferentes.y1y2y3

Respuestas:


2

Para generar datos normales multivariados con una estructura de correlación especificada, debe construir la matriz de covarianza de varianza y calcular su descomposición de Cholesky utilizando la cholfunción. El producto de la descomposición de Cholesky de la matriz vcov deseada y los vectores de observaciones normales aleatorios independientes producirán datos normales aleatorios con esa matriz de covarianza de varianza.

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

Use la función rmvnorm (), toma 3 argumentos: la matriz de covarianza de varianza, las medias y el número de filas.

La sigma tendrá 3 * 5 = 15 filas y columnas. Uno para cada observación de cada variable. Hay muchas formas de establecer estos 15 ^ 2 parámetros (ar, simetría bilateral, no estructurada ...). Sin embargo, si completa esta matriz, tenga en cuenta los supuestos, particularmente cuando establece una correlación / covarianza en cero, o cuando establece dos varianzas para que sean iguales. Para empezar, una matriz sigma podría verse así:

 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)

Entonces, la sigma [1,12] es .2 y eso significa que la covarianza entre la primera observación de Y1 y la segunda observación de Y3 es .2, condicional en todas las otras 13 variables. No todas las filas diagonales tienen que ser el mismo número: esa es una suposición simplificadora que hice. A veces tiene sentido, a veces no. En general, significa que la correlación entre una tercera observación y una cuarta es la misma que la correlación entre una primera y una segunda.

También necesitas medios. Podría ser tan simple como

 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)

Aquí los primeros 5 son los medios para las 5 observaciones de Y1, ..., los últimos 5 son las observaciones de Y3

luego obtenga 2000 observaciones de sus datos con:

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")

Donde Y11 es la primera observación de Y1, ..., Y15 es la quinta obs de Y1 ...


1
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/2y

@whuber su sintaxis es útil, pero es diferente de lo que escribí. Creo que la diferencia es un poco importante. Pienso en lo que escribí como AR (1) y tienes una entrada en la correlación cruzada entre la última observación de una variable y la primera observación de la siguiente variable. En otras palabras, creo que sigma [5,6] debería ser 0.
Seth

55 533335 55 5

Pensé que mi segunda sigma era un simple ejemplo de permitir que la variación entre Y1 e Y3 fuera positiva. Edité un poco la respuesta para aclarar que la matriz está allí para ser configurada dependiendo del proceso de generación de datos. Definitivamente hay muchas maneras de desollar a este gato.
Seth

yyo
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.