Bivariate copulas
Constructing and displaying
Note that the name parameter for the t-copula is given in the documentation as “student”, but the function actually takes the string “t”.
tcop <- bicop_dist('t', parameters=c(0.25, 4))
print(tcop)
Bivariate copula ('bicop_dist'): family = t, rotation = 0, parameters = 0.25, 4, var_types = c,c
plot(tcop)

contour(tcop)

Contour plots are generated with standard normal margins by default, but you can choose from standard uniform (“unif”), standard exponential (“exp”), or flipped exponential (“flexp”)
gcop <- bicop_dist('gumbel', rotation=90, parameters=2.5)
contour(gcop)

contour(gcop, margins='unif')

Density, distribution, conditional distribution, and RNG functions
Density and distribution functions are computed on (standard uniform) pseudo-observations.
u1 <- matrix(c(0.8, 0.2, 0.9, 0.2, 0.8, 0.9), ncol=2)
u1
[,1] [,2]
[1,] 0.8 0.2
[2,] 0.2 0.8
[3,] 0.9 0.9
Density:
dbicop(u1, gcop)
[1] 2.220596 3.087756 0.017942
Probability (distribution function):
pbicop(u1, gcop)
[1] 0.08040761 0.05505112 0.80004124
The “h-functions” are conditional distributions. The cond_var argument determines which is the conditioning variable. So, \[h_1(u,v) = P(V\leq v | U = u),\] and \[h_2(u,v) = P(U \leq u | V = v).\]
u2 <- matrix(c(0.2, 0.4, 0.6, 0.8, 0.8, 0.8), ncol=2)
u2
[,1] [,2]
[1,] 0.2 0.8
[2,] 0.4 0.8
[3,] 0.6 0.8
Unconditional (joint):
pbicop(u2, gcop)
[1] 0.05505112 0.21472948 0.40423109
Conditional:
hbicop(u2, gcop, cond_var = 1)
[1] 0.6143537 0.9083536 0.9724446
The RNG just takes a number of points to generate. The margins of the outputs are standard uniform.
ur <- rbicop(1000, gcop)
plot(ur)

You can also specify quasi-random instead of pseudorandom points.
uq <- rbicop(1000, gcop, qrng=TRUE)
plot(uq)

Vine copulas
Vine structure
Vines are represented in rvinecopulib using a special structure. The easiest way to create one of those structures is to convert it from the matrix representation. The vine matrices used here are flipped left to right from the version in Czado’s book, but they are otherwise compatible.
Here is a vine constructed from Example 5.3 from Czado (sort of. \(T_1\) is the same, but I constructed the subsequent trees a little differently):
m5.3 <- matrix(c(5,1,2,3,4,6, 1,2,3,4,5,0, 3,1,2,4,0,0, 1,2,3,rep(0,3), 1,2,rep(0,4), 1,rep(0,5)), ncol=6)
m5.3
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 5 1 3 1 1 1
[2,] 1 2 1 2 2 0
[3,] 2 3 2 3 0 0
[4,] 3 4 4 0 0 0
[5,] 4 5 0 0 0 0
[6,] 6 0 0 0 0 0
v5.3 <- as_rvine_structure(m5.3)
v5.3
6-dimensional R-vine structure ('rvine_structure')
5 1 3 1 1 1
1 2 1 2 2
2 3 2 3
3 4 4
4 5
6
plot(v5.3, tree=1:5)

There are convenience functions for constructing D-Vines and C-Vines. (For the first parameter you could also just put the number of dimensions, and the labels would be chosen in a default order)
vd5 <- dvine_structure(seq(5,1))
vd5
5-dimensional R-vine structure ('rvine_structure')
4 3 2 1 1
3 2 1 2
2 1 3
1 4
5
plot(vd5, tree='ALL')

vc5 <- cvine_structure(5)
plot(vc5, tree='ALL')

Specifying a “truncation level” allows you to suppress higher-order interactions.
vd5_2 <- dvine_structure(seq(5,1), 2)
print(vd5_2)
5-dimensional R-vine structure ('rvine_structure'), 2-truncated
4 3 2 1 1
3 2 1 2
3
4
5
dim(vd5_2)
dim trunc_lvl
5 2
plot(vd5_2, tree='ALL')

