Aug 28, 2013

IBNR with the Bornhuetter-Ferguson Method using the R ChainLadder package

This is the third of a trilogy of posts demonstrating how to implement three basic deterministic Property&Casualty/General/Non-Life insurance actuarial techniques using the ChainLadder package in R.

In simplest form, the Bornhuetter-Ferguson ("BF") Method estimates IBNR for an accident/policy/underwriting/origin year (tranch of exposure) as the product of an a-priori estimate of ultimate loss for that exposure and an estimate of the percent of that ultimate loss unknown/unreported/undeveloped at the time:


IBNR = a-prioriEstimatedUltimateLoss * PercentUnreported

Then a BF estimate of ultimate loss is the sum of reported loss known at the time plus IBNR:

EstimatedUltimateLoss = ReportedLoss + IBNR

A-priori estimates of ultimate loss may originate from widespread sources. We will demonstrate with the Loss Ratio Method (see previous post). Estimates of unreported percents are commonly borne from a loss development analysis of a reported loss triangle (see previous post), demonstrated here.

For an example we will use data from the Institute and Faculty of Actuaries Claims Reserving Manual, Sections F & G (see previous posts at links above for online sources). The R statements below following the carat (">") may be copied and pasted into an R session.
  • First, a-priori EstimatedUltimateLoss
> Premium = c(4486, 5024, 5680, 6590, 7482, 8502)
> ELR = .83 
> aprioriEstimatedUltimateLoss = Premium * ELR
  • Next, PercentUnreported
    • The reported loss triangle
> ReportedLossTriangle = matrix(c(
   2777, 3264, 3452, 3594, 3719, 3717,
   3252, 3804, 3973, 4231, 4319,   NA,
   3725, 4404, 4779, 4946,   NA,   NA,
   4521, 5422, 5676,   NA,   NA,   NA,
   5369, 6142,   NA,   NA,   NA,   NA,
   5818,   NA,   NA,   NA,   NA,   NA), nrow = 6, byrow = TRUE)
    • Fire up ChainLadder. Select the volume weighted average age-to-age factors. Append a unity tail under the assumption that the first year is already at ultimate. Cumulate (multiplicatively) in appropriate order. Pause to inspect the cumulative development factors.
> library(ChainLadder)
> selected = attr(ata(ReportedLossTriangle), "vwtd")
> selected = c(selected, 1.000)
> CDF = cumprod(rev(selected))
> round(CDF, 3)
[1] 1.000 0.999 1.027 1.074 1.137 1.333
      • Notice how reversing the order of the age-to-age (ATA) factors before cumulating enables the tail factor to line up with the first, most mature year and the last factor to line up with the last, least mature year. Also, the last observed ATA is less than 1.000 -- as is the second CDF -- so we should expect to see (slightly) negative IBNR for the second-most-mature accident year.
      • Now calculate the unreported percents using the familiar formula
    > PercentUnreported = 1 - 1 / CDF
    • IBNR
    > IBNR = aprioriEstimatedUltimateLoss * PercentUnreported
    > round(IBNR)
    [1]    0   -2  122  379  749 1764
    • For the value of reported loss known at the time we can use ChainLadder's getLatestCumulative function
    > ReportedLoss = getLatestCumulative(ReportedLossTriangle)
    • Finally
    > EstimatedUltimateLoss = ReportedLoss + IBNR

    It is possible to program the steps above into an R function. Is there a ChainLadder volunteer? Contributors welcome! Contact Markus Gesmann or one of the other authors found here or under "Members" here.

    -dmm
    ------------------------------------------------
    ChainLadder, a package for the R statistical environment primarily targeted toward stochastic reserving actuaries, contains many helper functions to implement deterministic methods as well.

    1 comment: