Как смоделировать повторные измерения многовариантных результатов в R?

9

@whuber продемонстрировал, как моделировать многовариантные результаты ( , и ) для одной временной точки.у 2 у 3y1y2y3

Как известно, продольные данные часто встречаются в медицинских исследованиях. Мой вопрос заключается в том, как имитировать повторные измерения многовариантных результатов в R? Например, мы неоднократно измеряем , и в 5 различных временных точках для двух разных групп лечения.у 2 у 3y1y2y3

Tu.2
источник

Ответы:

2

Чтобы сгенерировать многовариантные нормальные данные с заданной структурой корреляции, вам необходимо построить ковариационную матрицу дисперсий и рассчитать ее разложение Холецкого с помощью cholфункции. Продукт разложения Холецкого желаемой матрицы Вцова и независимых случайных нормальных векторов наблюдений даст случайные нормальные данные с этой ковариационной матрицей дисперсии.

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
источник
2

Используйте функцию rmvnorm (), она принимает 3 аргумента: ковариационную матрицу дисперсии, среднее значение и количество строк.

Сигма будет иметь 3 * 5 = 15 строк и столбцов. Один для каждого наблюдения каждой переменной. Есть много способов установить эти 15 ^ 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)

Таким образом, сигма [1,12] равна .2, и это означает, что ковариация между первым наблюдением Y1 и вторым наблюдением Y3 равна .2, обусловленная всеми остальными 13 переменными. Диагональные строки не обязательно должны быть одинаковыми: это упрощенное предположение, которое я сделал. Иногда это имеет смысл, иногда нет. В целом это означает, что корреляция между 3-м наблюдением и 4-м наблюдением такая же, как корреляция между 1-м и вторым.

Вам также нужны средства. Это может быть так просто, как

 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 - средства для 5 наблюдений Y1, ..., последние 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 является 5-м наблюдением 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 ваш синтаксис полезен, но отличается от того, что я написал. Я думаю, что разница немного важна. Я думаю о том, что я написал как AR (1), и у вас есть запись во взаимной корреляции между последним наблюдением одной переменной и первым наблюдением следующей переменной. Другими словами, я думаю, что сигма [5,6] должна быть 0.
Сет
55333355
Я думал, что моя вторая сигма была простым примером того, что разница между Y1 и Y3 может быть положительной. Я немного отредактировал ответ, чтобы прояснить, что матрица должна быть настроена в зависимости от процесса генерации данных. Есть определенно много способов снять шкуру с этой кошки.
Сет
yi