3.6 Ajuste de distribuciones a datos históricos de pérdidas

Cuando ajustamos una distribución a un conjunto de datos, es importante evaluar qué tan bien se ajusta el modelo. Los paquetes como fitdistrplus en R permiten realizar esta tarea y proporcionan estadísticos de bondad de ajuste, entre los más comunes:

  • Kolmogorov-Smirnov (KS)
  • Cramér-von Mises (CvM)
  • Anderson-Darling (AD)

Estas pruebas comparan la distribución empírica (la que proviene de los datos) con la distribución teórica (la que ajustamos), pero cada una tiene distintos enfoques.

3.6.1 Kolmogorov-Smirnov (KS)

El estadístico KS se define como:

\[ D_n = \sup_x | F_n(x) - F(x) | \]

Donde:

  • \(F_n(x)\) es la función de distribución empírica (EDF)
  • \(F(x)\) es la función de distribución acumulada teórica (CDF)
  • \(\sup\) indica el máximo absoluto en todo el dominio de los datos

Es decir, mide la máxima diferencia entre las curvas de distribución empírica y teórica.

## Cargar librerías
library(fitdistrplus)

# Simular datos y ajustar una normal
set.seed(123)
# x <- rweibull(100, shape = 2, scale = 1)
# x <- rnorm(100)
x <- stats::rexp(500,rate = 1/3)
ajuste <- fitdist(x, "norm")

# Funciones útiles
Fn <- ecdf(x)
F_theo <- function(t) pnorm(t, mean = ajuste$estimate["mean"], sd = ajuste$estimate["sd"])
x_vals <- sort(x)
n <- length(x_vals)

## Kolmogorov-Smirnov
ks_stat <- max(abs(Fn(x_vals) - F_theo(x_vals)))

## Mostrar valores
cat("Estadísticos calculados:\n")
## Estadísticos calculados:
cat(sprintf("Kolmogorov-Smirnov (KS):     %.5f\n", ks_stat))
## Kolmogorov-Smirnov (KS):     0.14131
## Gráfica de Kolmogorov-Smirnov
plot(Fn, verticals = TRUE, col = "blue", main = "Kolmogorov-Smirnov: Máxima diferencia", xlab = "x", ylab = "Distribución acumulada")
lines(x_vals, F_theo(x_vals), col = "red", lwd = 2)
x_max <- x_vals[which.max(abs(Fn(x_vals) - F_theo(x_vals)))]
segments(x_max, Fn(x_max), x_max, F_theo(x_max), col = "darkgreen", lwd = 2, lty = 2)

3.6.2 Cramér-von Mises (CvM)

El estadístico CvM es una medida integrada (área) de discrepancia entre las dos distribuciones:

\[ W^2 = n \int_{-\infty}^{\infty} \left[F_n(x) - F(x)\right]^2 dF(x) \]

Una versión computacional, usando los valores ordenados \(x_{(i)}\), es:

\[ W^2 = \frac{1}{12n} + \sum_{i=1}^{n} \left( F(x_{(i)}) - \frac{2i - 1}{2n} \right)^2 \]

A diferencia del KS, considera toda la curva, no solo el punto de mayor discrepancia.

## Cramér-von Mises
u_i <- (2 * (1:n) - 1) / (2 * n)
F_vals <- F_theo(x_vals)
cvm_stat <- (1 / (12 * n)) + sum((F_vals - u_i)^2)


## Mostrar valores
cat("Estadísticos calculados:\n")
## Estadísticos calculados:
cat(sprintf("Cramér-von Mises (CvM):      %.5f\n", cvm_stat))
## Cramér-von Mises (CvM):      3.00253
## Gráfica de Cramér-von Mises (área entre curvas)
plot(Fn, verticals = TRUE, col = "blue", main = "Cramér-von Mises: Área entre ECDF y CDF", xlab = "x", ylab = "Distribución acumulada")
lines(x_vals, F_theo(x_vals), col = "red", lwd = 2)
for (i in seq_along(x_vals[-1])) {
  x0 <- x_vals[i]
  x1 <- x_vals[i + 1]
  polygon(c(x0, x0, x1, x1), c(Fn(x0), F_theo(x0), F_theo(x1), Fn(x1)),
          col = rgb(0.5, 0, 0.5, alpha = 0.2), border = NA)
}

3.6.3 Anderson-Darling (AD)

El estadístico AD también mide la diferencia global, pero da mayor peso a los extremos (colas):

\[ A^2 = -n - \frac{1}{n} \sum_{i=1}^{n} \left[ (2i - 1) \left( \log F(x_{(i)}) + \log(1 - F(x_{(n+1-i)})) \right) \right] \]

