Code: Select all
'Example of Gaussian copula with arbitrary marginal distributions (simulation and estimation)'
wfcreate u 5000
scalar n = @obssmpl
scalar k = 3
'Simulate k series using standard normal distribution and put them in matrix B_mat:
series _x = nrnd
series _y = nrnd
series _z = nrnd
stom(_x,x)
stom(_y,y)
stom(_z,z)
matrix(n,k) B_mat
colplace(B_mat,x,1)
colplace(B_mat,y,2)
colplace(B_mat,z,3)
'Calibrate the covariance (correlation) matrix A_sym:
matrix(k,k) corr_mat
corr_mat.fill 1, 0.7,-0.4,0.7,1, 0.1, -0.4, 0.1,1
sym A_sym = @implode(corr_mat)
'Simulate from multivariate normal using B_mat and Cholesky factor of A_sym:
matrix chol=@cholesky(A_sym)
matrix MVN_mat = chol*@transpose(B_mat)
matrix MVN_mat = @transpose(MVN_mat)
'Create uniform marginals for each variable (u_*) and map them to arbitrary marginals (m_*)
'(here Beta for x, Gamma for y and Normal for z)
vector(n) u_x
vector(n) u_y
vector(n) u_z
vector(n) m_x
vector(n) m_y
vector(n) m_z
for !k = 1 to n
u_x(!k) = 1-@cnorm(MVN_mat(!k,1))
m_x(!k) = @qbeta(u_x(!k),2,2)
u_y(!k) = 1-@cnorm(MVN_mat(!k,2))
m_y(!k) = @qgamma(u_y(!k),2,1)
u_z(!k) = 1-@cnorm(MVN_mat(!k,3))
m_z(!k) = @qnorm(u_z(!k))
next
'Put results in U_mat and XYZ_mat:
matrix(n,k) U_mat
colplace(U_mat,u_x,1)
colplace(U_mat,u_y,2)
colplace(U_mat,u_z,3)
matrix(n,k) XYZ_mat
colplace(XYZ_mat,m_x,1)
colplace(XYZ_mat,m_y,2)
colplace(XYZ_mat,m_z,3)
'This shows that that correlation structure is preserved for arbitrary marginals:
freeze(MVN_correlation) MVN_mat.cov(outfmt=sheet) taua
freeze(U_correlation) U_mat.cov(outfmt=sheet) taua
freeze(xyz_correlation) xyz_mat.cov(outfmt=sheet) taua
'Estimating Gaussian copula, i.e. Pearson correlation matrix (coefficients), using Kendall's tau calculated from the simulated data (marginals)
scalar pi = 3.1416
scalar ktau12 = @val(xyz_correlation(4,2))
scalar rho12 = @sin((pi/2)*ktau12)
scalar ktau13 = @val(xyz_correlation(5,2))
scalar rho13 = @sin((pi/2)*ktau13)
scalar ktau23 = @val(xyz_correlation(5,3))
scalar rho23 = @sin((pi/2)*ktau23)