The Diversification Question

Copula-Based Aggregation of Operational Risk Losses

Author

Patrick Lefler

Published

June 24, 2026

Abstract
Operational risk capital is typically estimated category by category and then summed, an approach that implicitly assumes every loss type peaks at once. This project tests that assumption using ten years of synthetic annual loss data across five categories for NexaCore Financial Technologies, built around a single engineered dependence channel: a systems outage that elevates downstream process failures within the same year. A bivariate copula fit to the one category pair carrying genuine dependence selects a Student-t copula at two degrees of freedom — modest but real co-movement, with a Kendall’s tau of 0.16. Simulating the joint annual loss distribution puts diversified 99.9% Value-at-Risk at €17.5 million, against an additive sum of standalone category VaRs of €24.9 million, a 29.5% reduction; Expected Shortfall shows a comparable 33.8% reduction. Recomputing this benefit under four alternative copula families moves the estimate by roughly one percentage point, not because dependence is unimportant but because only one of five categories carries any modeled dependence at all. Most of the diversification benefit comes from summing independent risks, not from the specific copula chosen. The more useful board-level message is not which copula fits best, but how much of an aggregate capital figure’s apparent precision rests on categories nobody modeled any relationship between.

Introduction

Most operational risk frameworks compute capital one category at a time, then add the numbers together. Internal fraud gets its own 99.9th percentile. So does ICT disruption, execution failure, conduct risk, external fraud. The five figures are summed, and the total becomes the capital number a board signs off on. That sum is mathematically equivalent to assuming all five categories suffer their worst plausible year simultaneously, a scenario with vanishingly small probability under any model where the categories are not perfectly dependent.

This project asks a narrower, more answerable question: for NexaCore Financial Technologies, how much does that assumption cost in excess capital, and how confident should anyone be in the answer? Ten years of synthetic annual loss data are constructed across five Basel-style event-type categories, with one deliberate dependence channel built in — a systems outage that elevates downstream process failures within the same year. A bivariate copula is fit to that pair, selected by AIC among five candidate families, and used to simulate the joint annual loss distribution. The diversified 99.9% Value-at-Risk on that joint distribution is then compared against the additive sum of standalone category VaRs, the implicit assumption under the silo approach described above.

One clarification matters before any of the numbers below. This is an internal economic capital exercise, not a regulatory capital calculation. The Standardised Measurement Approach under CRR3/CRD6, which replaced the Advanced Measurement Approach in January 2025, computes operational risk capital from a Business Indicator Component with no loss-distribution or dependence-modeling component at all. A copula-based aggregation framework has no role under current regulatory rules. Its value is in risk appetite setting and internal capital allocation, where firms remain free to model dependence however they judge most defensible.

A second clarification concerns scope rather than regulation. The marginal severity model used here is intentionally simple: lognormal, with no extreme value treatment of the tail. Tail-fitting methodology for NexaCore’s loss categories was addressed in a companion project; reproducing that work here would dilute the question this analysis is actually built to answer, which is about dependence, not severity.

The answer turns out to be more interesting than the project initially set out to demonstrate, and not in the direction expected.

Loss Category Design and Synthetic Data

NexaCore’s operational loss history is constructed across five categories adapted from Basel-style event-type taxonomies: Internal Fraud, External Fraud, ICT & Business Disruption, Execution/Delivery & Process Management, and Clients & Business Practices. The third and fifth categories carry particular weight for an EU fintech audience: conduct risk has driven some of the largest individual operational losses across the sector, and ICT disruption sits at the center of DORA’s incident-reporting and resilience-testing obligations.

Each category follows a compound Poisson-lognormal structure: a monthly event count drawn from a Poisson distribution, paired with a lognormal severity draw for each event. Ten years of monthly history (120 months) were simulated this way, then aggregated to annual totals. Table 1 shows the frequency and severity parameters fit back to that simulated history. These are the parameters a risk team would actually estimate from ten years of internal loss data, not the underlying generating values, which is the realistic vantage point this analysis takes throughout.