Esto es útil cuando queremos detectar desviaciones en las colas (muy altas o muy bajas).

## Anderson-Darling
log_terms <- log(F_vals) + log(1 - rev(F_vals))
ad_stat <- -n - (1/n) * sum((2 * (1:n) - 1) * log_terms)

## Mostrar valores
cat("Estadísticos calculados:\n")
## Estadísticos calculados:
cat(sprintf("Anderson-Darling (AD):       %.5f\n", ad_stat))
## Anderson-Darling (AD):       18.73001
## Gráfica de pesos en AD
# Recalcular para seguridad
F_vals <- F_theo(x_vals)
weights_ad <- 1 / (F_vals * (1 - F_vals))
diffs_ad <- abs(F_vals - Fn(x_vals))

# Normalizar pesos a [0, 1] para visualización
scaled_weights <- (weights_ad - min(weights_ad)) / (max(weights_ad) - min(weights_ad))

# Gráfico base
plot(Fn, verticals = TRUE, col = "blue", pch = 19, cex = 0.5,
     main = "Anderson-Darling: Diferencias ponderadas por peso",
     xlab = "x", ylab = "Distribución acumulada", xlim = range(x_vals))
lines(x_vals, F_vals, col = "red", lwd = 2)

# Dibujar líneas verticales con grosor y color según el peso
for (i in seq_along(x_vals)) {
  x0 <- x_vals[i]
  y_emp <- Fn(x0)
  y_teo <- F_vals[i]
  w <- scaled_weights[i]
  col_opacity <- rgb(0.5, 0, 0.5, alpha = 0.3 + 0.7*w)  # más opaco si mayor peso
  segments(x0, y_emp, x0, y_teo, col = col_opacity, lwd = 2 + 10*w)
}

# Añadir puntos para marcar ECDF y CDF
# points(x_vals, Fn(x_vals), pch = 1, col = "blue", cex = 0.6)
# points(x_vals, F_vals, pch = 3, col = "red", cex = 0.6)

legend("bottomright",
       legend = c("ECDF", "CDF Teórica", "Diferencias ponderadas"),
       col = c("blue", "red", rgb(0.5, 0, 0.5)), 
       lty = c(NA, NA, 1), pch = c(1, 3, NA), lwd = c(NA, NA, 3),
       pt.cex = c(0.8, 0.8, NA))

3.6.4 Estimación de parámetros y bondad de ajuste

fit_ln <- fitdist(losses, "lnorm")
fit_exp <- fitdist(losses, "exp")
fit_burr <- fitdist(losses, "burr")

3.6.5 Comparación visual

denscomp(list(fit_ln, fit_exp, fit_burr), legendtext = c("Lognormal", "Exponencial", "Burr"))

3.6.6 Bondad de ajuste

gofstat(list(fit_ln, fit_exp, fit_burr))
## Goodness-of-fit statistics
##                              1-mle-lnorm  2-mle-exp 3-mle-burr
## Kolmogorov-Smirnov statistic  0.03546962  0.0734378 0.01511828
## Cramer-von Mises statistic    0.36876808  2.0731848 0.03504477
## Anderson-Darling statistic    2.50198990 11.3420563 0.22644142
## 
## Goodness-of-fit criteria
##                                1-mle-lnorm 2-mle-exp 3-mle-burr
## Akaike's Information Criterion    15545.53  15640.53   15490.52
## Bayesian Information Criterion    15555.57  15645.55   15505.57

Interpretación

  • La lognormal capta adecuadamente la masa central de los datos
  • La exponencial subestima eventos extremos
  • La Burr puede sobreajustar colas si hay pocos extremos

Conclusiones

  • Modelar adecuadamente la severidad permite estimar correctamente medidas como Expected Loss o Value-at-Risk
  • Las distribuciones deben seleccionarse con base en evidencia empírica y criterios de validación (AIC, gráficos, ajuste visual)
  • El uso de distribuciones con colas pesadas es esencial en entornos con posibles eventos extremos

Referencias

  • Basel Committee on Banking Supervision (2006). International Convergence of Capital Measurement and Capital Standards – A Revised Framework (Comprehensive Version). BCBS 128.
  • Klugman, S. A., Panjer, H. H., & Willmot, G. E. (2012). Loss Models: From Data to Decisions. Wiley.
  • McNeil, A. J., Frey, R., & Embrechts, P. (2015). Quantitative Risk Management. Princeton University Press.
  • Embrechts, P., Klüppelberg, C., & Mikosch, T. (1997). Modelling Extremal Events for Insurance and Finance. Springer.