Come simulare esiti multivariati di misure ripetute in R?


9

@whuber ha dimostrato come simulare esiti multivariati ( , y 2 e y 3 ) per un punto temporale.y1y2y3

Come sappiamo, i dati longitudinali si verificano spesso negli studi medici. La mia domanda è come simulare esiti multivariati di misure ripetute in R? Ad esempio, misuriamo ripetutamente , y 2 e y 3 in 5 diversi punti temporali per due diversi gruppi di trattamento.y1y2y3

Risposte:


2

Per generare dati normali multivariati con una struttura di correlazione specificata, è necessario costruire la matrice di covarianza della varianza e calcolare la sua decomposizione di Cholesky utilizzando la cholfunzione. Il prodotto della decomposizione di Cholesky della matrice vcov desiderata e dei vettori normali casuali indipendenti di osservazioni produrrà dati normali casuali con quella matrice di covarianza di 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

Utilizzare la funzione rmvnorm (), accetta 3 argomenti: la matrice di covarianza varianza, la media e il numero di righe.

Il sigma avrà 3 * 5 = 15 righe e colonne. Uno per ogni osservazione di ogni variabile. Esistono molti modi per impostare questi 15 ^ 2 parametri (ar, simmetria bilaterale, non strutturata ...). Tuttavia, compilando questa matrice sii consapevole delle ipotesi, in particolare quando imposti una correlazione / covarianza su zero o quando imposti due varianze per essere uguali. Per un punto di partenza una matrice sigma potrebbe assomigliare a questa:

 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)

Quindi il sigma [1,12] è .2 e ciò significa che la covarianza tra la prima osservazione di Y1 e la seconda osservazione di Y3 è .2, subordinata a tutte le altre 13 variabili. Le righe diagonali non devono essere tutte dello stesso numero: è un presupposto semplificativo che ho fatto. A volte ha senso, a volte no. In generale significa che la correlazione tra una terza osservazione e una quarta è uguale alla correlazione tra una prima e una seconda.

Hai anche bisogno di mezzi. Potrebbe essere semplice come

 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)

Qui i primi 5 sono i mezzi per le 5 osservazioni di Y1, ... gli ultimi 5 sono le osservazioni di Y3

quindi ottieni 2000 osservazioni dei tuoi dati 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")

Dove Y11 è la prima osservazione di Y1, ..., Y15 è la quinta osservazione di 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 la tua sintassi è utile, ma è diversa da quella che ho scritto. Penso che la differenza sia un po 'importante. Penso a quello che ho scritto come AR (1) e hai una voce nella correlazione incrociata tra l'ultima osservazione di una variabile e la prima osservazione della variabile successiva. In altre parole, penso che sigma [5,6] dovrebbe essere 0.
Seth,

55333355

Pensavo che il mio secondo sigma fosse un semplice esempio di come la varianza tra Y1 e Y3 fosse positiva. Ho modificato un po 'la risposta per chiarire che la matrice è lì per essere configurata in base al processo di generazione dei dati. Esistono sicuramente molti modi per scuoiare questo gatto.
Seth,

yi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.