Mortality Laws#
Another approach to defining a survival model is to fit a parametric function, which may have convenient properties that simplify computations. When using these special mortality laws for lifetime distribution, shortcut formulas may be available without the need for numerical integration.
Uniform distribution#
If deaths are uniformly distributed then insurance benefits are paid out in a level manner. A convenient property of a uniform distribution on \([0, \theta]\) is that it has a midrange mean and median of \(\theta/2\)
\(l_x \sim \omega - x\)
\(_tp_x = \dfrac{\omega - (x + t)}{\omega - x}\)
number of lives, and survival function, are linearly declining with age
\(\mu_{x+t} = f_x(t) = \dfrac{1}{\omega - x - t}\)
the force of mortality and lifetime density function are identical
\(\overset{\circ}{e}_{x} = \dfrac{\omega - x}{2}\)
expected future lifetime is the mean of a uniform distribution
\(\overset{\circ}{e}_{x:\overline{n|}} =\ _np_x\ n +\ _nq_x\ \dfrac{n}{2}\)
expected limited lifetime is the weighted sum of the mean lifetime of deaths (for those who died) and the limit \(n\) (for those who survived)
$Var(T_x) = \dfrac{(\omega - x)^2}{12}
variance of complete future lifetime is the variance of a uniform distribution
\(_nE_x = v^n \dfrac{\omega - (x+n)}{\omega - x}\)
pure endowment shortcut by substituting in formula for the survival function
\(\bar{A}_{x} = \dfrac{\bar{a}_{\overline{\omega - x|}}}{\omega - x}\)
it is not necessary to carry out integration since whole life insurance is equivalent to an annuity-certain that pays \(\dfrac{1}{\omega}\) per year. To calculate the second moment of insurance, simply double the force of interest in the annuity-certain in the shortcut formula.
\(\bar{A}^ {1}_{x:\overline{n|}} = \dfrac{\bar{a}_{\overline{n|}}}{\omega - x}\)
term insurance is an annuity-certain that pays \(\dfrac{1}{\omega}\) per year for the term of the insurance.
Beta distribution#
This is a generalized version of the uniform distribution with two parameters \(\alpha, \omega\). The uniform is a special case of the Beta distribution with \(\alpha = 1\). However, unlike the uniform, its density function is longer constant.
\(l_x \sim (\omega - x)^{\alpha}\)
\(f_x(t) = \dfrac{\alpha(\omega - x - t)^{\alpha-1}}{(\omega - x){\alpha}}\)
\(\mu_x = \dfrac{\alpha}{\omega - x}\)
\(_tp_x = (\dfrac{\omega - (x + t)}{\omega - x})^{\alpha}\)
\(\overset{\circ}{e}_{x} = \dfrac{\omega - x}{\alpha + 1}\)
\(Var(T_x) = \dfrac{\alpha(\omega - x)^2}{(1+\alpha)^2(2+\alpha)}\)
Gompertz’s Law#
Gompertz proposed this law based on observations that the logarithm of the force of mortality appeared to fit well to a straight line for ages above 20.
\(\mu_x = B c^x\)
\(_tp_x = e^{\frac{B c^x}{\ln c}(c^t - 1)}\)
the force of mortality is modeled by two parameters \(B\) and \(c > 1\)
Makeham’s Law#
Makeham improved Gompertz’s law by adding a third parameters \(A \ge -B\). This includes represents a constant element in the force of mortality that does not depend on age.
\(\mu_x = A + B c^x\)
\(_tp_x = e^{\frac{B c^x}{\ln c}(c^t - 1) - A t}\)
the force of mortality is modeled with three parameters \(c > 1,\ B > 0,\ A \ge -B\)
Methods#
The MortalityLaws class, and Beta, Uniform, Makeham and Gompertz subclasses, specify continuous functions for survival distributions. These classes inherit all the general methods for computing life contingency risks, and override those methods with shortcut formulas that may be available when assuming their respective mortality laws.
from actuarialmath import MortalityLaws, Uniform, Beta, Makeham, Gompertz
import describe
describe.methods(MortalityLaws)
describe.methods(Uniform)
describe.methods(Beta)
describe.methods(Gompertz)
describe.methods(Makeham)
class MortalityLaws - Apply shortcut formulas for special mortality laws
Methods:
--------
l_r(x, s, r):
Fractional lives given special mortality law: l_[x]+s+r
p_r(x, s, r, t):
Fractional age survival probability given special mortality law
q_r(x, s, r, t, u):
Fractional age deferred mortality given special mortality law
mu_r(x, s, r):
Fractional age force of mortality given special mortality law
f_r(x, s, r, t):
fractional age lifetime density given special mortality law
e_r(x, s, r, t):
Fractional age future lifetime given special mortality law
class Uniform - Shortcuts with uniform distribution of deaths aka DeMoivre's Law
Args:
omega : maximum age
Examples:
>>> print(Uniform(95).e_x(30, t=40, curtate=False)) # 27.692
class Beta - Shortcuts with beta distribution of deaths (is Uniform when alpha = 1)
Args:
omega : maximum age
alpha : alpha paramter of beta distribution
radix : assumed starting number of lives for survival function
Examples:
>>> print(Beta(omega=60, alpha=1/3).mu_x(35) * 1000)
class Gompertz - Is Makeham's Law with A = 0
Args:
B, c : parameters of Gompertz distribution
Examples:
>>> print(Gompertz(B=0.00027, c=1.1).f_x(50, t=10)) # 0.04839
class Makeham - Includes element in force of mortality that does not depend on age
Args:
A, B, c : parameters of Makeham distribution
Examples:
>>> print(Makeham(A=0.00022, B=2.7e-6, c=1.124).mu_x(60) * 0.9803) # 0.00316
Examples#
The Uniform class is initialized with the omega parameter to specify the range of the uniform distribution of deaths assumption. All the inherited general computation methods can be accessed; where shortcut formulas are available, then those specific methods are overriden.
print('Uniform')
uniform = Uniform(80).set_interest(delta=0.04)
print(uniform.whole_life_annuity(20)) # 15.53
print(uniform.temporary_annuity(20, t=5)) # 4.35
print(Uniform(161).p_x(70, t=1)) # 0.98901
print(Uniform(95).e_x(30, t=40, curtate=False)) # 27.692
print()
uniform = Uniform(omega=80).set_interest(delta=0.04)
print(uniform.E_x(20, t=5)) # .7505
print(uniform.whole_life_insurance(20, discrete=False)) # .3789
print(uniform.term_insurance(20, t=5, discrete=False)) # .0755
print(uniform.endowment_insurance(20, t=5, discrete=False)) # .8260
print(uniform.deferred_insurance(20, u=5, discrete=False)) # .3033
Uniform
16.03290804858584
4.47503070125663
0.989010989010989
32.30769230769231
0.7505031903214833
0.378867519462745
0.07552885288417432
0.8260320432056576
0.30333866657857067
The Beta class is initialized with omega and alpha parameters of the beta distribution of deaths assumption. All the inherited general computation methods can be accessed; where shortcut formulas are available, then those specific methods are overriden.
life = Beta(omega=100, alpha=0.5)
print(life.q_x(25, t=1, u=10)) # 0.0072
print(life.e_x(25)) # 50
print(Beta(omega=60, alpha=1/3).mu_x(35) * 1000) # 13.33
0.007188905547861446
50.0
13.333333333333332
The Gompertz or Makeham classes are initialized with the respective parameters of the Gompertz and Makeham Laws assumptions. All the inherited general computation methods can be accessed.
life = Gompertz(B=0.000005, c=1.10)
p = life.p_x(80, t=10) # 869.4
print(life.portfolio_percentile(N=1000, mean=p, variance=p*(1-p), prob=0.99))
print(Gompertz(B=0.00027, c=1.1).f_x(50, t=10)) # 0.04839
life = Makeham(A=0.00022, B=2.7e-6, c=1.124)
print(life.mu_x(60) * 0.9803) # 0.00316
869.3908338193208
0.048389180223511644
0.0031580641631654026
SOA Question 2.3:
You are given that mortality follows Gompertz Law with B = 0.00027 and c = 1.1. Calculate \(f_{50}(10)\).
print("SOA Question 2.3: (A) 0.0483")
print(Gompertz(B=0.00027, c=1.1).f_x(x=50, t=10))
SOA Question 2.3: (A) 0.0483
0.048389180223511644
SOA Question 2.6
You are given the survival function:
\(S_0(x) = \left( 1 − \frac{x}{60} \right)^{\frac{1}{3}}, \quad 0 \le x \le 60\)
Calculate \(1000 \mu_{35}\).
print("# SOA Question 2.6: (C) 13.3")
print(Beta(omega=60, alpha=1/3).mu_x(35) * 1000)
# SOA Question 2.6: (C) 13.3
13.333333333333332