2016-05-11 6 views
1

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

Переменные должны иметь mean = 1 и std = 5

N=10 #number of variables 
mu <- rep(1,N) #means 
p=0.7 #correlation 
Sigma <- matrix(p,ncol=N,nrow=N) #variance covariance matrix 
diag(Sigma) <- 5 #standard deviations 


library(MASS) 
set.seed(12) 
data <- mvrnorm(10000,mu,Sigma) 

Однако полученные стандартные отклонения не 5.

apply(data,2,sd) 

[1] 2.264853 2.219811 2.224703 2.245595 2.216712 2.236484 2.240794 2.220532 2.227445 
[10] 2.247943 

Существует систематический способ, в котором я мог изменять стандартные отклонения в то время как сохранить остальные параметры?

+1

Я уверен, что Sigma - это матрица дисперсии-ковариации, поэтому, если вам нужны стандартные отклонения 5, вы должны кормить ее 'diag (Sigma) <- 25'. Обратите внимание, что '2.264853^2' составляет 5.129559, что довольно близко к 5 ... – lmo

ответ

1

Вы создали матрицу Sigma, где диагональные элементы равны 5, но mvnorm хочет получить матрицу ковариации (а не стандартную матрицу отклонения) как Sigma. Таким образом, вам нужно, чтобы диагональные элементы равны 25. Он также не правильно использует значение p = 0.7, это корреляции, а не ковариации. Вам нужно превратить корреляции в ковариации.

См:

http://blogs.sas.com/content/iml/2010/12/10/converting-between-correlation-and-covariance-matrices.html

https://math.stackexchange.com/questions/446093/generate-correlated-normal-random-variables

2

Ваша ковариационная матрица (VCV) неверен. Диагоналями должны быть отклонения, а не стандартные отклонения. Если вы

apply(data,2,var) 

Тогда вы увидите, что дисперсии является ~ 5. Если вы хотите, чтобы стандартное отклонение было равным 5, тогда вам нужно, чтобы диафрагмы были равны 25.

Кроме того, вы вводите корреляции в недиагоналях матрицы VCV, и они должны быть ковариациями. Чтобы получить от correlations to covariances, вам нужно умножить корреляцию на стандартные отклонения двух корреляционных переменных. В вашем случае, если стандартное отклонение обеих переменных равно 5, ковариации в вашем VCV должны быть p = 0.7 * 5 * 5. Таким образом, окончательный VCV должен быть

p <- 0.7 * 5 * 5 
Sigma <- matrix(p,ncol=N,nrow=N) 
diag(Sigma) <- 25 

Полученные N случайные величины будут иметь средства 1, ковариации P и корреляции р/25.