Display code
marginal_fits |>
  dplyr::mutate(
    annual_lambda   = round(freq_lambda * 12, 1),
    median_severity = eur(exp(sev_mu)),
    sev_sigma       = round(sev_sigma, 2)
  ) |>
  dplyr::select(category, n_events, annual_lambda, median_severity, sev_sigma) |>
  dplyr::arrange(dplyr::desc(annual_lambda)) |>
  kable(
    format    = "html",
    digits    = 2,
    col.names = c("Category", "Events (n)", "Annual Frequency (\u03bb)", "Median Severity", "Severity \u03c3")
  ) |>
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width        = TRUE,
    position          = "left",
    font_size         = 13
  )
Table 1: Marginal Frequency-Severity Fits by Category (10-Year History)
Category Events (n) Annual Frequency (λ) Median Severity Severity σ
Execution, Delivery & Process Mgmt 870 87.0 €6,737 0.81
External Fraud 388 38.8 €2,118 0.92
ICT & Business Disruption 161 16.1 €67,574 0.97
Clients & Business Practices 92 9.2 €148,289 1.15
Internal Fraud 89 8.9 €52,214 1.19

Figure 1 shows the resulting ten-year loss history by category. Clients & Business Practices dominates the total in most years, driven by a small number of large conduct events rather than steady attrition, a pattern consistent with how conduct risk losses tend to materialize in practice. Severity depth for any single category’s tail is intentionally out of scope here. A companion project addresses extreme value methodology for loss severity directly, and reproducing that work here would dilute the question this analysis is built to answer.

Display code
p_annual_losses <- annual_category_losses |>
  ggplot(aes(x = year, y = total_loss, fill = category)) +
  geom_col(position = "stack") +
  scale_fill_manual(values = category_colors) +
  scale_y_continuous(labels = eur) +
  scale_x_continuous(breaks = 1:10) +
  labs(x = "Year", y = "Total Annual Loss", fill = NULL) +
  theme_brand()

p_annual_losses
Figure 1: Annual Loss by Category, 10-Year Synthetic History

One dependence channel is built into the simulation deliberately, and documented rather than left to emerge by chance: in any month where an ICT & Business Disruption event occurs, Execution, Delivery & Process Management draws additional events that same month, at elevated severity, representing the processing backlog and remediation cost that typically follows a systems outage. No other category pair carries any engineered relationship. The next section quantifies how strong that one designed relationship turns out to be once aggregated to an annual basis, and how confidently a copula model can recover it from ten years of history.

Copula Selection and Dependence Structure

Rank-transforming the ten annual loss totals for ICT & Business Disruption and Execution, Delivery & Process Management onto a (0,1) scale isolates dependence from each category’s own marginal distribution: the standard pseudo-observation approach for copula fitting. Five candidate families, Gaussian, Student-t, Clayton, Gumbel, and Frank, are then fit to those pseudo-observations by maximum pseudo-likelihood and ranked by AIC.

The two series show a modest but real positive relationship: Kendall’s tau of 0.16, Spearman’s rho of 0.15. That is smaller than the underlying contagion mechanism might suggest. The mechanism fires in roughly three-quarters of months, but most years end up with substantial contagion exposure regardless of exactly how many months triggered it, which compresses the year-to-year dependence signal once losses are aggregated annually. A modest tau is the honest result of a dependence that operates monthly being viewed through an annual lens.

Display code
copula_aic |>
  dplyr::select(rank, family, params, loglik, aic) |>
  kable(
    format    = "html",
    digits    = 3,
    col.names = c("Rank", "Family", "Parameter", "Log-Likelihood", "AIC")
  ) |>
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width        = TRUE,
    position          = "left",
    font_size         = 13
  )
