Copula (probability theory)

From Infogalactic: the planetary knowledge core
Jump to: navigation, search

In probability theory and statistics, a copula is a multivariate probability distribution for which the marginal probability distribution of each variable is uniform. Copulas are used to describe the dependence between random variables. Their name comes from the Latin for "link" or "tie", similar but unrelated to grammatical copulas in linguistics[citation needed].

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 variables.

Copulas are popular in high-dimensional statistical applications as they allow one to easily model and estimate the distribution of random vectors by estimating marginals and copulae separately. There are many parametric copula families available, which usually have parameters that control the strength of dependence. Some popular parametric copula models are outlined below.

Mathematical definition

Consider a random vector (X_1,X_2,\dots,X_d). Suppose its margins are continuous, i.e. the marginal CDFs F_i(x) = \mathbb{P}[X_i\leq x] are continuous functions. By applying the probability integral transform to each component, the random vector

(U_1,U_2,\dots,U_d)=\left(F_1(X_1),F_2(X_2),\dots,F_d(X_d)\right)

has uniformly distributed marginals.

The copula of (X_1,X_2,\dots,X_d) is defined as the joint cumulative distribution function of (U_1,U_2,\dots,U_d):

C(u_1,u_2,\dots,u_d)=\mathbb{P}[U_1\leq u_1,U_2\leq u_2,\dots,U_d\leq u_d] .

The copula C contains all information on the dependence structure between the components of (X_1,X_2,\dots,X_d) whereas the marginal cumulative distribution functions F_i contain all information on the marginal distributions.

The importance of the above is that the reverse of these steps can be used to generate pseudo-random samples from general classes of multivariate probability distributions. That is, given a procedure to generate a sample (U_1,U_2,\dots,U_d) from the copula distribution, the required sample can be constructed as

(X_1,X_2,\dots,X_d) = \left(F_1^{-1}(U_1),F_2^{-1}(U_2),\dots,F_d^{-1}(U_d)\right).

The inverses F_i^{-1} are unproblematic as the F_i were assumed to be continuous. The above formula for the copula function can be rewritten to correspond to this as:

C(u_1,u_2,\dots,u_d)=\mathbb{P}[X_1\leq F_1^{-1}(u_1),X_2\leq F_2^{-1}(u_2),\dots,X_d\leq F_d^{-1}(u_d)] .

Definition

In probabilistic terms, C:[0,1]^d\rightarrow [0,1] is a d-dimensional copula if C is a joint cumulative distribution function of a d-dimensional random vector on the unit cube [0,1]^d with uniform marginals.[1]

In analytic terms, C:[0,1]^d\rightarrow [0,1] is a d-dimensional copula if

  • C(u_1,\dots,u_{i-1},0,u_{i+1},\dots,u_d)=0 , the copula is zero if one of the arguments is zero,
  • C(1,\dots,1,u,1,\dots,1)=u , the copula is equal to u if one argument is u and all others 1,
  • C is d-increasing, i.e., for each hyperrectangle B=\prod_{i=1}^{d}[x_i,y_i]\subseteq [0,1]^d the C-volume of B is non-negative:
     \int_B dC(u) =\sum_{\mathbf z\in \times_{i=1}^{d}\{x_i,y_i\}} (-1)^{N(\mathbf z)} C(\mathbf z)\ge 0,
where the N(\mathbf z)=\#\{k : z_k=x_k\}.

For instance, in the bivariate case, C:[0,1]\times[0,1]\rightarrow [0,1] is a bivariate copula if C(0,u) = C(u,0) = 0 , C(1,u) = C(u,1) = u and C(u_2,v_2)-C(u_2,v_1)-C(u_1,v_2)+C(u_1,v_1) \geq 0 for all 0 \leq u_1 \leq u_2 \leq 1 and 0 \leq v_1 \leq v_2 \leq 1.

Sklar's theorem

Density and contour plot of a Bivariate Gaussian Distribution
Density and contour plot of two Normal marginals joint with a Gumbel copula

Sklar's theorem,[2] named after Abe Sklar, provides the theoretical foundation for the application of copulas. Sklar's theorem states that every multivariate cumulative distribution function

H(x_1,\dots,x_d)=\mathbb{P}[X_1\leq x_1,\dots,X_d\leq x_d]

