Р: Как я могу смоделировать первые некоррелированные переменные и они «коррелируют» их? - PullRequest
0 голосов
/ 28 мая 2018

предположим, что я хочу сделать два моделирования с тремя переменными.В первом моделировании (давайте назовем это sima) я хочу создать три равномерных или нормальных распределенных переменных, которые не связаны между собой.Тогда я хочу провести анализ.После этого я хочу повторить анализ, но теперь я хочу, чтобы мои сгенерированные переменные из первой симуляции (sima) коррелировали:

Я знаю, что могу использовать функцию mvrnorm, но я неидея, как "сопоставить" мои сгенерированные данные из первого моделирования

Например,

a <- rnorm(1000)
b <- rnorm(1000)
c <- rnorm(1000)

x <- matrix(c(a,b,c), ncol=3)

Затем я хочу сопоставить матрицу x, например, с соотношениями:

cor(a,b)=0.4

cor(a,c)=0.3

cor(b,c)=0.5

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Вы можете переключить его.Сначала создайте коррелированные данные, как в посте DJV выше.Затем отредактируйте его случайным образом.Это не гарантирует точную нулевую корреляцию в выборке - но это также верно для независимо выбранных данных.

# first create `data` as in DJV's post. Then:

data_indep <- apply(data, 2, sample)
cor(data2)
            [,1]        [,2]        [,3]
[1,]  1.00000000  0.07503708 -0.13515778
[2,]  0.07503708  1.00000000 -0.02912137
[3,] -0.13515778 -0.02912137  1.00000000

Чтобы показать, что в среднем перетасованные данные некоррелированы (что аналитически верно, но давайтепроверьте):

replicate(10000, {data2 <- apply(data, 2, sample); cor(data2)}) -> cors
apply(cors, 1:2, mean)
              [,1]          [,2]         [,3]
[1,]  1.0000000000 -0.0009533055 0.0014867635
[2,] -0.0009533055  1.0000000000 0.0002847576
[3,]  0.0014867635  0.0002847576 1.0000000000

Достаточно хорошо, я думаю.

0 голосов
/ 28 мая 2018

Если я вас правильно понял, вы можете воспользоваться функцией MASS::mvrnorm

samples <- 200
rab <- 0.4
rac <- 0.3
rbc <- 0.5

data <-  MASS::mvrnorm(n=samples,
                     mu=c(0, 0, 0),
                     Sigma=matrix(c(1, rab, rac,
                                    rab, 1, rbc, 
                                    rac, rbc, 1),
                                  nrow=3),
                     empirical=TRUE)
A <- data[, 1]  
B <- data[, 2] 
C <- data[, 3]

cor(data)
cor(A, B)
cor(A, C)
cor(B, C)


> cor(data)
     [,1] [,2] [,3]
[1,]  1.0  0.4  0.3
[2,]  0.4  1.0  0.5
[3,]  0.3  0.5  1.0
> cor(A, B)
[1] 0.4
> cor(A, C)
[1] 0.3
> cor(B, C)
[1] 0.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...