Table 2: Candidate Copula Families Fit to the ICT-Execution Pair, Ranked by AIC
Rank Family Parameter Log-Likelihood AIC
1 t (df=2) 0.270 0.817 0.365
2 t (df=4) 0.283 0.502 0.995
3 t (df=6) 0.271 0.361 1.279
4 Gumbel 1.318 0.346 1.309
5 t (df=10) 0.249 0.237 1.525
6 Clayton -0.288 0.143 1.715
7 t (df=20) 0.221 0.142 1.716
8 Frank 1.357 0.140 1.721
9 Gaussian 0.184 0.048 1.904

Table 2 ranks the five candidates. The Student-t copula at two degrees of freedom wins, though not by a wide margin: three other families sit within roughly one AIC unit, conventionally read as comparable statistical support at this sample size. Ten annual observations is not enough to be confident in any single family over its closest competitors, a limitation the conclusion returns to directly.

Clayton’s result is worth a specific note. Its fitted parameter is negative, implying lower-tail dependence running in the opposite direction from what the data actually shows. The family is simply a poor fit here, reflected in its last-place AIC, not an estimation error.

Display code
pseudo_obs_df |>
  ggplot(aes(x = ict_u, y = exec_u)) +
  geom_abline(slope = 1, intercept = 0, color = "#B4B2A9", linetype = "dotted", linewidth = 0.5) +
  geom_point(size = 3.5, color = brand_accent, alpha = 0.9) +
  scale_x_continuous(limits = c(0, 1), expand = c(0.05, 0.05)) +
  scale_y_continuous(limits = c(0, 1), expand = c(0.05, 0.05)) +
  labs(
    x       = "ICT & Business Disruption (rank-transformed)",
    y       = "Execution/Process (rank-transformed)",
    caption = "Dotted line marks perfect positive dependence (comonotonicity), shown for reference only."
  ) +
  theme_brand()
Figure 2: Pseudo-Observations, ICT vs. Execution/Process Annual Losses (n = 10 years)

Figure 2 shows the pseudo-observations directly. With ten points, no copula family can be confirmed visually beyond a general upward tilt, which is itself the point: a sample this small supports a directional read, not a confident shape read.

One finding falls outside this analysis’s stated scope but is worth reporting rather than hiding. A broader automated search across extreme-value families finds a Tawn type-1 copula with an AIC roughly one point better than the Student-t result above. This analysis is intentionally restricted to five standard families representative of a typical first-pass candidate set; a Tawn-based refinement is a reasonable next step but is left out of this version rather than expanding scope mid-project.

Joint Simulation and Capital Comparison

Display code
standalone_var_es |>
  dplyr::arrange(dplyr::desc(var_999)) |>
  dplyr::mutate(
    var_999 = eur(var_999),
    es_999  = eur(es_999)
  ) |>
  kable(
    format    = "html",
    col.names = c("Category", "VaR (99.9%)", "Expected Shortfall (99.9%)")
  ) |>
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width        = TRUE,
    position          = "left",
    font_size         = 13
  )
Table 3: Standalone 99.9% VaR and Expected Shortfall by Category
Category VaR (99.9%) Expected Shortfall (99.9%)
Clients & Business Practices €13,135,528 €16,258,818
ICT & Business Disruption €5,155,897 €5,744,134
Internal Fraud €5,085,393 €6,843,343
Execution, Delivery & Process Mgmt €1,241,976 €1,284,140
External Fraud €251,888 €273,216

Table 3 reports each category’s own 99.9% VaR and Expected Shortfall, computed independently of any dependence assumption. Two categories, Clients & Business Practices and Internal Fraud, account for 73.3% of the combined VaR total; both are independent by construction and both carry the heaviest severity tails in the portfolio, with severity σ of 1.15 and 1.19 respectively. That concentration matters for what follows.

The additive approach simply sums these five figures, the implicit assumption behind a silo-by-silo capital framework. The diversified approach instead simulates the joint annual loss directly: the ICT-Execution pair is drawn through the AIC-selected Student-t copula, the remaining three categories are simulated independently, and the resulting totals are summed across 50,000 Monte Carlo iterations to build the joint annual loss distribution.

Display code
primary_comparison <- var_comparison |> dplyr::arrange(aic) |> dplyr::slice(1)