Vine copula distributions
You can build a vine copula distribution with a vine copula structure and a bunch of bivariate copulas. The bivariate copulas are organized into a list of lists, with each element of the top-level list corresponding to a tree (organized as \(T_1\) through \(T_n\)), and each element of the second-level lists corresponding to one of the edges in that tree. Within each tree the edges are taken left-to-right from the columns of the structure matrix.
ci <- bicop_dist()
cnp <- bicop_dist('gaussian', parameters=0.7)
cnn <- bicop_dist('gaussian', parameters=-0.7)
pclist <- list(
list(cnp, ci, ci, cnn),
list(ci,ci,ci),
list(ci,ci),
list(ci)
)
vcop <- vinecop_dist(pclist, vd5)
contour(vcop)

Density, distribution, and RNG functions
Like the bivariate copulas, there are density and distribution functions for vine copulas. (There is, however, no equivalent of the h-functions.)
u4 <- matrix(c(
rep(0.5, 5), # center of the distribution
rep(0.75, 5),
c(0.25, rep(0.75, 4)), # Higher density than the previous b/c 1,2 are anticorrelated
c(rep(0.75,4), 0.25) # Low density b/c 1,2 and 4,5 have the wrong association.
),
ncol=5,
byrow=TRUE)
u4
[,1] [,2] [,3] [,4] [,5]
[1,] 0.50 0.50 0.50 0.50 0.50
[2,] 0.75 0.75 0.75 0.75 0.75
[3,] 0.25 0.75 0.75 0.75 0.75
[4,] 0.75 0.75 0.75 0.75 0.25
dvinecop(u4, vcop, cores=2) # Supports multicore evaluation!
[1] 1.9607843 0.8180376 2.8519360 0.2346425
pvinecop(u4, vcop, cores=2)
[1] 0.0234 0.2459 0.0491 0.0924
The RNG function allows for a QRNG option. With Gaussian bivariate copulas across the board, The D-Vine with truncation level 2 should be equivalent to an AR(2) model, albeit without the ability to easily extend the series to arbitrary length. On the other hand, we can introduce tail dependence and other such using the copula model.
vcop2 <- vinecop_dist(
list(rep(list(tcop), 4),
rep(list(cnn), 3)), # after controlling for the lag-1 var, the lag-2 var is anticorrelated
vd5_2
)
contour(vcop2)

z <- qnorm(rvinecop(500, vcop2, qrng=TRUE, cores=2))
GGally::ggpairs(as.data.frame(z), progress=FALSE) # plot on std. normal margins

