Skip to content

Mortality Rate Completion

Mortality rates observed at old ages are affected by random fluctuations and hence, unreliable. To accommodate for this, different completion methods have been proposed to 'extrapolate' more accurate mortality rates at older ages, and are implemented in this module.


Wrapper Function

The different completion methods can be incorporated into a wrapper function which implements the chosen completion method.

complete_old_age(rates, ages, old_ages, method = "kannisto", type = 'prob', closure_age = 130, years = NULL, ...)

   Parameters:

     rates : matrix/array

       mortality rates with age rows, calendar year columns, (simulation number 3rd dimension)

     ages : vector

       vector of ages for rates

     old_ages : vector

       vector of old ages to be completed for

     method : character

       the completion method to be used. 'CK' for Coale-Kisker, 'DG' for Denuit and Goderniaux

       'Kannisto' for Kannisto

     type : character

       input and output type of mortality rates: 'central' for central death rates,

       'prob' for 1 year death probabilities, 'force' for force of mortality

     closure_age : numeric

       maximum age

     years : vector

       optional numeric vector of years for rates

     ...

       additional arguments required for the chosen completion method

   Returns:

     matrix/array of completed mortality rates with age rows, year columns

     (and simulation number 3rd dimension)

   Usage:

# consider the male mortality rates from the data file 'mortality_AUS_data'

AUS_male_rates <- mortality_AUS_data$rate$male
ages <- mortality_AUS_data$age # 0:110
old_ages <- 91:130

# first convert mortality rates to death probabilities
AUS_male_qx <- rate2rate(AUS_male_rates, from = "central", to = "prob")

# completing mortality rates for old ages
DG_q <- complete_old_age(AUS_male_qx, ages, old_ages, method = "DG",
                         type = "prob")
CK_q <- complete_old_age(AUS_male_qx, ages, old_ages, method = "CK",
                         type = "prob")
kannisto_q <- complete_old_age(AUS_male_qx, ages, old_ages, method = "kannisto",
                               type = "prob", fitted_ages = 80:90)

Coale and Kisker Method

The model proposed by Coale and Kisker (1990) is one of techniques used to complete mortality rates for old ages. The implementation follows Pitacco et al. (2009) and is based on the exponential age-specific rate of change of central death rates $$ k_{x, y}^{(i)} = \log \left( \frac{m_{x, y}^{(i)}}{m_{x - 1, y}^{(i)}} \right) . $$

The model assumes that \(k_{x, y}^{(i)}\) is linear over some age \(x = \beta\), so $$ k_{x, y}^{(i)} = k_{\beta, y}^{(i)} - (x - \beta) s_y^{(i)} $$ where \(s_y^{(i)}\) can be calculated assuming that \(k_{\beta, y}^{(i)}\) is calculated from empirical data. The central death rate can then be calculated for ages over \(\beta\) by using $$ m_{x, y}^{(i)} = m_{\beta, y}^{(i)} \exp \left( \sum^x_{l = \beta + 1} k_{l, y}^{(i)} \right). $$ In the implementation, \(\beta + 1\) is taken to be the smallest value in old_ages.

coale_kisker(rates, ages, old_ages, type = 'central', closure_age = 130, m_end = 1, years = NULL)

   Parameters:

     rates : matrix/array

       mortality rates with age rows, calendar year columns, (simulation number 3rd dimension)

     ages : vector

       vector of ages for rates

     old_ages : vector

       vector of old ages to be completed for. Must connect with ages, see details

     type : character

       input and output type of mortality rates: 'central' for central death rates,

       'prob' for 1 year death probabilities, 'force' for force of mortality

     closure_age : numeric

       maximum age

     m_end : numeric/vector

       central death rate at maximum age

     years : vector

       optional numeric vector of years for rates

   Details:

     0:110 and 91:130 connect, 0:110 and 111:130 connect, 0:110 and 120:130 do not connect

     closure_age must be equal to the last age in old_ages

   Returns:

     matrix/array of completed mortality rates with age rows, year columns

     (and simulation number 3rd dimension)

   Usage:

# consider the male mortality rates from the data file 'mortality_AUS_data'
AUS_male_rates <- mortality_AUS_data$rate$male
ages <- mortality_AUS_data$age # 0:110
old_ages <- 91:130

completed_rates <- coale_kisker(AUS_male_rates, ages, old_ages, type = "central")

References:

Coale, Ansley J. and Kisker, Ellen E. 1990 'Defects in data on old-age mortality in the United States: New procedures for calculating schedules and life tables at the higher ages,' Asian and Pacific Population Forum, 4: 1-31

Pitacco, Ermanno & Denuit, Michel & Haberman, Steven & Olivieri, Annamaria. (2009). Modelling Longevity Dynamics for Pensions and Annuity Business.


Denuit & Goderniaux Method

