## Warning: Paket 'knitr' wurde unter R Version 4.2.3 erstellt
## Warning: Paket 'kableExtra' wurde unter R Version 4.2.3 erstellt
## Warning: Paket 'dplyr' wurde unter R Version 4.2.3 erstellt
## Warning: Paket 'tibble' wurde unter R Version 4.2.3 erstellt
## Warning: Paket 'lubridate' wurde unter R Version 4.2.3 erstellt
## Warning: Paket 'pander' wurde unter R Version 4.2.3 erstellt
The LifeInsureR package provides a full-featured framework to model classical life insurance contracts (non-unit linked). This is typically sufficient to implement simple example calculations or validate a single contract or tariff by a single individual.
However, when working for a company (either from inside the company or as an external consultant), one typically wants the implementation to be nicely structured, easily available for the whole team and still have the chance to improve the implementation. This can be achieved by encapsulating the company-specific tariff implementations in an R package that provides and exports the individual products of the company.
The LifeInsureR package even provides an RStudio project template to create a new skeleton of a company-specific implementation to use as the foundation of such an implementation.
LifeInsureR package provides an RStudio project
template that sets up a package for a company-specific tariff
implementation. After installing the package, simply create a new
RStudio project from the template:
The resulting RStudio project will have the following file structure:
DESCRIPTION file provides the package name and its
settings (author, explanation, dependencies, etc.). This is typically
the first file to update.
NAMESPACE file will be automatically handled by
R/ subdirectory contain the tariff /
product definitions, i.e. they implement the
LifeInsuranceTarif objects for each product. The
*_General.R file contains general definitions, like
mortality tables, parameter / cost sets, surrender penalty functions,
etc. and is typically sourced from each tariff’s implementation
tests/testthat/ directory are unit
tests for the testthat package. Typically, you will use the example
prescribed (by the regulator) in the official tariff definitions as test
cases, so that the implementation will always correspond to the official
Once the individual products are implemented in the R/ directory, one typical application is to use them for batch-testing the contract administration or financial statement system.
To automate this, the template
[MyCompany]RechnungGesamtbestand.R is provided in the
project’s top-level directory. It’s purpose is to read in a set of
contract data and calculate the corresponding reserves (e.g. to validate
the official numbers in the financial statements).
R/ subdirectory. Use the (LifeInsureR
documentation)<using-the-lifeinsurer-package.html> for further
details and guidance.
VTmodify.* functions correspondingly.
readXXXCOMPANYXXXBestand(..) function. This helps
preventing errors, as these columns are always cast to the required
calculate_contract(..) function might need to some
adjustments / modifications, in particular when modified contracts,
premiums waivers, additional tariffs / single-payment add-ons etc. are
calculate_portfolio(…) function might need to be
outfile variables to
point to the input files (“Bestandsdaten”) and the output file name
calculate_portfolio function on the contract
data set (potentially filtered to some subsets to prevent performance
Typically, a call to calculate a portfolio and store the results in a dedicated (Excel) output file is:
results = calculate_portfolio(bestandinfos.all,
results tarif = c("ProdName1", "ProdName2"), GV = c("123"), debug =TRUE)
openxlsxasTable = TRUE, overwrite = TRUE, sheetName = "Vergleichsrechnung")
The contract data are read in from the filenames provided in the
files list and stored in the data.frame called
readXXXCOMPANYXXXBestand function uses read_excel
to read in the raw data, then ensures the defined columns have the
proper data type.
readXXXCOMPANYXXXBestand or in
All contracts are calculated by a call to
calculate_portfolio. The arguments
GV can be used to restrict the calculation only to certain
products and/or profit classes. Additionally,
n_max can be
used to calculate only the first
n_max contracts. The
calculate_portfolio function does its work with the
SliceID. This allows
multiple portfolio data rows to be combined to one contract with several
slices / sum increases, which are calculated as one contract (see
section “10.3 Dynamic Increases” of the LifeInsureR vignette). If each
slice / dynamic increase is supposed to be calculated individually and
independent from the main contract / other increases, then the column
mapped to the
SliceID column needs to have a different
value for each portfolio data row. If
SliceID uses contract
numbers, all dynamics, etc. belonging to the same contract number will
be combined and calculated using
SliceID value) is
calculated in a loop using the
by_slice function, which
calculate_contract function for each
calculate_contract function calculates one
individual contract, with the individual columns of the portfolio data
passed as named parameters to the function.
LifeInsuranceContract (with the given tariff / product) is
created and all values of the contract are automatically calculated by
the package by default.
SliceID are added using the
method of the
LifeInsuranceContract class. The slice start
date and duration are adjusted correspondingly.
data.frame z. If
debug=TRUE, a column is added
to the resulting data.frame containing the R code to reproduce with full
calculate_portfolio combines the
data.frames returned for each contract’s
calculate_contract call into one large data frame, adds
some derived columns and returns the data frame as result of the
The following columns / named parameters are typically used by a
LifeInsuranceTariff implementation or the concrete contract
LifeInsuranceContract object. Most parameters are not
mandatory. Additional arguments / columns are possible and will be
preserved, even if they are not used by the contract.
Columns used for comparison with the calculated values: