Wie simuliert man multivariate Ergebnisse mit wiederholten Messungen in R?

9

@whuber hat gezeigt, wie multivariate Ergebnisse ( , und y_3 ) für einen Zeitpunkt simuliert werden können.y1y2y3

Wie wir wissen, treten in medizinischen Studien häufig Längsschnittdaten auf. Meine Frage ist, wie man multivariate Ergebnisse mit wiederholten Messungen in R simuliert. Zum Beispiel messen wir wiederholt y1 , y2 und y3 zu 5 verschiedenen Zeitpunkten für zwei verschiedene Behandlungsgruppen.

Tu.2
quelle

Antworten:

2

Um multivariate Normaldaten mit einer bestimmten Korrelationsstruktur zu generieren, müssen Sie die Varianz-Kovarianz-Matrix erstellen und ihre Cholesky-Zerlegung mithilfe der cholFunktion berechnen . Das Produkt der Cholesky-Zerlegung der gewünschten vcov-Matrix und unabhängiger zufälliger normaler Beobachtungsvektoren ergibt zufällige normale Daten mit dieser Varianz-Kovarianzmatrix.

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)
AdamO
quelle
2

Verwenden Sie die Funktion rmvnorm (). Es werden 3 Argumente benötigt: die Varianz-Kovarianz-Matrix, die Mittelwerte und die Anzahl der Zeilen.

Das Sigma hat 3 * 5 = 15 Zeilen und Spalten. Eine für jede Beobachtung jeder Variablen. Es gibt viele Möglichkeiten, diese 15 ^ 2 Parameter einzustellen (ar, bilaterale Symmetrie, unstrukturiert ...). Wenn Sie diese Matrix ausfüllen, müssen Sie sich der Annahmen bewusst sein, insbesondere wenn Sie eine Korrelation / Kovarianz auf Null setzen oder wenn Sie zwei Varianzen gleich setzen. Als Ausgangspunkt könnte eine Sigma-Matrix ungefähr so ​​aussehen:

 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)

Das Sigma [1,12] ist also 0,2 und das bedeutet, dass die Kovarianz zwischen der ersten Beobachtung von Y1 und der zweiten Beobachtung von Y3 0,2 beträgt, abhängig von allen anderen 13 Variablen. Die diagonalen Reihen müssen nicht alle dieselbe Zahl sein: Das ist eine vereinfachende Annahme, die ich gemacht habe. Manchmal macht es Sinn, manchmal nicht. Im Allgemeinen bedeutet dies, dass die Korrelation zwischen einer dritten und einer vierten Beobachtung dieselbe ist wie die Korrelation zwischen einer ersten und einer zweiten.

Sie brauchen auch Mittel. Es könnte so einfach sein wie

 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)

Hier sind die ersten 5 die Mittelwerte für die 5 Beobachtungen von Y1, ..., die letzten 5 sind die Beobachtungen von Y3

Dann erhalten Sie 2000 Beobachtungen Ihrer Daten mit:

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

Wo Y11 die 1. Beobachtung von Y1 ist, ..., ist Y15 die 5. Beobachtung von Y1 ...

Seth
quelle
1
Versuchen Sie Folgendes, um Matrizen wie im ersten Beispiel, Seth, zu erstellen : 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. Ein ähnlicher Ansatz wird das zweite Beispiel erzeugen. Sie haben jedoch ein häufiges Problem: Sie haben in jeder Periode die Kovarianzen zwischen den verloren - diese Matrizen spiegeln keine Struktur mit wiederholten Messungen wider. y
whuber
@whuber Ihre Syntax ist hilfreich, unterscheidet sich aber von dem, was ich geschrieben habe. Ich denke, der Unterschied ist ein bisschen wichtig. Ich denke an das, was ich als AR (1) geschrieben habe, und Sie haben einen Eintrag in der Kreuzkorrelation zwischen der letzten Beobachtung einer Variablen und der ersten Beobachtung der nächsten Variablen. Mit anderen Worten, ich denke, Sigma [5,6] sollte 0 sein.
Seth
Ah, jetzt sehe ich, was Sie tun: Sie erstellen im ersten Beispiel drei AR (1) -Serien. Ich habe dies verpasst, weil ich glaube, dass das OP auch über Korrelationen zwischen den Serien besorgt ist : Das ist es, was mit "multivariaten Ergebnissen" gemeint ist. Unter diesem Gesichtspunkt scheint es so, als ob Sie diese Korrelationsmatrizen als mal Blockmatrizen mit jedem Eintrag als mal Matrix und nicht als mal Blockmatrix mit mal Blöcken betrachten möchten . 55333355
whuber
Ich dachte, mein zweites Sigma sei ein einfaches Beispiel dafür, wie die Varianz zwischen Y1 und Y3 positiv sein kann. Ich habe die Antwort ein wenig bearbeitet, um klarer zu machen, dass die Matrix abhängig vom Datengenerierungsprozess konfiguriert werden muss. Es gibt definitiv viele Möglichkeiten, diese Katze zu häuten.
Seth
Fair genug, aber Ihr Ansatz schafft Schwierigkeiten, da es nicht trivial ist, die multivariate Korrelation zwischen und einem AR-Modell zu kombinieren . Wussten Sie beispielsweise, dass die zweite Matrix nicht eindeutig positiv ist? (Die "Varianz" von c (-102, 177, -204, 177, -102, 0, 0, 0, 0, 0, 102, -177, 204, -177, 102) ist negativ.)yi
whuber