Simulate Claims

Brian A. Fannin

2017-06-05

Individual claim simulation fits into two basic categories: 1) wait-time and 2) link ratio. An example of the first may be found in Stanard and an example of the second may be found in Guszcza.

Wait-time modelling

Claim simulation occurs once we have a data frame of policies. For each row in this data frame, we will simulate zero or more claims and zero or more claim transactions.

library(imaginator)
set.seed(12345)
dfPolicy <- SimulatePolicies(2, 2001:2005)

dfPolicy %>% 
  head(5) %>% 
  kable()
PolicyEffectiveDate PolicyExpirationDate Exposure PolicyholderID
1 2001-09-21 2002-09-20 1 1
2 2001-11-16 2002-11-15 1 2
21 2002-11-16 2003-11-15 1 2
11 2002-09-21 2003-09-20 1 1
22 2003-11-16 2004-11-15 1 2

We’ll begin with non-stochastic wait times and claim frequencies.

dfClaimTransactions <- ClaimsByWaitTime(
    dfPolicy
  , ClaimFrequency = FixedHelper(2)
  , PaymentFrequency = FixedHelper(3)
  , OccurrenceWait = FixedHelper(10)
  , ReportWait = FixedHelper(5)
  , PayWait = FixedHelper(5)
  , PaySeverity = FixedHelper(50))

Here we have assumed that each policy will generate 2 claims and each claim will produce 3 payment. Because we have 10 policies, this means we have 60 claim payments. Here they are for the first policy:

dfClaimTransactions %>% 
  filter(PolicyholderID == 1, lubridate::year(PolicyEffectiveDate) == 2001) %>% 
  select(ClaimID, OccurrenceDate, ReportDate, PaymentDate, PaymentAmount) %>% 
  kable()
ClaimID OccurrenceDate ReportDate PaymentDate PaymentAmount
1 2001-10-01 2001-10-06 2001-10-11 50
1 2001-10-01 2001-10-06 2001-10-16 50
1 2001-10-01 2001-10-06 2001-10-21 50
2 2001-10-01 2001-10-06 2001-10-11 50
2 2001-10-01 2001-10-06 2001-10-16 50
2 2001-10-01 2001-10-06 2001-10-21 50

Let’s do that again with some random amounts. We’ll keep the claim frequency fixed so that we can compare to the output above.

dfClaimTransactions <- ClaimsByWaitTime(
    dfPolicy
  , ClaimFrequency = FixedHelper(2)
  , PaymentFrequency = PoissonHelper(2)
  , OccurrenceWait = PoissonHelper(10)
  , ReportWait = PoissonHelper(5)
  , PayWait = PoissonHelper(5)
  , PaySeverity = LognormalHelper(log(50), 0.5*log(50)))
ClaimID OccurrenceDate ReportDate PaymentDate PaymentAmount
1 2001-09-25 2001-10-02 2001-10-06 8.660829
1 2001-09-25 2001-10-02 2001-10-12 273.995097
1 2001-09-25 2001-10-02 2001-10-22 134.503747
1 2001-09-25 2001-10-02 2001-10-28 95.663423
2 2001-10-02 2001-10-05 2001-10-10 1503.396967
2 2001-10-02 2001-10-05 2001-10-18 49.134663

Note that the transaction data is denormalized. The policy and claim information fields are repeated.