comparison_df <- tibble::tibble(
  metric   = rep(c("VaR (99.9%)", "Expected Shortfall"), each = 2),
  approach = rep(c("Additive (Silo)", "Diversified (Copula)"), times = 2),
  value    = c(primary_comparison$additive_var, primary_comparison$diversified_var,
               primary_comparison$additive_es,  primary_comparison$diversified_es)
)

p_var_comparison <- comparison_df |>
  ggplot(aes(x = metric, y = value, fill = approach)) +
  geom_col(position = position_dodge(width = 0.7), width = 0.6) +
  geom_text(aes(label = eur(value)), position = position_dodge(width = 0.7),
            vjust = -0.5, size = 3.5, family = "Roboto", color = brand_text) +
  scale_fill_manual(values = c("Additive (Silo)" = brand_neutral, "Diversified (Copula)" = brand_highlight)) +
  scale_y_continuous(labels = eur, expand = expansion(mult = c(0, 0.15))) +
  labs(x = NULL, y = "Annual Capital Estimate", fill = NULL) +
  theme_brand()

p_var_comparison
Figure 3: Additive vs. Diversified 99.9% VaR and Expected Shortfall

Figure 3 shows the result. Additive 99.9% VaR comes to €24.9 million; the diversified figure is €17.5 million, a reduction of €7.3 million, or 29.5%. Expected Shortfall shows a similar pattern: €30.4 million additive against €20.1 million diversified, a 33.8% reduction. Both reductions are real and large enough to matter for capital planning. Whether they should be attributed mainly to the copula chosen, or to something else entirely, is the question the next section answers, and the answer is not the one this project initially expected to find.

Model Risk in the Dependence Assumption

The original premise behind this section was straightforward: recompute the diversification benefit under each of the five candidate copula families and show how much the choice of dependence structure moves the answer. Table 4 does exactly that, and the answer barely moves at all.

Display code
var_comparison |>
  dplyr::arrange(aic) |>
  dplyr::mutate(
    diversified_var = eur(diversified_var),
    diversified_es  = eur(diversified_es),
    benefit_var_pct = scales::percent(benefit_var_pct, accuracy = 0.1),
    benefit_es_pct  = scales::percent(benefit_es_pct, accuracy = 0.1)
  ) |>
  dplyr::select(family, aic, diversified_var, benefit_var_pct, diversified_es, benefit_es_pct) |>
  kable(
    format    = "html",
    digits    = 3,
    col.names = c("Family", "AIC", "Diversified VaR", "VaR Benefit", "Diversified ES", "ES Benefit")
  ) |>
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width        = TRUE,
    position          = "left",
    font_size         = 13
  )
Table 4: Diversification Benefit Across Candidate Copula Families
Family AIC Diversified VaR VaR Benefit Diversified ES ES Benefit
t (df=2) 0.365 €17,534,295 29.5% €20,139,572 33.8%
Gumbel 1.309 €17,244,428 30.7% €20,094,864 33.9%
Clayton 1.715 €17,395,004 30.1% €20,047,820 34.1%
Frank 1.721 €17,493,030 29.7% €20,152,361 33.7%
Gaussian 1.904 €17,481,605 29.7% €20,093,596 33.9%

VaR’s diversification benefit ranges from 29.5% under the Student-t copula to 30.7% under Clayton, a spread of just over one percentage point. Expected Shortfall’s benefit ranges from 33.7% to 34.1%, tighter still.

Display code
sensitivity_plot_df <- var_comparison |>
  dplyr::arrange(aic) |>
  dplyr::mutate(family = factor(family, levels = family))

additive_var_val <- sensitivity_plot_df$additive_var[1]

