Skip to contents

Mack's distribution-free chain ladder (Mack 1993, 1999): the chain-ladder projection plus the process and parameter standard errors of each origin's reserve and of the total, as R ChainLadder's MackChainLadder(). Needs at least three development ages, and every sigma estimable or fillable by sigma_interpolation. Every segment of the triangle is fitted on its own.

Usage

mack_fit(ptr)

mack(
  triangle,
  column = NULL,
  average = "volume",
  sigma_interpolation = "log-linear",
  tail = 1,
  tail_sigma = NULL,
  tail_std_err = NULL
)

Arguments

ptr

A ChainLadderFit pointer; used internally.

triangle

A triangle, with any number of segments.

column

Name of the column to fit; by default the only one.

average

"volume", "simple" or "regression".

sigma_interpolation

How a variance parameter that cannot be estimated (an age with a single link ratio) is filled in: "log-linear" (regress log(sigma) on age and extrapolate, the default of R ChainLadder) or "mack" (Mack 1993).

tail

Development past the oldest age: a number, the factor from the oldest age to ultimate (1 means no tail), or a tail_constant(), tail_curve(), tail_bondy() or tail_log_linear().

tail_sigma

The tail's sigma (R's tail.sigma), or NULL to extrapolate it. Unused when the tail factor is 1.

tail_std_err

The tail factor's standard error (R's tail.se), or NULL to extrapolate it. Unused when the tail factor is 1.

Value

A mack_fit object.

Details

A tail other than 1 is one more development step, from the oldest age to ultimate, with its own sigma and standard error, as MackChainLadder(tail = ..., tail.sigma = ..., tail.se = ...); unless given, both are extrapolated log-linearly (R's tail_SE). Every origin, the oldest included, then carries the tail's risk. Without a tail (the default) the fit is R's MackChainLadder(tail = FALSE). A tail below 1 follows chainladder-python: it scales the ultimates and carries the risk read where a tail of 1.001 would be. R's MackChainLadder() ignores a tail below 1 altogether.

The fit has the properties of a chain_ladder_fit (and the fit itself as m@chain_ladder), plus per origin process_risk, parameter_risk and standard_error, and total_process_risk, total_parameter_risk, total_standard_error and total_cv (the total standard error over the total reserve). Risks are standard errors, not variances. Its tail_sigma and tail_std_err are the values used, given or extrapolated. The totals' risks need a single-segment fit: with several segments use totals_frame(), which has them per segment, or segment(). claims_development_result() gives Merz and Wuthrich's one-year view of a single-segment fit without a tail.

Examples

long <- data.frame(year = rep(2018:2021, 4:1),
                   age = c(12, 24, 36, 48, 12, 24, 36, 12, 24, 12),
                   paid = c(100, 150, 165, 170, 110, 170, 180, 120, 175, 130))
m <- mack(triangle(long, "year", "age", "paid"))
m@standard_error
#>      2018      2019      2020      2021 
#>  0.000000  5.616429  8.527608 11.566353 
m@total_cv
#> [1] 0.1753421
as.data.frame(m)
#>   origin latest ultimate   reserve process_risk parameter_risk standard_error
#> 1   2018    170 170.0000  0.000000     0.000000       0.000000       0.000000
#> 2   2019    180 185.4545  5.454545     3.884121       4.056832       5.616429
#> 3   2020    175 194.3892 19.389205     6.396266       5.639848       8.527608
#> 4   2021    130 216.6051 86.605114     8.973521       7.297702      11.566353

# With R ChainLadder's tail = TRUE rule.
mack(triangle(long, "year", "age", "paid"), tail = tail_log_linear())@total_standard_error
#> [1] 25.96684