The Denuit and Goderniaux method (Denuit & Goderniaux, 2005) is a life table closing procedure based on a constrained log-quadratic regression of the form $$ \log(q_{x, y}^{(i)}) = a_y^{(i)} + b_y^{(i)} x + c_y^{(i)} x^2 + \epsilon_{x,y}^{(i)} $$ where \(\epsilon_{x,y}^{(i)}\) i.i.d \(N(0, \sigma^2)\). This is fitted on ages start_fit_age and over for each year. A closure constraint (max age), generally set at 130 is imposed as well as an inflexion constraint that makes the rate of mortality increase at older ages slow down.

Smoothing can also be applied to the results using a simple geometric average on the estimates.

denuit_goderniaux(rates, ages, old_ages, type = 'prob', closure_age = 130, start_fit_age = 75, smoothing = FALSE, years = NULL)

   Parameters:

     rates : matrix/array

       mortality rates with age rows, calendar year columns, (simulation number 3rd dimension)

     ages : vector

       vector of ages for rates

     old_ages : vector

       vector of old ages to be completed for. Must connect with ages, see details

     type : character

       input and output type of mortality rates: 'central' for central death rates,

       'prob' for 1 year death probabilities, 'force' for force of mortality

     closure_age : numeric

       maximum age

     start_fit_age : numeric

       model is fitted to ages starting from this age

     smoothing : logical

       set TRUE to apply smoothing to the completed rates

     years : vector

       optional numeric vector of years for rates

   Details:

     0:110 and 91:130 connect, 0:110 and 111:130 connect, 0:110 and 120:130 do not connect

     closure_age must be equal to the last age in old_ages

   Returns:

     matrix/array of completed mortality rates with age rows, year columns

     (and simulation number 3rd dimension)

   Usage:

# consider the male mortality rates from the data file 'mortality_AUS_data'
AUS_male_rates <- mortality_AUS_data$rate$male
ages <- mortality_AUS_data$age # 0:110
old_ages <- 91:130

# first convert mortality rates to death probabilties
AUS_male_qx <- rate2rate(AUS_male_rates, from = "central", to = "prob")

completed_qx <- denuit_goderniaux(AUS_male_qx, ages, old_ages, type = "prob")

# fit on ages 80:110 instead
completed_qx_from_80 <- denuit_goderniaux(AUS_male_qx, ages, old_ages, type = "prob", start_fit_age = 80)

References:

Denuit, M. and Goderniaux A., 2005 'Closing and Projecting lifetables using log-linear models', Bulletin of the Swiss Association of Actuaries p. 29-49


Kannisto Method

The Kannisto model proposed by Kannisto (1994) is based on the logistic model to close mortality rates for old ages. A model of the form $$ \text{logit}(\mu_{x, y}^{(i)}) = \log(a_{y}^{(i)}) + b_{y}^{(i)} x $$

is fitted on a set of fitted ages to obtain \(a_{y}^{(i)}\) and \(b_{y}^{(i)}\). The force of mortality for older ages can then be extrapolated via $$ \mu_{x, y}^{(i)} = \frac{a_{y}^{(i)} \exp \left({b_{y}^{(i)}} \right)} {1 + a_{y}^{(i)} \exp \left({b_{y}^{(i)}} \right)} $$

The set of fitted ages tends to be near the tail end of ages where the mortality rates are more accurate.

kannisto(rates, ages, old_ages, fitted_ages, type = 'force', closure_age = 130, years = NULL)

   Parameters:

     rates : matrix/array

       mortality rates with age rows, calendar year columns, (simulation number 3rd dimension)

     ages : vector

       vector of ages for rates

     old_ages : vector

       vector of old ages to be completed for. Must connect with ages, see details.

     fitted_ages : vector

       vector of ages to fit initial model. Must connect with old_ages, see details.

     type : character

       input and output type of mortality rates: 'central' for central death rates,

       'prob' for 1 year death probabilities, 'force' for force of mortality

     closure_age : numeric

       maximum age

     years : vector

       optional numeric vector of years for rates

   Details:

     0:110 and 91:130 connect, 0:110 and 111:130 connect, 0:110 and 120:130 do not connect

     closure_age must be equal to the last age in old_ages

   Returns:

     matrix/array of completed mortality rates with age rows, year columns

     (and simulation number 3rd dimension)

   Usage:

# consider the male mortality rates from the data file 'mortality_AUS_data'
AUS_male_rates <- mortality_AUS_data$rate$male
ages <- mortality_AUS_data$age # 0:110
old_ages <- 91:130

# fit model on tail end of ages where mortality is still accurate 
fitted_ages <- 76:90

completed_rates <- kannisto(AUS_male_rates, ages, old_ages,
                            fitted_ages, type = "central")

References:

Kannisto, V. (1994). Development of oldest-old mortality, 1950-1990: Evidence from 28 devel- oped countries. Odense University Press.

Antonio, Katrien, et al. The IA|BE 2020 Mortality Projection for the Belgian Population. 2020.