Генерировать коррелированные переменные с фиксированной корреляцией, но изменяющимся стандартным отклонением

#r #simulation #correlation

#r #Симуляция #корреляция

Вопрос:

Я хотел бы сгенерировать k переменных из многомерного нормального распределения с заранее заданным средним значением, стандартным отклонением и фиксированной корреляцией между k переменными.

Я попытался сделать следующее:

 set.seed(10)
library(MASS)

k=10 #number of variables
mu <- rep(1,k) #mean of each variable
nobs <- 10000 #number of observations
sd <- rep(c(1,5),each=5) #standard deviation of each variable
cor <- 0.9 #correlation across variables

M <- matrix(cor,nrow=k,ncol=k) #variance covariance matrix
diag(M) <- sd^2 #desired standard deviations

data <- mvrnorm(nobs,mu,Sigma=M) #generate data
 

Моя проблема в том, что я получаю желаемые средние и стандартные отклонения, но корреляция далека от желаемого значения.

  mean(cor(data))
[1] 0.3774926
 

Я предполагаю, что наложение определенных стандартных отклонений ограничивает возможные корреляции, которые я могу получить.

Действительно ли это так?

Если да, то есть ли какой-либо способ приблизиться к желаемым корреляциям?

Ответ №1:

Попробуйте это (сгенерируйте ковариационную матрицу в соответствии с вашим требованием, по определению, cov(x,y)=cor(x,y)*sigma_x*sigma_y) :

 M <- matrix(cor,nrow=k,ncol=k)*outer(sd,sd) # covariance matrix
diag(M) <- sd^2 #desired standard deviations

data <- mvrnorm(nobs,mu,Sigma=M) #generate data
mean(cor(data))
#[1] 0.9102620391642199
 

Комментарии:

1. cor_d <- cor(data); diag(cor_d) <- NA; mean(cor_d, na.rm = T) избавляется от диагональных записей = 1