LS0tDQp0aXRsZTogIk5vdGVib29rOiBydmluZWNvcHVsaWIgYmFzaWNzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3Igc2V0dXB9DQpsaWJyYXJ5KCdydmluZWNvcHVsaWInKQ0KDQpzZXQuc2VlZCg4NjctNTMwOSkNCmBgYA0KDQojIyBCaXZhcmlhdGUgY29wdWxhcw0KDQojIyMgQ29uc3RydWN0aW5nIGFuZCBkaXNwbGF5aW5nDQoNCk5vdGUgdGhhdCB0aGUgbmFtZSBwYXJhbWV0ZXIgZm9yIHRoZSB0LWNvcHVsYSBpcyBnaXZlbiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcw0KInN0dWRlbnQiLCBidXQgdGhlIGZ1bmN0aW9uIGFjdHVhbGx5IHRha2VzIHRoZSBzdHJpbmcgInQiLg0KDQpgYGB7cn0NCnRjb3AgPC0gYmljb3BfZGlzdCgndCcsIHBhcmFtZXRlcnM9YygwLjI1LCA0KSkNCnByaW50KHRjb3ApDQpwbG90KHRjb3ApDQpjb250b3VyKHRjb3ApDQpgYGANCg0KQ29udG91ciBwbG90cyBhcmUgZ2VuZXJhdGVkIHdpdGggc3RhbmRhcmQgbm9ybWFsIG1hcmdpbnMgYnkgZGVmYXVsdCwgYnV0IHlvdSBjYW4NCmNob29zZSBmcm9tIHN0YW5kYXJkIHVuaWZvcm0gKCJ1bmlmIiksIHN0YW5kYXJkIGV4cG9uZW50aWFsICgiZXhwIiksIG9yIGZsaXBwZWQNCmV4cG9uZW50aWFsICgiZmxleHAiKQ0KYGBge3J9DQpnY29wIDwtIGJpY29wX2Rpc3QoJ2d1bWJlbCcsIHJvdGF0aW9uPTkwLCBwYXJhbWV0ZXJzPTIuNSkNCmNvbnRvdXIoZ2NvcCkNCmNvbnRvdXIoZ2NvcCwgbWFyZ2lucz0ndW5pZicpDQpgYGANCg0KIyMjIERlbnNpdHksIGRpc3RyaWJ1dGlvbiwgY29uZGl0aW9uYWwgZGlzdHJpYnV0aW9uLCBhbmQgUk5HIGZ1bmN0aW9ucw0KDQpEZW5zaXR5IGFuZCBkaXN0cmlidXRpb24gZnVuY3Rpb25zIGFyZSBjb21wdXRlZCBvbiAoc3RhbmRhcmQgdW5pZm9ybSkgcHNldWRvLW9ic2VydmF0aW9ucy4NCg0KYGBge3J9DQp1MSA8LSBtYXRyaXgoYygwLjgsIDAuMiwgMC45LCAwLjIsIDAuOCwgMC45KSwgbmNvbD0yKQ0KdTENCmBgYA0KRGVuc2l0eToNCmBgYHtyfQ0KZGJpY29wKHUxLCBnY29wKQ0KYGBgDQpQcm9iYWJpbGl0eSAoZGlzdHJpYnV0aW9uIGZ1bmN0aW9uKToNCmBgYHtyfQ0KcGJpY29wKHUxLCBnY29wKQ0KYGBgDQoNClRoZSAiaC1mdW5jdGlvbnMiIGFyZSBjb25kaXRpb25hbCBkaXN0cmlidXRpb25zLiAgVGhlIGBjb25kX3ZhcmAgYXJndW1lbnQgZGV0ZXJtaW5lcw0Kd2hpY2ggaXMgdGhlIGNvbmRpdGlvbmluZyB2YXJpYWJsZS4gIFNvLA0KJCRoXzEodSx2KSA9IFAoVlxsZXEgdiB8IFUgPSB1KSwkJA0KYW5kDQokJGhfMih1LHYpID0gUChVIFxsZXEgdSB8IFYgPSB2KS4kJA0KDQpgYGB7cn0NCnUyIDwtIG1hdHJpeChjKDAuMiwgMC40LCAwLjYsIDAuOCwgMC44LCAwLjgpLCBuY29sPTIpDQp1Mg0KYGBgDQpVbmNvbmRpdGlvbmFsIChqb2ludCk6DQpgYGB7cn0NCnBiaWNvcCh1MiwgZ2NvcCkNCmBgYA0KQ29uZGl0aW9uYWw6DQpgYGB7cn0NCmhiaWNvcCh1MiwgZ2NvcCwgY29uZF92YXIgPSAxKQ0KYGBgDQoNClRoZSBSTkcganVzdCB0YWtlcyBhIG51bWJlciBvZiBwb2ludHMgdG8gZ2VuZXJhdGUuICBUaGUgbWFyZ2lucyBvZiB0aGUgb3V0cHV0cw0KYXJlIHN0YW5kYXJkIHVuaWZvcm0uDQpgYGB7cn0NCnVyIDwtIHJiaWNvcCgxMDAwLCBnY29wKQ0KcGxvdCh1cikNCmBgYA0KWW91IGNhbiBhbHNvIHNwZWNpZnkgcXVhc2ktcmFuZG9tIGluc3RlYWQgb2YgcHNldWRvcmFuZG9tIHBvaW50cy4NCmBgYHtyfQ0KdXEgPC0gcmJpY29wKDEwMDAsIGdjb3AsIHFybmc9VFJVRSkNCnBsb3QodXEpDQpgYGANCg0KIyMgVmluZSBjb3B1bGFzDQoNCiMjIyBWaW5lIHN0cnVjdHVyZQ0KDQpWaW5lcyBhcmUgcmVwcmVzZW50ZWQgaW4gYHJ2aW5lY29wdWxpYmAgdXNpbmcgYSBzcGVjaWFsIHN0cnVjdHVyZS4gIFRoZSBlYXNpZXN0DQp3YXkgdG8gY3JlYXRlIG9uZSBvZiB0aG9zZSBzdHJ1Y3R1cmVzIGlzIHRvIGNvbnZlcnQgaXQgZnJvbSB0aGUgbWF0cml4IHJlcHJlc2VudGF0aW9uLg0KVGhlIHZpbmUgbWF0cmljZXMgdXNlZCBoZXJlIGFyZSBmbGlwcGVkIGxlZnQgdG8gcmlnaHQgZnJvbSB0aGUgdmVyc2lvbiBpbiBDemFkbydzIA0KYm9vaywgYnV0IHRoZXkgYXJlIG90aGVyd2lzZSBjb21wYXRpYmxlLg0KDQpIZXJlIGlzIGEgdmluZSBjb25zdHJ1Y3RlZCBmcm9tIEV4YW1wbGUgNS4zIGZyb20gQ3phZG8gKHNvcnQgb2YuICRUXzEkIGlzIHRoZSBzYW1lLA0KYnV0IEkgY29uc3RydWN0ZWQgdGhlIHN1YnNlcXVlbnQgdHJlZXMgYSBsaXR0bGUgZGlmZmVyZW50bHkpOg0KYGBge3J9DQptNS4zIDwtIG1hdHJpeChjKDUsMSwyLDMsNCw2LCAxLDIsMyw0LDUsMCwgMywxLDIsNCwwLDAsIDEsMiwzLHJlcCgwLDMpLCAxLDIscmVwKDAsNCksIDEscmVwKDAsNSkpLCBuY29sPTYpDQptNS4zDQp2NS4zIDwtIGFzX3J2aW5lX3N0cnVjdHVyZShtNS4zKQ0KdjUuMw0KcGxvdCh2NS4zLCB0cmVlPTE6NSkNCmBgYA0KDQpUaGVyZSBhcmUgY29udmVuaWVuY2UgZnVuY3Rpb25zIGZvciBjb25zdHJ1Y3RpbmcgRC1WaW5lcyBhbmQgQy1WaW5lcy4gKEZvciB0aGUNCmZpcnN0IHBhcmFtZXRlciB5b3UgY291bGQgYWxzbyBqdXN0IHB1dCB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMsIGFuZCB0aGUgbGFiZWxzDQp3b3VsZCBiZSBjaG9zZW4gaW4gYSBkZWZhdWx0IG9yZGVyKQ0KYGBge3J9DQp2ZDUgPC0gZHZpbmVfc3RydWN0dXJlKHNlcSg1LDEpKQ0KdmQ1DQpwbG90KHZkNSwgdHJlZT0nQUxMJykNCmBgYA0KYGBge3J9DQp2YzUgPC0gY3ZpbmVfc3RydWN0dXJlKDUpDQpwbG90KHZjNSwgdHJlZT0nQUxMJykNCmBgYA0KDQpTcGVjaWZ5aW5nIGEgInRydW5jYXRpb24gbGV2ZWwiIGFsbG93cyB5b3UgdG8gc3VwcHJlc3MgaGlnaGVyLW9yZGVyIGludGVyYWN0aW9ucy4NCmBgYHtyfQ0KdmQ1XzIgPC0gZHZpbmVfc3RydWN0dXJlKHNlcSg1LDEpLCAyKQ0KcHJpbnQodmQ1XzIpDQpkaW0odmQ1XzIpDQpwbG90KHZkNV8yLCB0cmVlPSdBTEwnKQ0KYGBgDQoNCiMjIyBWaW5lIGNvcHVsYSBkaXN0cmlidXRpb25zDQpZb3UgY2FuIGJ1aWxkIGEgdmluZSBjb3B1bGEgZGlzdHJpYnV0aW9uIHdpdGggYSB2aW5lIGNvcHVsYSBzdHJ1Y3R1cmUgYW5kIGEgYnVuY2gNCm9mIGJpdmFyaWF0ZSBjb3B1bGFzLiAgVGhlIGJpdmFyaWF0ZSBjb3B1bGFzIGFyZSBvcmdhbml6ZWQgaW50byBhIGxpc3Qgb2YgbGlzdHMsDQp3aXRoIGVhY2ggZWxlbWVudCBvZiB0aGUgdG9wLWxldmVsIGxpc3QgY29ycmVzcG9uZGluZyB0byBhIHRyZWUgKG9yZ2FuaXplZCBhcyANCiRUXzEkIHRocm91Z2ggJFRfbiQpLCBhbmQgZWFjaCBlbGVtZW50IG9mIHRoZSBzZWNvbmQtbGV2ZWwgbGlzdHMgY29ycmVzcG9uZGluZw0KdG8gb25lIG9mIHRoZSBlZGdlcyBpbiB0aGF0IHRyZWUuICBXaXRoaW4gZWFjaCB0cmVlIHRoZSBlZGdlcyBhcmUgdGFrZW4gbGVmdC10by1yaWdodA0KZnJvbSB0aGUgY29sdW1ucyBvZiB0aGUgc3RydWN0dXJlIG1hdHJpeC4NCmBgYHtyfQ0KY2kgPC0gYmljb3BfZGlzdCgpDQpjbnAgPC0gYmljb3BfZGlzdCgnZ2F1c3NpYW4nLCBwYXJhbWV0ZXJzPTAuNykNCmNubiA8LSBiaWNvcF9kaXN0KCdnYXVzc2lhbicsIHBhcmFtZXRlcnM9LTAuNykNCnBjbGlzdCA8LSBsaXN0KA0KICBsaXN0KGNucCwgY2ksIGNpLCBjbm4pLA0KICBsaXN0KGNpLGNpLGNpKSwNCiAgbGlzdChjaSxjaSksDQogIGxpc3QoY2kpDQopDQp2Y29wIDwtIHZpbmVjb3BfZGlzdChwY2xpc3QsIHZkNSkNCmNvbnRvdXIodmNvcCkNCmBgYA0KDQojIyMgRGVuc2l0eSwgZGlzdHJpYnV0aW9uLCBhbmQgUk5HIGZ1bmN0aW9ucw0KDQpMaWtlIHRoZSBiaXZhcmlhdGUgY29wdWxhcywgdGhlcmUgYXJlIGRlbnNpdHkgYW5kIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbnMgZm9yIHZpbmUNCmNvcHVsYXMuIChUaGVyZSBpcywgaG93ZXZlciwgbm8gZXF1aXZhbGVudCBvZiB0aGUgaC1mdW5jdGlvbnMuKQ0KDQpgYGB7cn0NCnU0IDwtIG1hdHJpeChjKA0KICByZXAoMC41LCA1KSwgICAgICAgICAgICMgY2VudGVyIG9mIHRoZSBkaXN0cmlidXRpb24NCiAgcmVwKDAuNzUsIDUpLCAgICAgICAgICANCiAgYygwLjI1LCByZXAoMC43NSwgNCkpLCAjIEhpZ2hlciBkZW5zaXR5IHRoYW4gdGhlIHByZXZpb3VzIGIvYyAxLDIgYXJlIGFudGljb3JyZWxhdGVkDQogIGMocmVwKDAuNzUsNCksIDAuMjUpICAgIyBMb3cgZGVuc2l0eSBiL2MgMSwyIGFuZCA0LDUgaGF2ZSB0aGUgd3JvbmcgYXNzb2NpYXRpb24uDQogICksDQogIG5jb2w9NSwNCiAgYnlyb3c9VFJVRSkNCnU0DQpkdmluZWNvcCh1NCwgdmNvcCwgY29yZXM9MikgICMgU3VwcG9ydHMgbXVsdGljb3JlIGV2YWx1YXRpb24hDQpwdmluZWNvcCh1NCwgdmNvcCwgY29yZXM9MikNCmBgYA0KDQpUaGUgUk5HIGZ1bmN0aW9uIGFsbG93cyBmb3IgYSBRUk5HIG9wdGlvbi4gIFdpdGggR2F1c3NpYW4gYml2YXJpYXRlIGNvcHVsYXMgYWNyb3NzDQp0aGUgYm9hcmQsIFRoZSBELVZpbmUgd2l0aCB0cnVuY2F0aW9uIGxldmVsIDIgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gYW4gQVIoMikgbW9kZWwsDQphbGJlaXQgd2l0aG91dCB0aGUgYWJpbGl0eSB0byBlYXNpbHkgZXh0ZW5kIHRoZSBzZXJpZXMgdG8gYXJiaXRyYXJ5IGxlbmd0aC4gIE9uIA0KdGhlIG90aGVyIGhhbmQsIHdlIGNhbiBpbnRyb2R1Y2UgdGFpbCBkZXBlbmRlbmNlIGFuZCBvdGhlciBzdWNoIHVzaW5nIHRoZSBjb3B1bGENCm1vZGVsLg0KYGBge3J9DQp2Y29wMiA8LSB2aW5lY29wX2Rpc3QoDQogIGxpc3QocmVwKGxpc3QodGNvcCksIDQpLA0KICAgICAgIHJlcChsaXN0KGNubiksIDMpKSwgICAjIGFmdGVyIGNvbnRyb2xsaW5nIGZvciB0aGUgbGFnLTEgdmFyLCB0aGUgbGFnLTIgdmFyIGlzIGFudGljb3JyZWxhdGVkDQogIHZkNV8yDQopDQpjb250b3VyKHZjb3AyKQ0KeiA8LSBxbm9ybShydmluZWNvcCg1MDAsIHZjb3AyLCBxcm5nPVRSVUUsIGNvcmVzPTIpKQ0KR0dhbGx5OjpnZ3BhaXJzKGFzLmRhdGEuZnJhbWUoeiksIHByb2dyZXNzPUZBTFNFKSAgICMgcGxvdCBvbiBzdGQuIG5vcm1hbCBtYXJnaW5zDQpgYGANCg==