【问题标题】:Generating two correlated uniform random variables in Matlab在 Matlab 中生成两个相关的均匀随机变量
【发布时间】:2019-07-29 01:29:57
【问题描述】:

正如标题所示,我很难理解我们如何生成两个相关的统一 [0,1] 随机变量。我对 copulas 的想法很陌生。

我正在努力编写一个 MATLAB 代码,其中我需要生成两个相关的统一 [0,1] 随机变量。

【问题讨论】:

  • 能否添加您尝试过的代码。然后人们可以评论/纠正/修改/改进/批评它。否则,您似乎是在要求某人为您编写代码。另外请添加您得到的输出和您期望的输出。

标签: matlab random correlation uniform-distribution


【解决方案1】:

使用高斯 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的相关答案。

【讨论】:

    猜你喜欢
    • 2018-10-24
    • 2012-10-12
    • 1970-01-01
    • 2013-05-18
    • 2011-08-15
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多