Modeling multivariate probability distributions can be difficult when the marginal probability density functions of the component random variables are different. Copulas are a useful tool to model dependence between random variables with any marginal distributions. This post will introduce the idea of a copula, run through the basic math that underlies its composition and discuss some common copulas in use. Through researching for this post I found several comprehensive coding examples in Matlab, Python and R, so instead of creating my own I’m focusing on the a theoretical introduction to copulas in this post and will link to the coding tutorials at the end.

### What is a copula?

The word copula is derived from the Latin noun for a link or a tie (as is the English word “couple”) and its purpose is to describe the dependence structure between two variables. Sklar’s theorem states that “Any multivariate joint distribution can be written in terms of univariate marginal distribution functions and a copula which describes the dependence structure between the two variables” [1].

To understand how a copula can describe the dependence function between random variables its helpful to first review some simple statistics.

The above statements can be summarized as saying that the values of the CDF of any marginal distribution are uniformly distributed on the interval [0,1] ie. if you make a random draw from any distribution, you have the same probability of drawing the largest value (U=1) of that distribution as the smallest possible value (U=0) or the median value (U=.5).

So what does this have to do with copulas? Great question, a copula is actually a joint distribution of the CDFs of the random variables it is modeling. Put formally:

A k dimensional copula is a function and is a CDF with uniform marginals [1].

So now that we’ve defined what a copula is, lets take a look at the form of some commonly used ones.

### The Gaussian Copula

The Gaussian takes the form:

Where:

Φ_R is the joint standard normal CDF with:

ρ_(i,j) is the correlation between random variables X_i and X_j.

Φ^-1 is the inverse standard normal CDF.

It’s important to note that the Pearson Correlation coefficient is a bad choice for ρ row here, a rank based correlation such as Spearman’s ρ or Kendall’s τ are better options since they are scale invariant and do not require linearity.

### Issues with Tail Dependency

The Gaussian copula is a helpful tool and relatively easy to fit, even for relatively large numbers of RVs with different marginal distributions. Gaussian copulas however, do not do a good job capturing tail dependence and can cause one to underestimate risk of simultaneously being in the tails of each distribution. The failure of the Gaussian copula to capture tail dependence has been blamed for contributing the the 2008 financial crisis after it was widely used by investment firms on Wall Street (this is actually a really interesting story, for more details check out this article from the financial times) .

Tail dependency can be quantified by the coefficients of upper and lower tail dependence (λ_u and λ_l) defined as:

### The Student t Copula

Like the student t distribution, the student t copula has a similar shape to the Gaussian copula, but with fatter tails, thus it can do a slightly better job capturing tail dependence.

Where:

t_ν,Σ is the joint student t CDF, Σ is covariance matrix (again don’t use Pearson correlation coefficient), ν is the degrees of freedom and t^-1_ν is the inverse student t CDF.

### Archimedean Copulas

Archimedian copulas are a family of copulas with the following form:

ψ(u|θ) is called the generator function and θ is the parameters for the copula.

3 common Archimedean Copulas are:

- Gumbel: which is good at modeling upper tail dependence
- Clayton: which is good at modeling lower tail dependence
- Frank: has lighter tails and more density in the middle

It’s important to note that these copulas are usually employed for bivariate cases, for more than two variables, the Gaussian or Student t copulas are usually used.

A comparison of the shape of the copulas above can be found in Figure 1.

### Coding Copulas

There are numerous packages for modeling copulas in Matlab, Python and R.

In Matlab, the* Statistics and Machine learning Toolbox* has some helpful functions. You can find some well narrated examples of copulas here. There’s also the Multivariate Copula Analysis Toolbox from UC Irvine.

In Python, the *copulalib* package can be used to model the Clayton, Frank and Gumbel copulas. The *statsmodels * package also has copulas built in. I found this post on the *copulalib* package, it has an attached Jupyter notebook with nice coding examples and figures. Here’s a post on *statsmodels* copula implementation, along with example Jupyter notebook.

Finally, here’s an example of coding copulas in R using the copulas library.

### References and Acknowledgments

- Rüschendorf, L. (2013).
*Mathematical risk analysis dependence, risk bounds, optimal allocations and portfolios*. Berlin: Springer.

I’d like to note that the majority of the content in the post came from Scott Steinschneider’s excellent course, BEE 6940: Multivariate Analysis, at Cornell.

Great post, David. I’ve been trying to wrap my head around copulas for a while and this has been one of the best resources out there. For anyone struggling to understand the first proof, google “probability integral transform” or the “universality of the uniform” for more info.

Thanks Billy! Glad to hear it was helpful. Good call on those search terms, there’s tons out there on this concept.

Thanks for the tutorial. Can you provide me with some links about how to code the copula in matlab or a tutorial. It will be of great help !

I’m glad you found the tutorials useful. I’ve found the documentation from Matworks to be the most helpful for coding Copulas in Matlab. See this link for a reference (note that it requires the statistics and machine learning Toolbox):

https://www.mathworks.com/help/stats/examples/simulating-dependent-random-variables-using-copulas.html

There are also a number of helpful packages in R, here’s a blog with a nice tutorial on modeling with copulas in R:

https://datascienceplus.com/modelling-dependence-with-copulas/

Best,

David

I am looking for code that fits a copula to data

Hi Akhil, maybe this will help: https://www.mathworks.com/help/stats/copulapdf.html