p_sensitivity <- sensitivity_plot_df |>
  ggplot(aes(x = family, y = diversified_var)) +
  geom_hline(yintercept = additive_var_val, color = brand_neutral, linetype = "dashed", linewidth = 0.6) +
  annotate("text", x = -Inf, y = additive_var_val,
           label = paste("Additive benchmark:", eur(additive_var_val)),
           hjust = -0.05, vjust = -0.6, size = 3.3, family = "Roboto", color = brand_neutral) +
  geom_point(size = 4, color = brand_highlight) +
  geom_text(aes(label = eur(diversified_var)), vjust = -1.4, size = 3.2, family = "Roboto", color = brand_text) +
  scale_y_continuous(labels = eur, limits = c(0, additive_var_val * 1.1)) +
  labs(x = NULL, y = "Diversified VaR (99.9%)") +
  theme_brand()

p_sensitivity
Figure 4: Diversified VaR Across Copula Families, Relative to the Additive Benchmark

Figure 4 shows why visually: all five diversified VaR estimates cluster within roughly €290,000 of each other, a small fraction of the more than €7.3 million gap separating any of them from the additive benchmark.

The explanation is structural, not statistical. Only one pair of the five categories, ICT & Business Disruption and Execution/Process, carries any modeled dependence at all. The other three, including Clients & Business Practices and Internal Fraud, which together account for 73.3% of the additive VaR total, are simulated as fully independent. Most of the diversification benefit in this analysis comes from the ordinary fact that independent risks rarely all materialize at their worst simultaneously, an effect present regardless of which copula governs the one dependent pair. The copula choice only has room to matter for the minority of the loss base it actually touches.

This has a practical implication worth stating directly. A risk team building a model like this one should spend comparatively little time agonizing over which copula family fits best once the AIC differences are this close, and comparatively more time confirming which category pairs genuinely carry dependence in the first place. Getting the dependence map right matters more than getting any single family’s parameter exactly right.

Insights and Conclusion

The capital estimate’s insensitivity to copula choice is the more useful finding here than the size of the diversification benefit itself. The project set out to test how much a 99.9% VaR estimate would move across five candidate dependence structures; the answer turned out to be barely at all, a one-percentage-point spread on VaR and less on Expected Shortfall. A capital figure that swings with an untestable modeling assumption is fragile in a way that should worry a board. A figure that holds steady across five materially different assumptions is making a more defensible claim than the AIC ranking alone would suggest, precisely because so little of it depends on which family won that ranking.

That stability traces to where the dependence actually lives, not to anything special about the five copula families tested. Only one pair among five categories carries any modeled relationship at all, and that pair accounts for a minority of the portfolio’s total risk. Clients & Business Practices and Internal Fraud, both independent by construction, together drive nearly three-quarters of the additive capital figure. The practical consequence is a reallocation of analytical effort: confirming which category pairs genuinely move together is more consequential than fitting any one pair’s copula precisely, and a risk team with limited modeling time should spend it accordingly.

The model risk findings along the way are worth keeping rather than smoothing over. Clayton converged to a parameter with the wrong sign for this data, a reminder that a fitted model can return an answer without that answer meaning anything. A broader automated search outside the five tested families found a better-fitting extreme-value copula, a reminder that any fixed candidate set is a choice with consequences, documented here rather than hidden. Neither finding changes the headline numbers, but both are the kind of detail that separates a model a risk committee can trust from one that simply produced a number.

This was built as an internal economic capital exercise, not a regulatory filing, and the conclusions should be read that way. The Standardised Measurement Approach governs NexaCore’s actual regulatory capital and has no dependence-modeling component for this analysis to inform. What this exercise offers instead is a defensible answer to a question regulation does not ask: how much capital relief is reasonable to claim from diversification, and how confident that claim should be. At ten years of annual data, the honest answer is that the relief is real, roughly 30%, and far steadier across modeling choices than the small sample size might lead anyone to expect.

Session Information

