Skip to contents

Over-dispersed Poisson bootstrap of the chain ladder (England and Verrall 2002), as R ChainLadder's BootChainLadder(): adjusted Pearson residuals of the volume-weighted chain ladder are resampled into pseudo triangles, each is re-projected, and process error is added to every future incremental value. The scale and residuals match BootChainLadder() exactly, and the reserve distribution within Monte Carlo error (validation/reference/reserving_bootstrap_r.csv).

Usage

odp_bootstrap_fit(ptr)

odp_bootstrap(
  triangle,
  column = NULL,
  n_sims = 10000,
  seed = 0,
  process = c("gamma", "none")
)

Arguments

ptr

An OdpBootstrapFit pointer; used internally.

triangle

A cumulative triangle, with any number of segments, every origin observed from the first age up to its latest.

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 simulated future incremental value: "gamma" (mean the expected value, variance scale * |mean|, R's process.distr = "gamma") or "none" for parameter error only.

Value

An odp_bootstrap_fit object.

Details

Every segment of the triangle is bootstrapped on its own, with its own residuals and scale, into one joint distribution of the reserves. Simulation i uses random stream i of seed for every segment in turn, so results do not depend on the number of threads.

Properties of the fit: chain_ladder (the chain_ladder_fit the bootstrap is centred on), origins, development, fitted (fitted incremental values) and residuals (adjusted Pearson residuals (x - m) / sqrt(|m|) * sqrt(n / (n - p))), both origin x development matrices with NA where not observed, scale (the dispersion phi) and reserves, a predictive_distribution of the reserve with the triangle's keys and origin as dimensions and one component per segment and origin, so aggregate(boot@reserves, keep = "lob") keeps the dependence between segments. mean(), quantile(), VaR() and TVaR() of reserves describe the total reserve. Columns of draw_matrix() follow origins. fitted, residuals and scale need a single-segment fit: with several segments use segment(), or totals_frame() for the scales.

See also

chain_ladder(), mack(); odp_one_year() for the one-year view on the same 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 <- odp_bootstrap(triangle(long, "year", "age", "paid"), n_sims = 2000, seed = 42)
boot@scale
#> [1] 0.7286819
boot@reserves@keys
#>   origin
#> 1   2018
#> 2   2019
#> 3   2020
#> 4   2021
mean(boot@reserves)
#> [1] 111.7906
quantile(boot@reserves, 0.995)
#> [1] 155.9527