РЕДАКТИРОВАТЬ:
Как указано @PeterO и @pjs в комментариях, корреляция сохраняется только при линейных преобразованиях. Поскольку я применяю нелинейное преобразование, корреляция между переменными не соответствует желаемой корреляции.
Этот ответ не завершен.
Оригинальный ответ:
Используя gaminv
, вы сможете преобразовать многовариантные нормальные случайные числа в гамма-единицу.
n = 100; % # of random number
mu = [0,0,0]; % [muX1, muX2, muX3]
rho = [1.0 0.5 0.7;
0.5 1.0 0.4;
0.7 0.4 1.0] % covariance matrix
Z = mvnrnd(mu, rho, n); %Generate multivariate corralated random number
U = normcdf(Z,0,1); %Compute the CDF
%gamma distribution parameter
a = 2
b = 1
%transform your normal multivariate number into gamma distribution with gaminv
X = [gaminv(U(:,1),a,b) gaminv(U(:,2),a,b) gaminv(U(:,3),a,b)];
% Variable extraction:
X1 = X(:,1);
X2 = ...
Результат, использующий только X1 и X2 и коэффициент ковариации 0,8:
![enter image description here](https://i.stack.imgur.com/H6gbG.png)