#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.5.2 (2025-10-31)
#>  os       macOS Tahoe 26.5.1
#>  system   aarch64, darwin20
#>  ui       X11
#>  language (EN)
#>  collate  en_US.UTF-8
#>  ctype    en_US.UTF-8
#>  tz       America/New_York
#>  date     2026-06-25
#>  pandoc   3.8.3 @ /Applications/RStudio.app/Contents/Resources/app/quarto/bin/tools/aarch64/ (via rmarkdown)
#>  quarto   1.8.26 @ /usr/local/bin/quarto
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package      * version    date (UTC) lib source
#>  ADGofTest      0.3        2011-12-28 [1] CRAN (R 4.5.0)
#>  archive        1.1.12     2025-03-20 [1] CRAN (R 4.5.0)
#>  bit            4.6.0      2025-03-06 [1] CRAN (R 4.5.0)
#>  bit64          4.6.0-1    2025-01-16 [1] CRAN (R 4.5.0)
#>  cli            3.6.5      2025-04-23 [1] CRAN (R 4.5.0)
#>  cluster        2.1.8.1    2025-03-12 [1] CRAN (R 4.5.2)
#>  copula       * 1.1-7      2026-02-20 [1] CRAN (R 4.5.2)
#>  crayon         1.5.3      2024-06-20 [1] CRAN (R 4.5.0)
#>  curl           7.0.0      2025-08-19 [1] CRAN (R 4.5.0)
#>  data.table     1.17.8     2025-07-10 [1] CRAN (R 4.5.0)
#>  digest         0.6.39     2025-11-19 [1] CRAN (R 4.5.2)
#>  dplyr        * 1.1.4      2023-11-17 [1] CRAN (R 4.5.0)
#>  evaluate       1.0.5      2025-08-27 [1] CRAN (R 4.5.0)
#>  farver         2.1.2      2024-05-13 [1] CRAN (R 4.5.0)
#>  fastmap        1.2.0      2024-05-15 [1] CRAN (R 4.5.0)
#>  fitdistrplus * 1.2-6      2026-01-24 [1] CRAN (R 4.5.2)
#>  forcats      * 1.0.1      2025-09-25 [1] CRAN (R 4.5.0)
#>  generics       0.1.4      2025-05-09 [1] CRAN (R 4.5.0)
#>  ggplot2      * 4.0.2      2026-02-03 [1] CRAN (R 4.5.2)
#>  glue           1.8.0      2024-09-30 [1] CRAN (R 4.5.0)
#>  gsl            2.1-9      2025-11-10 [1] CRAN (R 4.5.0)
#>  gtable         0.3.6      2024-10-25 [1] CRAN (R 4.5.0)
#>  hms            1.1.4      2025-10-17 [1] CRAN (R 4.5.0)
#>  htmltools      0.5.8.1    2024-04-04 [1] CRAN (R 4.5.0)
#>  htmlwidgets    1.6.4      2023-12-06 [1] CRAN (R 4.5.0)
#>  httr           1.4.7      2023-08-15 [1] CRAN (R 4.5.0)
#>  jsonlite       2.0.0      2025-03-27 [1] CRAN (R 4.5.0)
#>  kableExtra   * 1.4.0      2024-01-24 [1] CRAN (R 4.5.0)
#>  knitr        * 1.50       2025-03-16 [1] CRAN (R 4.5.0)
#>  labeling       0.4.3      2023-08-29 [1] CRAN (R 4.5.0)
#>  lattice        0.22-7     2025-04-02 [1] CRAN (R 4.5.2)
#>  lazyeval       0.2.2      2019-03-15 [1] CRAN (R 4.5.0)
#>  lifecycle      1.0.5      2026-01-08 [1] CRAN (R 4.5.2)
#>  lubridate    * 1.9.4      2024-12-08 [1] CRAN (R 4.5.0)
#>  magrittr       2.0.4      2025-09-12 [1] CRAN (R 4.5.0)
#>  MASS         * 7.3-65     2025-02-28 [1] CRAN (R 4.5.2)
#>  Matrix         1.7-4      2025-08-28 [1] CRAN (R 4.5.2)
#>  mvtnorm        1.3-3      2025-01-10 [1] CRAN (R 4.5.0)
#>  numDeriv       2016.8-1.1 2019-06-06 [1] CRAN (R 4.5.0)
#>  pcaPP          2.0-5      2024-08-19 [1] CRAN (R 4.5.0)
#>  pillar         1.11.1     2025-09-17 [1] CRAN (R 4.5.0)
#>  pkgconfig      2.0.3      2019-09-22 [1] CRAN (R 4.5.0)
#>  plotly       * 4.11.0     2025-06-19 [1] CRAN (R 4.5.0)
#>  pspline        1.0-21     2024-12-11 [1] CRAN (R 4.5.0)
#>  purrr        * 1.2.0      2025-11-04 [1] CRAN (R 4.5.0)
#>  R6             2.6.1      2025-02-15 [1] CRAN (R 4.5.0)
#>  RColorBrewer   1.1-3      2022-04-03 [1] CRAN (R 4.5.0)
#>  readr        * 2.1.5      2024-01-10 [1] CRAN (R 4.5.0)
#>  rlang          1.1.7      2026-01-09 [1] CRAN (R 4.5.2)
#>  rmarkdown      2.30       2025-09-28 [1] CRAN (R 4.5.0)
#>  rstudioapi     0.17.1     2024-10-22 [1] CRAN (R 4.5.0)
#>  S7             0.2.1      2025-11-14 [1] CRAN (R 4.5.2)
#>  scales       * 1.4.0      2025-04-24 [1] CRAN (R 4.5.0)
#>  sessioninfo  * 1.2.3      2025-02-05 [1] CRAN (R 4.5.0)
#>  showtext     * 0.9-7      2024-03-02 [1] CRAN (R 4.5.0)
#>  showtextdb   * 3.0        2020-06-04 [1] CRAN (R 4.5.0)
#>  stabledist     0.7-2      2024-08-17 [1] CRAN (R 4.5.0)
#>  stringi        1.8.7      2025-03-27 [1] CRAN (R 4.5.0)
#>  stringr      * 1.6.0      2025-11-04 [1] CRAN (R 4.5.0)
#>  survival     * 3.8-6      2026-01-16 [1] CRAN (R 4.5.2)
#>  svglite        2.2.2      2025-10-21 [1] CRAN (R 4.5.0)
#>  sysfonts     * 0.8.9      2024-03-02 [1] CRAN (R 4.5.0)
#>  systemfonts    1.3.1      2025-10-01 [1] CRAN (R 4.5.0)
#>  textshaping    1.0.4      2025-10-10 [1] CRAN (R 4.5.0)
#>  tibble       * 3.3.0      2025-06-08 [1] CRAN (R 4.5.0)
#>  tidyr        * 1.3.1      2024-01-24 [1] CRAN (R 4.5.0)
#>  tidyselect     1.2.1      2024-03-11 [1] CRAN (R 4.5.0)
#>  tidyverse    * 2.0.0      2023-02-22 [1] CRAN (R 4.5.0)
#>  timechange     0.3.0      2024-01-18 [1] CRAN (R 4.5.0)
#>  tzdb           0.5.0      2025-03-15 [1] CRAN (R 4.5.0)
#>  vctrs          0.7.1      2026-01-23 [1] CRAN (R 4.5.2)
#>  VineCopula   * 2.6.1      2025-03-24 [1] CRAN (R 4.5.0)
#>  viridisLite    0.4.3      2026-02-04 [1] CRAN (R 4.5.2)
#>  vroom          1.6.6      2025-09-19 [1] CRAN (R 4.5.0)
#>  withr          3.0.2      2024-10-28 [1] CRAN (R 4.5.0)
#>  xfun           0.54       2025-10-30 [1] CRAN (R 4.5.0)
#>  xml2           1.4.1      2025-10-27 [1] CRAN (R 4.5.0)
#>  yaml           2.3.10     2024-07-26 [1] CRAN (R 4.5.0)
#> 
#>  [1] /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/library
#>  * ── Packages attached to the search path.
#> 
#> ──────────────────────────────────────────────────────────────────────────────

Rendered with Quarto and R. Core packages: tidyverse, copula, fitdistrplus, VineCopula, kableExtra, scales, showtext, sessioninfo