Bagaimana mensimulasikan tindakan berulang hasil multivarian dalam R?

9

@whuber telah menunjukkan cara mensimulasikan hasil multivarian ( , , dan ) untuk satu titik waktu.y 2 y 3y1y2y3

Seperti yang kita ketahui, data longitudinal sering terjadi dalam studi medis. Pertanyaan saya adalah bagaimana mensimulasikan tindakan berulang hasil multivarian di R? Misalnya, kami berulang kali mengukur , , dan pada 5 titik waktu yang berbeda untuk dua kelompok perlakuan yang berbeda.y 2 y 3y1y2y3

Tu.2
sumber

Jawaban:

2

Untuk menghasilkan data normal multivarian dengan struktur korelasi yang ditentukan, Anda perlu membuat matriks varians kovarians dan menghitung dekomposisi Cholesky menggunakan cholfungsi. Produk dekomposisi Cholesky dari matriks vcov yang diinginkan dan vektor pengamatan normal acak independen akan menghasilkan data normal acak dengan matriks kovarians varian tersebut.

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
sumber
2

Gunakan fungsi rmvnorm (), Dibutuhkan 3 argumen: matriks varians kovarians, rata-rata dan jumlah baris.

Sigma akan memiliki 3 * 5 = 15 baris dan kolom. Satu untuk setiap pengamatan dari masing-masing variabel. Ada banyak cara untuk mengatur 15 ^ 2 parameter ini (ar, simetri bilateral, tidak terstruktur ...). Namun Anda mengisi matriks ini, perhatikan asumsi-asumsi tersebut, terutama ketika Anda menetapkan korelasi / kovarian menjadi nol, atau ketika Anda menetapkan dua varians agar sama. Untuk titik awal, matriks sigma mungkin terlihat seperti ini:

 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)

Jadi sigma [1,12] adalah .2 dan itu berarti bahwa kovarians antara pengamatan pertama Y1 dan pengamatan 2 Y3 adalah .2, tergantung pada 13 variabel lainnya. Baris diagonal tidak semua harus memiliki angka yang sama: itu adalah asumsi penyederhanaan yang saya buat. Terkadang masuk akal, terkadang tidak. Secara umum itu berarti korelasi antara pengamatan ke-3 dan ke-4 sama dengan korelasi antara ke-1 dan ke-2.

Anda juga butuh sarana. Ini bisa sesederhana

 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)

Di sini 5 pertama adalah sarana untuk 5 pengamatan Y1, ..., 5 terakhir adalah pengamatan Y3

lalu dapatkan 2.000 observasi data Anda dengan:

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

Di mana Y11 adalah observasi pertama Y1, ..., Y15 adalah obs ke-5 dari Y1 ...

Seth
sumber
1
Untuk membuat matriks seperti pada contoh pertama, Seth, coba ini: 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. Pendekatan serupa akan menghasilkan contoh kedua. Namun, mereka memiliki masalah umum: Anda telah kehilangan kovarian di antara selama setiap periode - matriks ini tidak mencerminkan struktur ukuran yang berulang. y
whuber
@whuber sintaks Anda sangat membantu, tetapi berbeda dari apa yang saya tulis. Saya pikir perbedaannya agak penting. Saya memikirkan apa yang saya tulis sebagai AR (1) dan Anda memiliki entri dalam korelasi silang antara pengamatan terakhir dari satu variabel dan pengamatan pertama dari variabel berikutnya. Dengan kata lain saya pikir sigma [5,6] harus 0.
Seth
Ah, sekarang saya mengerti apa yang Anda lakukan: Anda membuat tiga seri AR (1) pada contoh pertama. Saya melewatkan ini karena saya percaya OP juga prihatin tentang korelasi antara seri: itulah yang dimaksud dengan "hasil multivarian." Dari sudut pandang tampaknya seperti Anda ingin melihat matriks korelasi ini sebagai oleh blok matriks dengan masing-masing entri oleh matriks, bukan sebagai oleh matriks blok dengan oleh blok. 5 3 3 3 3 5 555333355
whuber
Saya pikir sigma kedua saya adalah contoh sederhana yang memungkinkan varians antara Y1 dan Y3 menjadi positif. Saya mengedit jawabannya sedikit untuk memperjelas bahwa ada matriks yang harus dikonfigurasi tergantung pada proses menghasilkan data. Pasti ada banyak cara untuk menguliti kucing ini.
Seth
Cukup adil, tetapi pendekatan Anda menciptakan kesulitan, karena tidak sepele untuk menggabungkan korelasi multivariat antara dengan model AR. Misalnya, apakah Anda sadar bahwa matriks kedua gagal menjadi pasti positif? ("Varians" dari c (-102, 177, -204, 177, -102, 0, 0, 0, 0, 0, 0, 102, -177, 204, -177, 102) adalah negatif.)yi
whuber