如何生成具有不同边际分布的多元随机数?

Posted

技术标签:

【中文标题】如何生成具有不同边际分布的多元随机数?【英文标题】:How to generate multivariate random numbers with different marginal distributions? 【发布时间】:2012-05-21 21:26:21 【问题描述】:

我不知道如何生成一些二元随机数,比如在 copula 中。边缘具有不同的分布,即 t、gamma,并且联合结构可以是高斯或 t。我将不得不修复他们的肯德尔头。我想检查这些随机数的 pearson rho 与预设的 tau 有何不同。

有什么建议吗?非常感谢 R/Matlab 中的一个原型!

【问题讨论】:

对于 R 中的 copulas,您可以查看 cran.r-project.org/web/packages/copula/index.html 【参考方案1】:

如果您有 Statistics Toolbox,您可以使用函数 copularnd 从 copula 生成随机数。文档中有几个示例。要在使用 Kendall 的 tau 和 Pearson 的 rho 之间进行转换,请查看 copulaparamcopulastat

【讨论】:

谢谢@Sam Roberts。对于其他人有类似的问题,请尝试:>> tau = 0.5; % 预定义 Kendall 的 tau >> rho = copulaparam('gaussian',tau); % 将 tau 转换为 Pearson 的 rho >> uu = copularnd('gaussian',rho,5000); % 在高斯 copula 中生成随机数 >> aa = tinv(uu(:,1),5); % 将制服转换为 t 边距 (df=5) >> bb = norminv(uu(:,2)); % 将制服转换为标准法线边距 >> scatter(aa,bb); % 散点图【参考方案2】:

您可以按如下方式构造高斯 copula。当然,无法保证 copula 准确地达到您想要的目标相关性。该性能取决于边际分布的属性。

示例 1: 对边际使用逆变换(指数和 Weibull)

rng(1776)   % Setting seed for reproducibility
lambda1 = 2; alpha1 = 2; beta = 3;
rho = 0.8; N = 10^5;

Z = mvnrnd([0 0],[1 rho; rho 1], N);
U = normcdf(Z);
X1 = (-1/lambda1)*log(U(:,1));  % Inverse Transform for Exponential
Y1 = beta*(-log(U(:,2))).^(1/alpha1);  % Inverse Transform for Weibull
corr(X1,Y1)
scatterhist(X1,Y1,'Direction','out','Marker','.','Color','b')

示例 2: 对边际使用数值 CDF 反演(Gamma 和对数正态)

rng(1776)
alpha2 = 6.7; lambda2 = 3; 
mu = 0.1; sigma = 0.5;
rho = -0.8; N = 10^5;
% Make distributions
pd_X2 = makedist('Gamma',alpha2,lambda2);
pd_Y2 = makedist('Lognormal',mu,sigma);
Z = mvnrnd([0 0],[1 rho; rho 1], N);
U = normcdf(Z);
X2 = icdf(pd_X2,U(:,1));
Y2 = icdf(pd_Y2,U(:,2));
corr(X2,Y2)
scatterhist(X2,Y2,'Direction','out','Marker','.','Color','k')

参考资料:Inverse TransformCopulas

高斯系词: 罗斯,谢尔顿。 (2013)。 模拟。学术出版社,加利福尼亚州圣地亚哥,第 5 版。 103–105。

【讨论】:

@CrisLuengo,不用担心。我不确定如何处理这种情况(已经删除了那个答案)。根据时间线和其他细节,我不知道重复标志是否合适。现在我明白了!顺便说一句,如果适当,重复标志是否会导致合并? 重复标志将问题置于关闭审查队列中。在那里人们可以投票关闭作为重复。一旦你有足够的代表,你就可以直接投票关闭,而不是标记。您也可以来到 MATLAB 聊天室寻求帮助以结束问题。作为重复关闭的问题仍然存在,我们喜欢这些问题,因为它们可以作为路标。即使问题没有关闭,标记也会留下指向另一个问题的评论,这将有助于人们找到它。【参考方案3】:

如果您有两个不同的变量 x1、x2,您可以使用 copula 理论来生成一些随机数。所以你必须计算变量的 CDF:

[Fi1, xi1] = ecdf(x1);

[Fi2, xi2] = ecdf(x2);

Fi1 = ksdensity(x1,x1, 'function','cdf');

Fi2 = ksdensity(x2,x2, 'function','cdf');

随后,您可以按如下方式计算 kendall 的 tau 相关性:

tau = corr(x1,x2, 'type', 'kendall');

rho = copulaparam('t',tau, nu, 'type','kendall');

以 copularnd 为目标,您可以生成 Gaussian、t、Clayton、Frank 或 Gumbel copula 的随机值 (n=1000),然后您只需估计 copula 的逆 cdf 以达到所需分布的目的.

n = 1000;

U = copularnd('Gaussian',[1  rho;rho 1],n);

% Inverse cdf of Gamma distribution 

X1 = gaminv(U(:,1),2,1);

% Inverse cdf of Student's t distribution

X2 = tinv(U(:,2),5); 

X1 = ksdensity(x1, U(:,1), 'function','icdf','width',.15);
X2 = ksdensity(x2, U(:,2), 'function','icdf','width',.15);

所以,现在 X1 和 X2 表示从初始 x1 和 x2 变量生成的新随机值。

我是copula统计的新手,如果我犯了错误,请原谅..

【讨论】:

以上是关于如何生成具有不同边际分布的多元随机数?的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB生成多元正态分布随机数(指定均值及协方差)——mvnrnd函数详解

生成具有给定(数值)分布的随机数

如何生成指向具有各向同性方向分布的随机方向的单位向量?

Python生成正态分布的随机数

生成具有特定数量负数的随机向量

Copula