Mack chain ladder
mack_fit.RdMack'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
ChainLadderFitpointer; 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"(regresslog(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()ortail_log_linear().- tail_sigma
The tail's sigma (R's
tail.sigma), orNULLto extrapolate it. Unused when the tail factor is 1.- tail_std_err
The tail factor's standard error (R's
tail.se), orNULLto extrapolate it. Unused when the tail factor is 1.
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