Skip to contents

The lifetime view of reserve risk under Mack's model, bootstrapped as England, Verrall and Wuthrich (2019, Appendix 1) describe: the scaled bias-adjusted residuals of the link ratios sqrt(n_k / (n_k - 1)) C^(alpha / 2) (F - f_k) / sigma_k are resampled into pseudo link ratios and re-averaged into pseudo factors (parameter error), and every future cumulative value is drawn from the one before, the observed latest value for the first, with mean f*_k C and Mack's variance sigma_k^2 |C|^(2 - alpha) (process error), to the triangle's last age. An origin's reserve is its last drawn value less its latest. Mack's model has no tail here, so development past the oldest age is not simulated.

Usage

mack_bootstrap_fit(ptr)

mack_bootstrap(
  triangle,
  column = NULL,
  n_sims = 10000,
  seed = 0,
  process = c("gamma", "lognormal", "residuals", "normal", "none"),
  average = "volume",
  sigma_interpolation = "log-linear",
  centre_residuals = TRUE
)

Arguments

ptr

A MackBootstrapFit pointer; used internally.

triangle

A cumulative triangle, with any number of segments and any development grain, every origin observed from the first age up to its latest, with no negative value.

column

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

n_sims

Number of simulations; positive.

seed

Seed of the simulation streams, a non-negative whole number.

process

Process error on each next cumulative value: "gamma" or "lognormal" (negated for a negative mean) or "normal", with Mack's mean and variance; "residuals" (the mean plus a resampled residual times the standard deviation); or "none" for parameter error only.

average, sigma_interpolation

How Mack's model averages the link ratios and fills in a sigma behind a single link ratio, as in mack().

centre_residuals

Subtract the residuals' mean before resampling them, so that the pseudo factors are unbiased and the mean reserve is the chain ladder's; FALSE resamples them uncentred, as England, Verrall and Wuthrich's Appendix 1 is written.

Value

A mack_bootstrap_fit object.

Details

The standard deviation of the reserves approximates Mack's analytic standard error (mack()), and the mean is the chain ladder's reserve: the pooled residuals do not have a zero mean, so by default (centre_residuals = TRUE) they are centred before resampling. Resampled as they are (centre_residuals = FALSE, EVW's Appendix 1 as written) they bias every pseudo factor, and the mean reserve with them (about 17% above the chain ladder's on RAA, 0.7% on GenIns, 0.8% below on ABC); EVW's Table 4 expected reserves agree with the centred bootstrap.

Every segment is bootstrapped on its own, with its own Mack model and residuals, into one joint distribution of the reserves. Simulation i uses random stream i of seed for every segment in turn.

Properties of the fit: chain_ladder (the chain_ladder_fit of Mack's averaging), mack (the mack_fit on the observed triangle, with the analytic standard errors), origins, development, residuals (an origin x development matrix, [o, k] the residual of the link from age k to k + 1, NA where there is none; never centred; single segment only) and reserves, a predictive_distribution of the reserve with the triangle's keys and origin as dimensions.

This is Python's MackBootstrap(...).fit(), which returns a MackBootstrapFit.

See also

mack() for the analytic standard errors, mack_one_year() for the one-year view on the same bootstrap, odp_bootstrap().

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))
boot <- mack_bootstrap(triangle(long, "year", "age", "paid"), n_sims = 2000, seed = 42)
boot@reserves@keys
#>   origin
#> 1   2018
#> 2   2019
#> 3   2020
#> 4   2021
c(mean = mean(boot@reserves), chain_ladder = boot@chain_ladder@total_reserve)
#>         mean chain_ladder 
#>     111.8672     111.4489 
c(sd = sqrt(variance(boot@reserves)), mack = boot@mack@total_standard_error)
#>       sd     mack 
#> 19.20362 19.54168 
as.data.frame(boot)
#>   origin latest ultimate   reserve      mean   std_dev
#> 1   2018    170 170.0000  0.000000  0.000000  0.000000
#> 2   2019    180 185.4545  5.454545  5.520966  5.632281
#> 3   2020    175 194.3892 19.389205 19.642917  8.515991
#> 4   2021    130 216.6051 86.605114 86.703367 11.401785