It is quite clear in many cases how to construct random vectors having specified copulas, e.g. the Gaussian copula, for example starting from a multivariate normal random vector (obtained for example with the Choleski factorization, etc.), and then producing a vector of standard uniforms $(U_1, \ldots, U_n)$ having cumulative distribution function equal to the Gaussian copula $C^{Ga}_{\Sigma}$.

My question is: how to do the converse? That is, suppose that I have a copula (for example the Gaussian copula above), $C^{Ga}_{\Sigma}$. I want to generate a realization of this copula, i.e., a random vector $U=(U_1, \ldots, U_n)$ having $C^{Ga}_{\Sigma}$ as copula. I haven't found any algorithm which accomplishes this. Do you know any such algorithm?

  • 1
    $\begingroup$ I am not quite sure I get what you're asking. Isn't this the question how to sample with distribution $F$, given only access to samples of a uniform distribution? In that case en.wikipedia.org/wiki/Inverse_transform_sampling is the answer. $\endgroup$ Mar 16 '18 at 21:26
  • $\begingroup$ @ Johannes Hahn It is not obvious how to generalize it to multi-dimensional case. For example, given an $n$ dimensional cdf $F$ and $n$ i.i.d. $U_1,\ldots,U_n$ distributed uniformly on $(0,1)$. How to construct a random vector $X=(X_1,\ldots,X_n)$ whose joint cdf is precisely $F$. $\endgroup$ Jun 5 '19 at 18:07

In general, there is (as far as I know) only one universally applicable sampling method. It goes by the name of "conditional distribution method", "conditional inverse method" or "conditional sampling". Depending on the specific type of copula, other simulation methods can be available.

1) Conditional distribution method

I'll limit myself to the 2D case, and specifically I follow chapter 2.9 (page 40ff) in: Nelsen. An introduction to copulas. Springer 2006, 2nd edition.

For random variables $(U,V) \sim C$ (i.e. $U$ and $V$ have a the copula you want to simulate from as joint distribution) denote by $c_u$ the conditional distribution of $V$ given $U=u$. It can be shown that $c_u$ has the following form \begin{align} c_u(v) = \Pr[V\leq v | U = u] = \frac{\partial C(u,v)}{\partial u}. \end{align} The function $c_u$ is furthermore non-decreasing, implying that a (generalized) inverse $c_u^{\leftarrow}$ exists. You can now simulate from $C$ as follows:

  1. Generate two independent standard uniform random numbers $u$ and $t$.
  2. Set $v = c_u^{\leftarrow}(t)$.
  3. The pair $(u,v)$ is now a sample from $C$.

In principle this method also works in the $d$-dimensional case, but it can in general be quite difficult to derive the necessary inverses of the conditional distribution functions. The $d$-dimensional description is for example in

Cherubini, Luciano, Vecchiato. Copula Methods in Finance. John Wiley & Sons, Ltd, 2004, chapter 6.3 (page 183ff),

but is (in my opinion) often not the most practical way to simulate. So instead of the general approach, specialized approaches depending on the specific copula in question are often the easier way to go.

2) Copula specific methods

Depending on the definition of the copula, more efficient simulation methods can be available.

For example, in case of the Gaussian copula $C_R$ you can simply simulate from a multivariate normal distribution with standard normal margins $\Phi$ and variance-covariance matrix $R$. For a realization $\mathbf{x} = (x_1,\ldots,x_d)$ you can now apply $\Phi$ to each component to get $\mathbf{u} = (\Phi(x_1),\ldots,\Phi(x_d))$. Then $\mathbf{u}$ is a sample from the Gaussian copula $C_R$ with parameter matrix $R$.

The same goes for the $t$-copula, where simulating from a multivariate $t$-distribution and then transforming with the margins is easier than simulating from the copula directly.

For (nested) Archimedean copulas simulation is tied to the Laplace transform of the copula generator. You can find the details in:

Hofert, M. (2007). Sampling Archimedean copulas (https://www.uni-ulm.de/fileadmin/website_uni_ulm/mawi/forschung/PreprintServer/2007/preprintmariushofert.pdf)


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.