Генерация случайных величин, которые связаны с одним вектором, но не между собой - PullRequest
0 голосов
/ 07 марта 2019

У меня есть вектор s1, содержащий нормально распределенные случайные величины. Я хочу создать еще 4 нормально распределенных случайных вектора, каждый из которых имеет свою собственную корреляцию с s1 и свою собственную дисперсию. Давайте назовем их от s2 до s5.

Если я использую mvrnorm() с ковариационной матрицей, я должен обозначить ковариации между s1 и каждым из других векторов, что нормально. Но я также должен обозначить ковариации между каждым из других векторов (например, между s2 и s3), что не очень хорошо. В итоге я получу корреляцию между s2 & s3, и нет никаких причин, почему она должна быть.

Как можно сгенерировать s2 до s5 с указанными (и различными) стандартными отклонениями и обозначенными ковариациями с s1, БЕЗ форсирования корреляций между s2 до s5?

edit: Вот ковариационная матрица ПОСЛЕ установки rho (3,2) на ноль

           [,1]      [,2]       [,3]
[1,] 0.00022500 0.0002625 0.00044625
[2,] 0.00026250 0.0006250 0.00000000
[3,] 0.00044625 0.0000000 0.00122500

1 Ответ

1 голос
/ 07 марта 2019

Просто установите соответствующие элементы в вашей ковариационной матрице на 0:

library(MASS)
set.seed(1)
(sig <- matrix(c(5, .5, .8, .5, 1, 0, .8, 0, .5), 3))
#      [,1] [,2] [,3]
# [1,]  5.0  0.5  0.8
# [2,]  0.5  1.0  0.0  ## <- 0 = covariance between s2 and s3
# [3,]  0.8  0.0  0.5
x <- mvrnorm(1e5, rep(0, 3), sig)
cov(x)
#           [,1]         [,2]         [,3]
# [1,] 5.0356870 0.5100643820 0.8004814044
# [2,] 0.5100644 1.0042540190 0.0008037978
# [3,] 0.8004814 0.0008037978 0.4972328657

## with empirical = TRUE you can force the cov matrix to match exactly sig
cov(mvrnorm(1e5, rep(0, 3), sig, empirical = TRUE))
#      [,1]          [,2]          [,3]
# [1,]  5.0  5.000000e-01  8.000000e-01
# [2,]  0.5  1.000000e+00 -2.267044e-15
# [3,]  0.8 -2.267044e-15  5.000000e-01

Обновление на основе комментариев

Если проблема заключается внайти положительно определенную матрицу корреляции, вы можете использовать Matrix::nearPD, чтобы найти ближайшую положительно определенную матрицу:

set.seed(1)
sig <- structure(c(0.000225,  0.0002625, 0.00044625, 
                   0.0002625 , 0.000625, 0, 
                   0.00044625, 0       , 0.001225), 
                 .Dim = c(3L, 3L))
cov(mvrnorm(1e5, rep(0, 3), Matrix::nearPD(sig, TRUE, TREU)$mat, empirical = TRUE))

#            V1           V2           V3
# V1 1.00000000 2.625000e-04 4.462500e-04
# V2 0.00026250 1.000000e+00 3.614917e-15
# V3 0.00044625 3.614917e-15 1.000000e+00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...