of a random vector (X_1,X_2,\dots,X_d) can be expressed by involving only the marginals F_i(x) = \mathbb{P}[X_i\leq x] as

H(x_1,\dots,x_d) = C\left(F_1(x_1),\dots,F_d(x_d) \right),

where C is a copula. In case that the multivariate distributions has a density f is available it holds further that f(x_1,\dots x_d)= c(F_1(x_1),\dots F_d(x_d))\cdot f_1(x_1)\cdot\dots\cdot f_d(x_d), where c is the density of the copula.

The theorem also states that, given H, the copula is unique on  \operatorname{Ran}(F_1)\times\cdots\times \operatorname{Ran}(F_d) , which is the cartesian product of the ranges of the marginal cdf's. This implies that the copula is unique if the marginals F_i are continuous.

The converse is also true: given a copula C:[0,1]^d\rightarrow [0,1] and margins F_i(x) then C\left(F_1(x_1),\dots,F_d(x_d) \right) defines a d-dimensional cumulative distribution function.

Fréchet–Hoeffding copula bounds

Graphs of the bivariate Fréchet–Hoeffding copula limits and of the independence copula (in the middle).

The Fréchet–Hoeffding Theorem (after Maurice René Fréchet and Wassily Hoeffding [3]) states that for any Copula C:[0,1]^d\rightarrow [0,1] and any (u_1,\dots,u_d)\in[0,1]^d the following bounds hold:

W(u_1,\dots,u_d) \leq C(u_1,\dots,u_d) \leq M(u_1,\dots,u_d).

The function W is called lower Fréchet–Hoeffding bound and is defined as

 W(u_1,\ldots,u_d) = \max\left\{1-d+\sum\limits_{i=1}^d {u_i} , 0 \right\}.

The function M is called upper Fréchet–Hoeffding bound and is defined as

 M(u_1,\ldots,u_d) = \min \{u_1,\dots,u_d\}.

The upper bound is sharp: M is always a copula, it corresponds to comonotone random variables.

The lower bound is point-wise sharp, in the sense that for fixed u, there is a copula \tilde{C} such that \tilde{C}(u) = W(u). However, W is a copula only in two dimensions, in which case it corresponds to countermonotonic random variables.

In two dimensions, i.e. the bivariate case, the Fréchet–Hoeffding Theorem states

\max(u+v-1,0) \leq C(u,v) \leq \min\{u,v\}

Families of copulas

Several families of copulae have been described.

Gaussian copula

Cumulative and density distribution of Gaussian copula with ρ = 0.4

The Gaussian copula is a distribution over the unit cube [0,1]^d. It is constructed from a multivariate normal distribution over \mathbb{R}^d by using the probability integral transform.

For a given correlation matrix R\in\mathbb{R}^{d\times d}, the Gaussian copula with parameter matrix R can be written as

 C_R^{\text{Gauss}}(u) = \Phi_R\left(\Phi^{-1}(u_1),\dots, \Phi^{-1}(u_d) \right),

where \Phi^{-1} is the inverse cumulative distribution function of a standard normal and \Phi_R is the joint cumulative distribution function of a multivariate normal distribution with mean vector zero and covariance matrix equal to the correlation matrix R.

The density can be written as[4]

 c_R^{\text{Gauss}}(u)
= \frac{1}{\sqrt{\det{R}}}\exp\left(-\frac{1}{2}
\begin{pmatrix}\Phi^{-1}(u_1)\\ \vdots \\ \Phi^{-1}(u_d)\end{pmatrix}^T \cdot
\left(R^{-1}-\mathbf{I}\right) \cdot
\begin{pmatrix}\Phi^{-1}(u_1)\\ \vdots \\ \Phi^{-1}(u_d)\end{pmatrix}
\right),

where \mathbf{I} is the identity matrix.

Archimedean copulas

Archimedean copulas are an associative class of copulas. Most common Archimedean copulas admit an explicit formula, something not possible for instance for the Gaussian copula. In practice, Archimedean copulas are popular because they allow modeling dependence in arbitrarily high dimensions with only one parameter, governing the strength of dependence.

A copula C is called Archimedean if it admits the representation[5]

 C(u_1,\dots,u_d;\theta) = \psi^{[-1]}\left(\psi(u_1;\theta)+\cdots+\psi(u_d;\theta);\theta\right) \,

