我已经不知道如何生成一些二元随机数,比如在 copula 中。边缘有不同的分布,即t,gamma,联合结构可以是高斯或t。我将不得不修复他们的肯德尔头。我想检查这些随机数的 pearson rho 与预设的 tau 有何不同。
有什么建议吗?非常感谢 R/Matlab 中的一个原型!
我已经不知道如何生成一些二元随机数,比如在 copula 中。边缘有不同的分布,即t,gamma,联合结构可以是高斯或t。我将不得不修复他们的肯德尔头。我想检查这些随机数的 pearson rho 与预设的 tau 有何不同。
有什么建议吗?非常感谢 R/Matlab 中的一个原型!
如果您有 Statistics Toolbox,您可以使用函数从 copula 生成随机数copularnd
。文档中有几个示例。要在使用 Kendall 的 tau 和 Pearson 的 rho 之间进行转换,请查看copulaparam
and copulastat
。
您可以按如下方式构造高斯 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')
高斯系词:
罗斯,谢尔顿。(2013)。模拟。学术出版社,加利福尼亚州圣地亚哥,第 5 版。103-105。
如果您有两个不同的变量 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统计的新手,如果我犯了错误,请原谅..