#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