就像标题所示,我在理解如何生成两个相关的统一[0,1]随机变量方面面临困难。我对copulas的想法是陌生的。
我正在努力编写MATLAB代码,其中要求我生成两个相关的统一[0,1]随机变量。
答案 0 :(得分:0)
使用高斯Copula生成相关的均匀随机变量
rho = .75; % Desired target correlation
N = 1000; % Number of samples
Z = mvnrnd([0 0],[1 rho; rho 1], N);
U = normcdf(Z); % Correlated U(0,1) random variables
scatterhist(U(:,1),U(:,2),'Direction','out') % Visualize (change `rho` to see impact)
注意:该方法不能保证完全达到目标相关性,但对于许多应用程序应该足够接近。
这对于使用inverse transform方法(分析地或数字地)快速生成相关分布非常有用。两种用例如下所示。
分析方法
lambda = 2; alpha = 2; beta = 3;
rho = -.35; N = 1000;
Z = mvnrnd([0 0],[1 rho; rho 1], N);
U = normcdf(Z);
X = (-1/lambda)*log(U(:,1)); % Inverse Transform for Exponential
Y = beta*(-log(U(:,2))).^(1/alpha); % Inverse Transform for Weibull
corr(X,Y)
scatterhist(X,Y,'Direction','out')
数值方法
% Parameters
alpha = 6.7; lambda = 3;
mu = 0.1; sigma = 0.5;
rho = 0.75; N = 1000;
% Make distributions
pd_X = makedist('Gamma',alpha,lambda);
pd_Y = makedist('Lognormal',mu,sigma);
Z = mvnrnd([0 0],[1 rho; rho 1], N);
U = normcdf(Z);
% Use Inverse Transform for marginal distributions (numerically)
X = icdf(pd_X,U(:,1)); % Inverse CDF for X
Y = icdf(pd_Y,U(:,2)); % Inverse CDF for Y
corr(X,Y)
scatterhist(X,Y,'Direction','out')
参考文献:
Inverse Transform
Copulas
高斯系:
罗斯,谢尔顿。 (2013)。 模拟。学术出版社,加利福尼亚州圣地亚哥,第5版。 103--105。
修改了here中的相关答案。