Utility functions¶

Correlation¶

Map arbitrary correlation matrix to Gaussian.

This module implements methods from two papers to map arbitrary correlation matrix into correlation matrix for Gaussian copulas.

econsa.correlation.gc_correlation(marginals, corr, order=15, force_calc=False)[source]

Correlation for Gaussian copula.

This function implements the algorithm outlined in Section 4.2 of [K2012] to map arbitrary correlation matrix to an correlation matrix for Gaussian copula. For special combination of distributions, use the values from Table 4. of [L1986].

Since chaospy’s copula functions only accept positive definite correlation matrix, this function also checks the output, and transforms to nearest positive definite matrix if it is not already.

Numerical integration is calculated with Gauss-Hermite quadrature ([D1984]).

Parameters
• marginals (chaospy.distributions) – Marginal distributions of the correlated variables. All marginals must be chaospy distributions, otherwise returns error.

• corr (array_like) – The correlation matrix to be transformed.

• order (int, optional) – The order of grids used to generate for integration. The total number of used points is calculated as $$(\text{order}+1)^2$$. Values larger than 20 are not recommended. (default value is 15)

• force_calc (bool, optional) – When True, calculate the covariances ignoring all special combinations of marginals (default value is False).

Returns

gc_corr – The transformed correlation matrix that is ready to be fed into a Gaussian copula.

Return type

numpy.ndarray

References

K2012

Kucherenko, S., Tarantola, S., & Annoni, P. (2012). Estimation of global sensitivity indices for models with dependent variables. Computer Physics Communications, 183(4), 937–946.

L1986

Liu, P., & Der Kiureghian, A. (1986). Multivariate distribution models with prescribed marginals and covariances. Probabilistic Engineering Mechanics, 1(2), 105–112.

D1984

Davis, P. J., & Rabinowitz, P. (1984). Methods of numerical integration (2nd ed.). Academic Press.

Examples

>>> corr = [[1.0, 0.6, 0.3], [0.6, 1.0, 0.0], [0.3, 0.0, 1.0]]
>>> marginals = [cp.Normal(1.00), cp.Uniform(lower=-4.00), cp.Normal(4.20)]
>>> corr_transformed = gc_correlation(marginals, corr)
>>> copula = cp.Nataf(cp.J(*marginals), corr_transformed)
>>> corr_copula = np.corrcoef(copula.sample(1000000))
>>> np.testing.assert_almost_equal(corr, corr_copula, decimal=6)