where \psi\!:[0,1]\times\Theta \rightarrow [0,\infty) is a continuous, strictly decreasing and convex function such that \psi(1;\theta)=0. \theta is a parameter within some parameter space \Theta. \psi is the so-called generator function and \psi^{[-1]} is its pseudo-inverse defined by

 \psi^{[-1]}(t;\theta) = \left\{\begin{array}{ll} \psi^{-1}(t;\theta) & \mbox{if }0 \leq t \leq \psi(0;\theta) \\ 0 & \mbox{if }\psi(0;\theta) \leq t \leq\infty. \end{array}\right. \,

Moreover, the above formula for C yields a copula for \psi^{-1}\, if and only if \psi^{-1}\, is d-monotone on [0,\infty).[6] That is, if it is d-2 times differentiable and the derivatives satisfy

 (-1)^k\psi^{-1,(k)}(t;\theta) \geq 0 \,

for all t\geq 0 and k=0,1,\dots,d-2 and (-1)^{d-2}\psi^{-1,(d-2)}(t;\theta) is nonincreasing and convex.

Most important Archimedean copulas

The following tables highlight the most prominent bivariate Archimedean copulas, with their corresponding generator. Note that not all of them are completely monotone, i.e. d-monotone for all d\in\mathbb{N} or d-monotone for certain \theta \in \Theta only.

Table with the most important Archimedean copulas[5]
Name of Copula Bivariate Copula \;C_\theta(u,v) parameter \,\theta
Ali-Mikhail-Haq[7]   \frac{uv}{1-\theta (1-u)(1-v)}   \theta\in[-1,1)
Clayton[8]   \left[ \max\left\{ u^{-\theta} + v^{-\theta} -1 ; 0 \right\} \right]^{-1/\theta}   \theta\in[-1,\infty)\backslash\{0\}
Frank   -\frac{1}{\theta} \log\!\left[ 1+\frac{(\exp(-\theta u)-1)(\exp(-\theta v)-1)}{\exp(-\theta)-1} \right]     \theta\in \mathbb{R}\backslash\{0\}  
Gumbel   {\textstyle \exp\!\left[ -\left( (-\log(u))^\theta + (-\log(v))^\theta \right)^{1/\theta} \right]}   \theta\in[1,\infty)
Independence   {\textstyle uv}  
Joe   {\textstyle {1-\left[ (1-u)^\theta + (1-v)^\theta - (1-u)^\theta(1-v)^\theta \right]^{1/\theta}}}     \theta\in[1,\infty)


Table of correspondingly most important generators[5]
name generator \,\psi_{\theta}(t) generator inverse \,\psi_{\theta}^{-1}(t)
Ali-Mikhail-Haq[7]    \log\!\left[\frac{1-\theta (1-t)}{t}\right]     \frac{1-\theta}{\exp(t)-\theta}
Clayton[8]     \frac{1}{\theta}\,(t^{-\theta}-1)\,     \left(1+\theta t\right)^{-1/\theta}    
Frank    {\textstyle -\log\!\left(\frac{\exp(-\theta t)-1}{\exp(-\theta)-1}\right)}     -\frac{1}{\theta}\,\log(1+\exp(-t)(\exp(-\theta)-1))    
Gumbel    \left(-\log(t)\right)^\theta        \exp\!\left(-t^{1/\theta}\right)
Independence     -\log(t)\,        \exp(-t)\,
Joe     -\log\!\left(1-(1-t)^\theta\right)        1-\left(1-\exp(-t)\right)^{1/\theta}

Expectation for copula models and Monte Carlo integration

In statistical applications, many problems can be formulated in the following way. One is interested in the expectation of a response function g:\mathbb{R}^d\rightarrow\mathbb{R} applied to some random vector (X_1,\dots,X_d).[9] If we denote the cdf of this random vector with H, the quantity of interest can thus be written as

 \mathbb{E} \left[ g(X_1,\dots,X_d) \right] = \int_{\mathbb{R}^d} g(x_1,\dots,x_d) \,  dH(x_1,\dots,x_d).

If H is given by a copula model, i.e.,

H(x_1,\dots,x_d)=C(F_1(x_1),\dots,F_d(x_d))

this expectation can be rewritten as

\mathbb{E}\left[g(X_1,\dots,X_d)\right]=\int_{[0,1]^d}g(F_1^{-1}(u_1),\dots,F_d^{-1}(u_d)) \, dC(u_1,\dots,u_d).

In case the copula C is absolutely continuous, i.e. C has a density c, this equation can be written as

\mathbb{E}\left[g(X_1,\dots,X_d)\right]=\int_{[0,1]^d}g(F_1^{-1}(u_1),\dots,F_d^{-1}(u_d))\cdot c(u_1,\dots,u_d) \, du_1\dots du_d,

and if each marginal distribution has the density f_i it holds further that

\mathbb{E}\left[g(X_1,\dots,X_d)\right]=\int_{\mathbb{R}^d}g(x_1,\dots x_d)\cdot c(F(x_1),\dots,F(x_d))\cdot f_1(x_1)\cdot ... \cdot f_d(x_d) \, dx_1\dots dx_d.

If copula and margins are known (or if they have been estimated), this expectation can be approximated through the following Monte Carlo algorithm:

  1. Draw a sample (U_1^k,\dots,U_d^k)\sim C\;\;(k=1,\dots,n) of size n from the copula C
  2. By applying the inverse marginal cdf's, produce a sample of (X_1,\dots,X_d) by setting (X_1^k,\dots,X_d^k)=(F_1^{-1}(U_1^k),\dots,F_d^{-1}(U_d^k))\sim H\;\;(k=1,\dots,n)
  3. Approximate \mathbb{E}\left[g(X_1,\dots,X_d)\right] by its empirical value:
\mathbb{E}\left[g(X_1,\dots,X_d)\right]\approx \frac{1}{n}\sum_{k=1}^n g(X_1^k,\dots,X_d^k)

Empirical copulas

When studying multivariate data, one might want to investigate the underlying copula. Suppose we have observations

(X_1^i,X_2^i,\dots,X_d^i), \, i=1,\dots,n

from a random vector (X_1,X_2,\dots,X_d) with continuous margins. The corresponding "true" copula observations would be

(U_1^i,U_2^i,\dots,U_d^i)=\left(F_1(X_1^i),F_2(X_2^i),\dots,F_d(X_d^i)\right), \, i=1,\dots,n.

However, the marginal distribution functions F_i are usually not known. Therefore, one can construct pseudo copula observations by using the empirical distribution functions

F_k^n(x)=\frac{1}{n} \sum_{i=1}^n \mathbf{1}(X_k^i\leq x)

instead. Then, the pseudo copula observations are defined as

(\tilde{U}_1^i,\tilde{U}_2^i,\dots,\tilde{U}_d^i)=\left(F_1^n(X_1^i),F_2^n(X_2^i),\dots,F_d^n(X_d^i)\right), \, i=1,\dots,n.

The corresponding empirical copula is then defined as

C^n(u_1,\dots,u_d) = \frac{1}{n} \sum_{i=1}^n \mathbf{1}\left(\tilde{U}_1^i\leq u_1,\dots,\tilde{U}_d^i\leq u_d\right).

The components of the pseudo copula samples can also be written as \tilde{U}_k^i=R_k^i/n, where R_k^i is the rank of the observation X_k^i:

R_k^i=\sum_{j=1}^n \mathbf{1}(X_k^j\leq X_k^i)

Therefore, the empirical copula can be seen as the empirical distribution of the rank transformed data.

Applications

Quantitative finance

Examples of bivariate copulæ used in finance.

In risk/portfolio management, copulas are used to perform stress-tests and robustness checks that are especially important during “downside/crisis/panic regimes” where extreme downside events may occur (e.g., the global financial crisis of 2007–2008).

The formula was also adapted for financial markets and was used to estimate the probability distribution of losses on pools of loans or bonds. The users of the formula have been criticized for creating "evaluation cultures" that continued to use simple copulæ despite the simple versions being acknowledged as inadequate for that purpose.[10] During a downside regime, a large number of investors who have held positions in riskier assets such as equities or real estate may seek refuge in ‘safer’ investments such as cash or bonds. This is also known as a flight-to-quality effect and investors tend to exit their positions in riskier assets in large numbers in a short period of time. As a result, during downside regimes, correlations across equities are greater on the downside as opposed to the upside and this may have disastrous effects on the economy. [11] [12] For example, anecdotally, we often read financial news headlines reporting the loss of hundreds of millions of dollars on the stock exchange in a single day; however, we rarely read reports of positive stock market gains of the same magnitude and in the same short time frame.

Copulas are useful in portfolio/risk management and help us analyse the effects of downside regimes by allowing the modelling of the marginals and dependence structure of a multivariate probability model separately. For example, consider the stock exchange as a market consisting of a large number of traders each operating with his/her own strategies to maximize profits. The individualistic behaviour of each trader can be described by modelling the marginals. However, as all traders operate on the same exchange, each trader's actions have an interaction effect with other traders'. This interaction effect can be described by modelling the dependence structure. Therefore, copulas allow us to analyse the interaction effects which are of particular interest during downside regimes as investors tend to herd their trading behaviour and decisions.

Previously, scalable copula models for large dimensions only allowed the modelling of elliptical dependence structures (i.e., Gaussian and Student-t copulas) that do not allow for correlation asymmetries where correlations differ on the upside or downside regimes. However, the recent development of vine copulas[13] (also known as pair copulas) enables the flexible modelling of the dependence structure for portfolios of large dimensions. [14] The Clayton canonical vine copula allows for the occurrence of extreme downside events and has been successfully applied in portfolio choice and risk management applications. The model is able to reduce the effects of extreme downside correlations and produces improved statistical and economic performance compared to scalable elliptical dependence copulas such as the Gaussian and Student-t copula. [15] Other models developed for risk management applications are panic copulas that are glued with market estimates of the marginal distributions to analyze the effects of panic regimes on the portfolio profit and loss distribution. Panic copulas are created by Monte Carlo simulation, mixed with a re-weighting of the probability of each scenario.[16]

As far as derivatives pricing is concerned, dependence modelling with copula functions is widely used in applications of financial risk assessment and actuarial analysis – for example in the pricing of collateralized debt obligations (CDOs).[17] Some believe the methodology of applying the Gaussian copula to credit derivatives to be one of the reasons behind the global financial crisis of 2008–2009.[18][19] Despite this perception, there are documented attempts of the financial industry, occurring before the crisis, to address the limitations of the Gaussian copula and of copula functions more generally, specifically the lack of dependence dynamics[clarification needed] and the poor representation of extreme events.[20] There have been attempts to propose models rectifying some of the copula limitations.[20][21][22]

While the application of copulas in credit has gone through popularity as well as misfortune during the global financial crisis of 2008–2009,[23] it is arguably an industry standard model for pricing CDOs. Copulas have also been applied to other asset classes as a flexible tool in analyzing multi-asset derivative products. The first such application outside credit was to use a copula to construct an implied basket volatility surface,[24] taking into account the volatility smile of basket components. Copulas have since gained popularity in pricing and risk management [25] of options on multi-assets in the presence of volatility smile/skew, in equity, foreign exchange and fixed income derivative business. Some typical example applications of copulas are listed below:

  • Analyzing and pricing volatility smile/skew of exotic baskets, e.g. best/worst of;
  • Analyzing and pricing volatility smile/skew of less liquid FX[clarification needed] cross, which is effectively a basket: C = S1/S2 or C = S1·S2;

Civil engineering

Recently, copula functions have been successfully applied to the database formulation for the reliability analysis of highway bridges, and to various multivariate simulation studies in civil,[26] mechanical and offshore engineering.[citation needed]Researchers are also trying these functions in field of transportation to understand interaction of individual driver behavior components which in totality shapes up the nature of an entire traffic flow.

Reliability engineering

Copulas are being used for reliability analysis of complex systems of machine components with competing failure modes. [27]

Warranty data analysis

Copulas are being used for warranty data analysis in which the tail dependence is analysed [28]

Turbulent combustion

Copulas are used in modelling turbulent partially premixed combustion, which is common in practical combustors. [29] [30]

Medicine

Copula functions have been successfully applied to the analysis of neuronal dependencies [31] and spike counts in neuroscience [32] .

Weather research

Copulas have been extensively used in climate- and weather-related research.[33]

Random vector generation

Large synthetic traces of vectors and stationary time series can be generated using empirical copula while preserving the entire dependence structure of small datasets.[34] Such empirical traces are useful in various simulation-based performance studies.[35]

References

  1. Lua error in package.lua at line 80: module 'strict' not found.
  2. Lua error in package.lua at line 80: module 'strict' not found.
  3. Lua error in package.lua at line 80: module 'strict' not found.
  4. Lua error in package.lua at line 80: module 'strict' not found.
  5. 5.0 5.1 5.2 Lua error in package.lua at line 80: module 'strict' not found.
  6. Lua error in package.lua at line 80: module 'strict' not found.
  7. 7.0 7.1 Ali, M.M., Mikhail, N.N. and Haq, M.S. (1978). A class of bivariate distributions including the bivariate logistic. J. Multivariate Anal. 8, 405-412
  8. 8.0 8.1 Lua error in package.lua at line 80: module 'strict' not found.
  9. Alexander J. McNeil, Rudiger Frey and Paul Embrechts (2005) "Quantitative Risk Management: Concepts, Techniques, and Tools", Princeton Series in Finance
  10. Lua error in package.lua at line 80: module 'strict' not found.
  11. Lua error in package.lua at line 80: module 'strict' not found.
  12. Lua error in package.lua at line 80: module 'strict' not found.
  13. Lua error in package.lua at line 80: module 'strict' not found.
  14. Lua error in package.lua at line 80: module 'strict' not found.
  15. Lua error in package.lua at line 80: module 'strict' not found.
  16. Lua error in package.lua at line 80: module 'strict' not found.
  17. Lua error in package.lua at line 80: module 'strict' not found.
  18. Recipe for Disaster: The Formula That Killed Wall Street Wired, 2/23/2009
  19. Lua error in package.lua at line 80: module 'strict' not found.
  20. 20.0 20.1 Lua error in package.lua at line 80: module 'strict' not found.
  21. Lua error in package.lua at line 80: module 'strict' not found.
  22. Lua error in package.lua at line 80: module 'strict' not found.
  23. Lua error in package.lua at line 80: module 'strict' not found.
  24. Lua error in package.lua at line 80: module 'strict' not found.
  25. Lua error in package.lua at line 80: module 'strict' not found.
  26. Lua error in package.lua at line 80: module 'strict' not found.
  27. Lua error in package.lua at line 80: module 'strict' not found.
  28. Lua error in package.lua at line 80: module 'strict' not found.
  29. Lua error in package.lua at line 80: module 'strict' not found.
  30. Lua error in package.lua at line 80: module 'strict' not found.
  31. Lua error in package.lua at line 80: module 'strict' not found.
  32. Lua error in package.lua at line 80: module 'strict' not found.
  33. Lua error in package.lua at line 80: module 'strict' not found.
  34. Lua error in package.lua at line 80: module 'strict' not found.
  35. Lua error in package.lua at line 80: module 'strict' not found.

Further reading

  • The standard reference for an introduction to copulas. Covers all fundamental aspects, summarizes the most popular copula classes, and provides proofs for the important theorems related to copulas
Roger B. Nelsen (1999), "An Introduction to Copulas", Springer. ISBN 978-0-387-98623-4
  • A book covering current topics in mathematical research on copulas:
Piotr Jaworski, Fabrizio Durante, Wolfgang Karl Härdle, Tomasz Rychlik (Editors): (2010): "Copula Theory and Its Applications" Lecture Notes in Statistics, Springer. ISBN 978-3-642-12464-8
  • A reference for sampling applications and stochastic models related to copulas is
Jan-Frederik Mai, Matthias Scherer (2012): Simulating Copulas (Stochastic Models, Sampling Algorithms and Applications). World Scientific. ISBN 978-1-84816-874-9
  • A paper covering the historic development of copula theory, by the person associated with the "invention" of copulas, Abe Sklar.
Abe Sklar (1997): "Random variables, distribution functions, and copulas – a personal look backward and forward" in Rüschendorf, L., Schweizer, B. und Taylor, M. (eds) Distributions With Fixed Marginals & Related Topics (Lecture Notes – Monograph Series Number 28). ISBN 978-0-940600-40-9
  • The standard reference for multivariate models and copula theory in the context of financial and insurance models
Alexander J. McNeil, Rudiger Frey and Paul Embrechts (2005) "Quantitative Risk Management: Concepts, Techniques, and Tools", Princeton Series in Finance. ISBN 978-0-691-12255-7

External links