Rで反復測定多変量結果をシミュレートするにはどうすればよいですか?


9

@whuberは、1つの時点で多変量結果(、y_2y_3)をシミュレートする方法を示しました。y 2 y 3y1y2y3

私たちが知っているように、縦断的データはしばしば医学研究で発生します。私の質問は、Rの反復測定多変量結果をシミュレートする方法ですか?たとえば、2つの異なる治療グループの5 つのさまざまな時点でy1y2、およびy_3を繰り返し測定しy3ます。

回答:


2

指定された相関構造を持つ多変量正規データを生成するには、分散共分散行列を作成し、chol関数を使用してそのコレスキー分解を計算する必要があります。目的のvcov行列のコレスキー分解と観測の独立したランダム正規ベクトルとの積により、その分散共分散行列を持つランダム正規データが生成されます。

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つの引数を取ります。分散共分散行列、平均、行数です。

シグマは3 * 5 = 15行と列になります。各変数の観測ごとに1つ。これらの15 ^ 2パラメータを設定する方法はたくさんあります(ar、左右対称、非構造化...)。ただし、特に相関/共分散をゼロに設定する場合、または2つの分散を等しく設定する場合は、このマトリックスに入力して、仮定に注意してください。出発点として、シグママトリックスは次のようになります。

 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番目の観測の間の共分散が.2であり、他のすべての13変数を条件とすることを意味します。対角線はすべて同じ数である必要はありません。これは、私が作成した単純化した仮定です。時々それは理にかなっています、時にはそれはそうではありません。一般に、3番目の観測値と4番目の観測値の相関は、1番目と2番目の観測値の相関と同じであることを意味します。

手段も必要です。それはと同じくらい簡単かもしれません

 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。同様のアプローチで2番目の例が生成されます。ただし、これらには共通の問題があります。各期間中に間の共分散が失われています。これらの行列は反復測定構造を反映していません。y
whuber

@whuberあなたの構文は役に立ちますが、私が書いたものとは異なります。違いは少し重要だと思います。私がAR(1)と書いたものを考えてみると、ある変数の最後の観測と次の変数の最初の観測の間の相互相関にエントリがあります。言い換えれば、私はシグマ[5,6]が0にされるべきだと思う
セス・

ああ、今、私はあなたが何をしているのかわかります:最初の例では、3つのAR(1)シリーズを作成しています。OPはシリーズの相関についても懸念しているため、これを逃しました。それが「多変量結果」の意味です。あなたがあるとして、これらの相関行列を表示するようにその観点から、それが思わによっての各エントリでブロック行列によってマトリックス、としてではなく、によるとのブロック行列によってブロック。5 3 3 3 3 5 555333355
whuber

2番目のシグマは、Y1とY3の間の分散が正になるようにする簡単な例だと思いました。データの生成プロセスに応じてマトリックスを構成する必要があることを明確にするために、回答を少し編集しました。この猫の皮をむく方法は間違いなくたくさんあります。
セス

十分に公平ですが、間の多変量相関をARモデルと組み合わせるのは簡単ではないため、このアプローチでは問題が生じます。たとえば、2番目の行列が正定であることに失敗したことをご存知でしたか?(c(-102、177、-204、177、-102、0、0、0、0、0、102、-177、204、-177、102)の「分散」は負です。)yi
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.