| Title: | Financial and Actuarial Mathematics for Life Contingencies |
|---|---|
| Description: | Classes and methods that allow the user to manage life table, actuarial tables (also multiple decrements tables). Moreover, functions to easily perform demographic, financial and actuarial mathematics on life contingencies insurances calculations are contained therein. See Spedicato (2013) <doi:10.18637/jss.v055.i10>. |
| Authors: | Giorgio Alfredo Spedicato [aut, cre] (ORCID: <https://orcid.org/0000-0002-0315-8888>), Christophe Dutang [ctb] (ORCID: <https://orcid.org/0000-0001-6732-1501>), Reinhold Kainhofer [ctb] (ORCID: <https://orcid.org/0000-0002-7895-1311>), Kevin J Owens [ctb], Ernesto Schirmacher [ctb], Gian Paolo Clemente [ctb] (ORCID: <https://orcid.org/0000-0001-6795-4595>), Ivan Williams [ctb] |
| Maintainer: | Giorgio Alfredo Spedicato <[email protected]> |
| License: | MIT + file LICENSE |
| Version: | 1.6.3 |
| Built: | 2026-10-09 21:10:18 UTC |
| Source: | https://github.com/spedygiorgio/lifecontingencies |
The lifecontingencies package performs standard financial, demographic and actuarial mathematics calculation. The main purpose of the package is to provide a comprehensive set of tools to perform risk assessment of life contingent insurances.
Some functions have been powered by Rcpp code.
This package and functions herein are provided as is, without any guarantee regarding the accuracy of calculations. The author disclaims any liability arising by any losses due to direct or indirect use of this package.
Work in progress.
Giorgio Alfredo Spedicato with contributions from Reinhold Kainhofer and Kevin J. Owens Maintainer: <[email protected]>
The lifecontingencies Package: Performing Financial and Actuarial Mathematics Calculations in R, Giorgio Alfredo Spedicato, Journal of Statistical Software, 2013,55 , 10, 1-36
##financial mathematics example #calculates monthly installment of a loan of 100,000, #interest rate 0.05 i=0.05 monthlyInt=(1+i)^(1/12)-1 Capital=100000 #Montly installment R=1/12*Capital/annuity(i=i, n=10,k=12, type = "immediate") R balance=numeric(10*12+1) capitals=numeric(10*12+1) interests=numeric(10*12+1) balance[1]=Capital interests[1]=0 capitals[1]=0 for(i in (2:121)) { balance[i]=balance[i-1]*(1+monthlyInt)-R interests[i]=balance[i-1]*monthlyInt capitals[i]=R-interests[i] } loanSummary=data.frame(rate=c(0, rep(R,10*12)), balance, interests, capitals) head(loanSummary) tail(loanSummary) ##actuarial mathematics example #APV of an annuity data(soaLt) soa08Act=with(soaLt, new("actuarialtable",interest=0.06, x=x,lx=Ix,name="SOA2008")) #evaluate and life-long annuity for an aged 65 axn(soa08Act, x=65)##financial mathematics example #calculates monthly installment of a loan of 100,000, #interest rate 0.05 i=0.05 monthlyInt=(1+i)^(1/12)-1 Capital=100000 #Montly installment R=1/12*Capital/annuity(i=i, n=10,k=12, type = "immediate") R balance=numeric(10*12+1) capitals=numeric(10*12+1) interests=numeric(10*12+1) balance[1]=Capital interests[1]=0 capitals[1]=0 for(i in (2:121)) { balance[i]=balance[i-1]*(1+monthlyInt)-R interests[i]=balance[i-1]*monthlyInt capitals[i]=R-interests[i] } loanSummary=data.frame(rate=c(0, rep(R,10*12)), balance, interests, capitals) head(loanSummary) tail(loanSummary) ##actuarial mathematics example #APV of an annuity data(soaLt) soa08Act=with(soaLt, new("actuarialtable",interest=0.06, x=x,lx=Ix,name="SOA2008")) #evaluate and life-long annuity for an aged 65 axn(soa08Act, x=65)
This function returns the value at time n of a series of equally spaced payments of 1.
accumulatedValue(i, n, m = 0, k = 1, type = "immediate")accumulatedValue(i, n, m = 0, k = 1, type = "immediate")
i |
Effective interest rate expressed in decimal form. E.g. 0.03 means 3%. |
n |
Number of terms of payment. |
m |
Deferring period, whose default value is zero. |
k |
Frequency of payment. |
type |
The payment type. Use |
The accumulated value is the future value of the terms of an annuity. Its mathematical expression is .
The payment timing follows the type argument: an annuity-immediate has payments at the end of each period, while an annuity-due has payments at the beginning of each period.
A numeric value representing the calculated accumulated value.
The function is provided as is, without any guarantee regarding the accuracy of calculation. We disclaim any liability for eventual losses arising from direct or indirect use of this software.
Accumulated values are derived from annuities by the following basic equation .
Giorgio A. Spedicato
Broverman, S.A., Mathematics of Investment and Credit (Fourth Edition), 2008, ACTEX Publications.
"actuarialtable"
Objects of class "actuarialtable" inherit the structure of class "lifetable" adding just the slot for interest rate, interest.
Objects can be created by calls of the form new("actuarialtable", ...).
Creation is the same as lifetable objects creation, the slot for interest must be added too.
interest:Object of class "numeric" slot for interest rate, e.g. 0.03
x:Object of class "numeric" age slot
lx:Object of class "numeric" subjects at risk at age x
name:Object of class "character" name of the actuarial table
Class "lifetable", directly.
signature(from = "actuarialtable", to = "data.frame"): moves from actuarialtable to data.frame
signature(from = "actuarialtable", to = "numeric"): coerce from actuarialtable to a numeric
signature(object = "actuarialtable"): as for lifetable
signature(x = "actuarialtable"): tabulates the actuarial commutation functions
signature(object = "actuarialtable"): show method
signature(object = "actuarialtable"): prints brief summary
The function is provided as is, without any warranty regarding the accuracy of calculations. The author disclaims any liability for eventual losses arising from direct or indirect use of this software.
The interest slot will handle time-varying interest rates in the future.
Giorgio A. Spedicato
Actuarial Mathematics (Second Edition), 1997, by Bowers, N.L., Gerber, H.U., Hickman, J.C., Jones, D.A. and Nesbitt, C.J.
showClass("actuarialtable")showClass("actuarialtable")
This function calculates the present value of a stream of fixed payments separated by equal intervals of time.
annuity(i, n, m = 0, k = 1, type = "immediate")annuity(i, n, m = 0, k = 1, type = "immediate")
i |
Effective interest rate expressed in decimal form. E.g. 0.03 means 3%. It can be a vector of interest rates of the same length of periods. |
n |
Periods for payments. If n = |
m |
Deferring period, whose default value is zero. |
k |
Yearly payments frequency. A payment of |
type |
The payment type. Use |
For an annuity-immediate the first payment occurs at time ; for an annuity-due the first payment occurs at time . Thus, for annual payments, an annuity-immediate has payment times , whereas an annuity-due has payment times .
A numeric value representing the present value of the annuity.
The value returned by annuity function derives from direct calculation of the discounted cash flow and not from formulas, like . When m is greater than 1, the payment per period is assumed to be .
Giorgio A. Spedicato
Broverman, S.A., Mathematics of Investment and Credit (Fourth Edition), 2008, ACTEX Publications.
This help page groups two term life insurances with **arithmetic variation** of the benefit,
both with optional deferment m and k fractional claim times (claims at end of subperiods):
IAxn: increasing arithmetic term insurance (benefit grows linearly with time);
DAxn: decreasing arithmetic term insurance (benefit declines linearly with time).
IAxn( actuarialtable, x, n, i = actuarialtable@interest, m = 0, k = 1, type = "EV", power = 1 ) DAxn( actuarialtable, x, n, i = actuarialtable@interest, m = 0, k = 1, type = "EV", power = 1 )IAxn( actuarialtable, x, n, i = actuarialtable@interest, m = 0, k = 1, type = "EV", power = 1 ) DAxn( actuarialtable, x, n, i = actuarialtable@interest, m = 0, k = 1, type = "EV", power = 1 )
actuarialtable |
A |
x |
Attained age at inception. |
n |
Coverage length in years. If missing, it is set to |
i |
Annual effective interest rate. Defaults to |
m |
Deferment (years). Default 0. |
k |
Fractional periods per year ( |
type |
Output type: |
power |
Power applied to discounted cash flows before expectation (default 1). |
Let , . With **fractional claims at end of subperiods**,
the EV implementations follow the pattern already used in Axn:
IAxn (increasing):
where , computed via pxt(...) and qxt(..., t=1/k).
DAxn (decreasing) is analogous with benefit ; see its subsection below.
DAxn (decreasing):
See “Fractional timing conventions” above for claim timing assumptions.
A numeric value: the APV (or one simulated realization if type="ST").
IAxn — Increasing arithmetic termComputes the APV of an n-year **increasing** term insurance on a life aged x, with k fractional
claim times and optional deferment m. The benefit at the -th subperiod equals .
For **insurance** benefits in this package, fractional claims are assumed to occur at the
**end** of each subperiod (i.e., at ). This matches the implementation that
multiplies survival to and a fractional death probability over the next subperiod:
By contrast, **annuities** use a payment-timing flag ("immediate" vs "due") which
changes the evaluation times; insurance here has a fixed claim timing at end-subperiod.
DAxn — Decreasing arithmetic termComputes the APV of an n-year **decreasing** term insurance on a life aged x, with k fractional
claim times and optional deferment m. The benefit at the -th subperiod equals .
Bowers, N. L., Gerber, H. U., Hickman, J. C., Jones, D. A., Nesbitt, C. J. (1997). Actuarial Mathematics, 2nd ed., SOA.
Axn (level benefit), AExn, Exn, axn
Other life-contingency APVs:
endowment_trio
## Setup (legacy examples) data(soaLt) soa08Act <- with(soaLt, new("actuarialtable", interest=0.06, x=x, lx=Ix, name="SOA2008")) ## IAxn: increasing arithmetic term, 10 years, age 25 (legacy) IAxn(actuarialtable = soa08Act, x = 25, n = 10) ## More examples (k>1 and deferment) IAxn(actuarialtable = soa08Act, x = 40, n = 20, k = 12) # monthly claims IAxn(actuarialtable = soa08Act, x = 40, n = 15, m = 5, k = 4) # deferred 5y, quarterly ## DAxn: decreasing arithmetic term, 10 years, age 25 (legacy) DAxn(actuarialtable = soa08Act, x = 25, n = 10) ## More examples (k>1 and deferment) DAxn(actuarialtable = soa08Act, x = 45, n = 10, k = 2) # semiannual DAxn(actuarialtable = soa08Act, x = 45, n = 12, m = 3, k = 12) # deferred 3y, monthly## Setup (legacy examples) data(soaLt) soa08Act <- with(soaLt, new("actuarialtable", interest=0.06, x=x, lx=Ix, name="SOA2008")) ## IAxn: increasing arithmetic term, 10 years, age 25 (legacy) IAxn(actuarialtable = soa08Act, x = 25, n = 10) ## More examples (k>1 and deferment) IAxn(actuarialtable = soa08Act, x = 40, n = 20, k = 12) # monthly claims IAxn(actuarialtable = soa08Act, x = 40, n = 15, m = 5, k = 4) # deferred 5y, quarterly ## DAxn: decreasing arithmetic term, 10 years, age 25 (legacy) DAxn(actuarialtable = soa08Act, x = 25, n = 10) ## More examples (k>1 and deferment) DAxn(actuarialtable = soa08Act, x = 45, n = 10, k = 2) # semiannual DAxn(actuarialtable = soa08Act, x = 45, n = 12, m = 3, k = 12) # deferred 3y, monthly
Produces a ggplot2 representation of the number of survivors by age. The method is defined for 'lifetable'; S3 dispatch also makes it available for S4 subclasses such as 'actuarialtable'.
## S3 method for class 'lifetable' autoplot(object, ...)## S3 method for class 'lifetable' autoplot(object, ...)
object |
A 'lifetable' object, or an object inheriting from it. |
... |
Additional arguments passed to 'ggplot2::geom_line()'. |
A 'ggplot2' plot object.
lt <- new("lifetable", x = 0:3, lx = c(100, 90, 50, 10)) ggplot2::autoplot(lt)lt <- new("lifetable", x = 0:3, lx = c(100, 90, 50, 10)) ggplot2::autoplot(lt)
Axn.mdt gives the actuarial present value (APV) of a
term insurance on a multiple decrement table, paying at the end of the
year of decrement a benefit that may depend on the cause of decrement.
axn.mdt gives the APV of an annuity payable while the insured is
still in the active (no decrement yet) state.
Axn.mdt(object, x, n, i, decrement, benefits = 1, m = 0) axn.mdt(object, x, n, i, m = 0, k = 1, payment = "advance")Axn.mdt(object, x, n, i, decrement, benefits = 1, m = 0) axn.mdt(object, x, n, i, m = 0, k = 1, payment = "advance")
object |
an |
x |
policyholder's age (an integer age tabulated in |
n |
contract duration in years. If missing, the cover runs to the end
of the table, i.e. |
i |
interest rate |
decrement |
decrement(s) covered: one or more names (or column
indices) among |
benefits |
benefit amounts, one per element of |
m |
deferment period in years (default 0). |
k |
number of annuity payments per year (default 1). Survival
probabilities at fractional durations are interpolated linearly in
|
payment |
|
With the insurance APV is
which for a single cause reduces to the historical Axn.mdt. The
annuity APV is , with
payment times (in advance) or
(in arrears). Benefit premiums and reserves follow
from the equivalence principle as ratios/differences of the two.
A numeric vector of APVs (one per element of x).
Finan, M. B. (2014). A Reading of the Theory of Life Contingency Models: A Preparation for Exam MLC/3L, Sections 68-69.
# Finan (2014), Example 69.1: 3-year term on (16), i = 10% myTable <- data.frame(x = 16:18, lx = c(20000, 17600, 14520), da = c(1300, 1870, 2380), doc = c(1100, 1210, 1331)) myMdt <- new("mdt", table = myTable, name = "Finan 69.1") A <- Axn.mdt(myMdt, x = 16, n = 3, i = 0.10, decrement = "doc") a <- axn.mdt(myMdt, x = 16, n = 3, i = 0.10) 20000 * A / a # level annual premium: 1250 # Finan (2014), Example 68.1: benefit 1 for cause 1, 2 for cause 2 t681 <- data.frame(x = 50:51, lx = c(1200, 800), d1 = c(100, 200), d2 = c(300, 300)) m681 <- new("mdt", table = t681) Axn.mdt(m681, x = 50, n = 2, i = 0.5, decrement = c("d1", "d2"), benefits = c(1, 2)) # 0.6852# Finan (2014), Example 69.1: 3-year term on (16), i = 10% myTable <- data.frame(x = 16:18, lx = c(20000, 17600, 14520), da = c(1300, 1870, 2380), doc = c(1100, 1210, 1331)) myMdt <- new("mdt", table = myTable, name = "Finan 69.1") A <- Axn.mdt(myMdt, x = 16, n = 3, i = 0.10, decrement = "doc") a <- axn.mdt(myMdt, x = 16, n = 3, i = 0.10) 20000 * A / a # level annual premium: 1250 # Finan (2014), Example 68.1: benefit 1 for cause 1, 2 for cause 2 t681 <- data.frame(x = 50:51, lx = c(1200, 800), d1 = c(100, 200), d2 = c(300, 300)) m681 <- new("mdt", table = t681) Axn.mdt(m681, x = 50, n = 2, i = 0.5, decrement = c("d1", "d2"), benefits = c(1, 2)) # 0.6852
These functions evaluates life insurances and annuities on two heads.
axyn(tablex, tabley, x, y, n, i, m, k = 1, status = "joint", type = "EV", payment="advance") Axyn(tablex, x, tabley, y, n, i, m, k = 1, status = "joint", type = "EV")axyn(tablex, tabley, x, y, n, i, m, k = 1, status = "joint", type = "EV", payment="advance") Axyn(tablex, x, tabley, y, n, i, m, k = 1, status = "joint", type = "EV")
tablex |
Life X |
tabley |
Life Y |
x |
Age of life X. |
y |
Age of life Y. |
n |
Insured duration. Infinity if missing. |
i |
Interest rate. Default value is those implied in |
m |
Deferring period. Default value is zero. |
k |
Fractional payments or periods where insurance is payable. |
status |
Either |
type |
A string, either |
payment |
The Payment type, either |
Actuarial mathematics book formulas has been implemented.
A numeric value returning APV of chosen insurance form.
The function is provided as is, without any warranty regarding the accuracy of calculations. The author disclaims any liability for eventual losses arising from direct or indirect use of this software.
Deprecated functions. Use Axyzn and axyzn instead.
Giorgio A. Spedicato
Actuarial Mathematics (Second Edition), 1997, by Bowers, N.L., Gerber, H.U., Hickman, J.C., Jones, D.A. and Nesbitt, C.J.
## Not run: data(soa08Act) #last survival status annuity axyn(tablex=soa08Act, tabley=soa08Act, x=65, y=70, n=5, status = "last",type = "EV") #first survival status annuity Axyn(tablex=soa08Act, tabley=soa08Act, x=65, y=70, status = "last",type = "EV") ## End(Not run)## Not run: data(soa08Act) #last survival status annuity axyn(tablex=soa08Act, tabley=soa08Act, x=65, y=70, n=5, status = "last",type = "EV") #first survival status annuity Axyn(tablex=soa08Act, tabley=soa08Act, x=65, y=70, status = "last",type = "EV") ## End(Not run)
Function to evalate the multiple lives insurances and annuities
Axyzn(tablesList, x, n, i, m, k = 1, status = "joint", type = "EV", power=1) axyzn(tablesList, x, n, i, m, k = 1, status = "joint", type = "EV", power=1, payment="advance")Axyzn(tablesList, x, n, i, m, k = 1, status = "joint", type = "EV", power=1) axyzn(tablesList, x, n, i, m, k = 1, status = "joint", type = "EV", power=1, payment="advance")
tablesList |
A list whose elements are either lifetable or actuarialtable class objects. |
x |
A vector of the same size of tableList that contains the initial ages. |
n |
Lenght of the insurance. |
i |
Interest rate |
m |
Deferring period. |
k |
Fractional payment frequency. |
status |
Either |
type |
A string, either |
power |
The power of the APV. Default is 1 (mean). |
payment |
The Payment type, either |
In theory, these functions apply the same concept of life insurances on one head on multiple heads.
The insurance value is returned.
These functions are the more general version of axyn and
Axyn.
Giorgio Alfredo Spedicato, Kevin J. Owens.
Broverman, S.A., Mathematics of Investment and Credit (Fourth Edition), 2008, ACTEX Publications.
data(soaLt) soa08Act=with(soaLt, new("actuarialtable",interest=0.06, x=x,lx=Ix,name="SOA2008")) #evaluate and life-long annuity for an aged 65 listOfTables=list(soa08Act, soa08Act) #Check actuarial equality axyzn(listOfTables,x=c(60,70),status="last") axn(listOfTables[[1]],60)+axn(listOfTables[[2]],70)- axyzn(listOfTables,x=c(60,70),status="joint")data(soaLt) soa08Act=with(soaLt, new("actuarialtable",interest=0.06, x=x,lx=Ix,name="SOA2008")) #evaluate and life-long annuity for an aged 65 listOfTables=list(soa08Act, soa08Act) #Check actuarial equality axyzn(listOfTables,x=c(60,70),status="last") axn(listOfTables[[1]],60)+axn(listOfTables[[2]],70)- axyzn(listOfTables,x=c(60,70),status="joint")
buildMdtFromIndependentRates constructs a multiple-decrement table
(mdt) from a matrix of independent single-decrement rates
, the inverse of independentRatesFromMdt.
buildMdtFromIndependentRates( x, qx.primes, radix = 1e+05, name = "ASDT-built mdt" )buildMdtFromIndependentRates( x, qx.primes, radix = 1e+05, name = "ASDT-built mdt" )
x |
Integer vector of ages (must be consecutive and start at 0 after
internal completion by |
qx.primes |
Numeric matrix of independent rates. Rows correspond to
ages in |
radix |
Radix (initial cohort size). Default 100 000. |
name |
Character string for the table name. Default |
For each age the combined (absolute) rate of decrement is obtained by
the UDD-based integration formula
which is the same formula used by qxt.fromQxprime for a single
age. The resulting absolute rates are multiplied by to
obtain the decrement counts, and the survivorship column is computed
recursively from .
An mdt object.
independentRatesFromMdt for the reverse extraction,
qxt.fromQxprime for the single-age formula.
# Finan (2014) Example 67.4: # Three decrements (death, disability, retirement) at ages 60-61. qp <- matrix(c(0.010, 0.030, 0.100, 0.013, 0.050, 0.200), nrow = 2, byrow = TRUE, dimnames = list(NULL, c("death", "disability", "retirement"))) mdt674 <- buildMdtFromIndependentRates(x = 60:61, qx.primes = qp, radix = 1000, name = "Finan 67.4") print(mdt674)# Finan (2014) Example 67.4: # Three decrements (death, disability, retirement) at ages 60-61. qp <- matrix(c(0.010, 0.030, 0.100, 0.013, 0.050, 0.200), nrow = 2, byrow = TRUE, dimnames = list(NULL, c("death", "disability", "retirement"))) mdt674 <- buildMdtFromIndependentRates(x = 60:61, qx.primes = qp, radix = 1000, name = "Finan 67.4") print(mdt674)
A list of data.frames containing transition probabilities by age (row) and year of projections Transitions are split by males and females, and show probabilities of survival, death and transitions from Healty to Disabled
de_angelis_di_falcode_angelis_di_falco
a list containing elevent items (data.frames), and an mdt data object (HealthyMaleTable2013)
Paolo De Angelis, Luigi di Falco (a cura di). Assicurazioni sulla salute: caratteristiche, modelli attuariali e basi tecniche
This function returns present values for decreasing annuities-certain.
decreasingAnnuity(i, n, type = "immediate")decreasingAnnuity(i, n, type = "immediate")
i |
A numeric value representing the interest rate. |
n |
The number of periods. |
type |
The payment type. Use |
A decreasing annuity has the following flows of payments: n, n-1, n-2, ..., 1, 0. For an annuity-immediate these payments occur at times ; for an annuity-due they occur at times .
A numeric value reporting the present value of the decreasing cash flows.
The function is provided as is, without any guarantee regarding the accuracy of calculation. The author disclaims any liability for eventual losses arising from direct or indirect use of this software.
This function calls presentValue function internally.
Giorgio A. Spedicato
Broverman, S.A., Mathematics of Investment and Credit (Fourth Edition), 2008, ACTEX Publications.
annuity, increasingAnnuity, DAxn
# The present value of 10, 9, 8, ..., 0 payable at the end of the period for 10 years is decreasingAnnuity(i = 0.03, n = 10) # Assuming a 3% interest rate sum((10:1)/(1 + .03)^(1:10))# The present value of 10, 9, 8, ..., 0 payable at the end of the period for 10 years is decreasingAnnuity(i = 0.03, n = 10) # Assuming a 3% interest rate sum((10:1)/(1 + .03)^(1:10))
UP94 life tables underlying mortality rates
data(demoCanada)data(demoCanada)
A data frame with 120 observations on the following 7 variables.
xage
up94MUP 94, males
up94FUP 94, females
up942015MUP 94 projected to 2015, males
up942015fUP 94 projected to 2015, females
up942020MUP 94 projected to 2020, males
up942020FUP 94 projected to 2020, females
Mortality rates are provided.
Courtesy of Andrew Botros
Courtesy of Andrew Botros
data(demoCanada) head(demoCanada) #create the up94M life table up94MLt<-probs2lifetable(probs=demoCanada$up94M,radix=100000,"qx",name="UP94") #create the up94M actuarial table table up94MAct<-new("actuarialtable", lx=up94MLt@lx, x=up94MLt@x,interest=0.02)data(demoCanada) head(demoCanada) #create the up94M life table up94MLt<-probs2lifetable(probs=demoCanada$up94M,radix=100000,"qx",name="UP94") #create the up94M actuarial table table up94MAct<-new("actuarialtable", lx=up94MLt@lx, x=up94MLt@x,interest=0.02)
Seven yearly mortality rates for each age
data(demoChina)data(demoChina)
A data frame with 106 observations on the following 8 variables.
ageAttained age
CL1CL1 rates
CL2CL2 rates
CL3CL3 rates
CL4CL4 rates
CL5CL5 rates
CL6CL6 rates
CL90-93CL 90-93 rates
See the source link for details.
Society of Actuaries
data(demoChina) tableChinaCL1<-probs2lifetable(probs=demoChina$CL1,radix=1000,type="qx",name="CHINA CL1")data(demoChina) tableChinaCL1<-probs2lifetable(probs=demoChina$CL1,radix=1000,type="qx",name="CHINA CL1")
Illustrative life tables from French population.
data(demoFrance)data(demoFrance)
A data frame with 113 observations on the following 5 variables.
ageAttained age
TH00_02Male 2000 life table
TF00_02Female 2000 life table
TD88_901988 1990 life table
TV88_901988 1990 life table
These tables are real French population life tables. They regard 88 - 90 and 00 - 02 experience.
Actuaris - Winter Associes
data(demoFrance) head(demoFrance)data(demoFrance) head(demoFrance)
Dataset containing mortality rates for German population, male and females.
data(demoGermany)data(demoGermany)
A data frame with 113 observations on the following 5 variables.
xAttained age
qxMaleMale mortality rate
qxFemaleFemale mortality rate
Sterbetafel DAV 1994
Private communicatiom
data(demoGermany) head(demoGermany)data(demoGermany) head(demoGermany)
This dataset reports five pairs of Italian population life tables. These table can be used to create life table objects and actuarial tables object.
data(demoIta)data(demoIta)
A data frame with 121 observations on the following 9 variables.
Xa numeric vector, representing ages from 0 to .
SIM02a numeric vector, 2002 cross section general population males life table
SIF02a numeric vector, 2002 cross section general population females life table
SIM00a numeric vector, 2000 cross section general population males life table
SIF00a numeric vector, 2000 cross section general population females life table
SIM92a numeric vector, 1992 cross section general population males life table
SIF92a numeric vector, 1992 cross section general population females life table
SIM81a numeric vector, 1981 cross sectional general population males life table
SIF81a numeric vector, 1981 cross sectional general population females life table
SIM61a numeric vector, 1961 cross sectional general population males life table
SIF61a numeric vector, 1961 cross sectional general population females life table
RG48Ma numeric vector, RG48 projected males life table
RG48Fa numeric vector, RG48 projected females life table
IPS55Ma numeric vector, IPS55 projected males life table
IPS55Fa numeric vector, IPS55 projected females life table
SIM71a numeric vector, 1971 cross sectional general population males life table
SIM51a numeric vector, 1951 cross sectional general population males life table
SIM31a numeric vector, 1931 cross sectional general population males life table
These table contains the vectors of survival at the beginning of life years and are the building block of both
lifetable and actuarialtable classes.
These tables comes from Italian national statistical bureau (ISTAT) for SI series, government Ministry of Economics (Ragioneria Generale dello Stato) for RG48 or from Insurers' industrial association IPS55. RG48 represents the projected survival table for the 1948 born cohort, while IPS55 represents the projected survival table for the 1955 born cohort.
ISTAT, IVASS, Ordine Nazionale Attuari
#load and show data(demoIta) head(demoIta) #create sim92 life and actuarial table lxsim92<-demoIta$SIM92 lxsim92<-lxsim92[!is.na(lxsim92) & lxsim92!=0] xsim92<-seq(0,length(lxsim92)-1,1) #create the table sim92lt=new("lifetable",x=xsim92,lx=lxsim92,name="SIM92") plot(sim92lt)#load and show data(demoIta) head(demoIta) #create sim92 life and actuarial table lxsim92<-demoIta$SIM92 lxsim92<-lxsim92[!is.na(lxsim92) & lxsim92!=0] xsim92<-seq(0,length(lxsim92)-1,1) #create the table sim92lt=new("lifetable",x=xsim92,lx=lxsim92,name="SIM92") plot(sim92lt)
Two yearly mortality rates for each age
data(demoJapan)data(demoJapan)
A data frame with 110 observations on the following 3 variables.
JP8587MMale life table
JP8587FFemale life table
ageAttained age
Dowloaded in 2012 from Society of Actuaries (SOA) mortality table web site
SOA mortality web site
data(demoJapan) head(demoJapan)data(demoJapan) head(demoJapan)
AM and AF one year mortality rate. Series of 1992
data(demoUk)data(demoUk)
A data frame with 74 observations on the following 3 variables:
AgeAnnuitant age
AM92One year mortality rate (males)
AF92One year mortality rate (males)
This data set shows the one year survival rates for males and females of the 1992 series. It has been taken from the Institute of Actuaries. The series cannot be directly used to create a life table since neither rates are not provided for ages below 16 nor for ages over 90. Various approach can be used to complete the series.
Institute of Actuaries
data(demoUk) head(demoUk)data(demoUk) head(demoUk)
This data set contains period life tables for years 1990, 2000 and 2007. Both males and females life tables are reported.
demoUsademoUsa
A data.frame containing people surviving at the beginning of "age" at 2007, 2000, and 1990
split by gender
Reported age is truncated at the last age with lx>0.
See https://www.ssa.gov/oact/NOTES/as120/LifeTables_Body.html
data(demoUsa) head(demoUsa)data(demoUsa) head(demoUsa)
Compute the duration or the convexity of a series of CF
duration(cashFlows, timeIds, i, k = 1, macaulay = TRUE) convexity(cashFlows, timeIds, i, k = 1)duration(cashFlows, timeIds, i, k = 1, macaulay = TRUE) convexity(cashFlows, timeIds, i, k = 1)
cashFlows |
A vector representing the cash flows amounts. |
timeIds |
Cash flows times |
i |
APR interest, i.e. nominal interest rate compounded m-thly. |
k |
Compounding frequency for the nominal interest rate. |
macaulay |
Use the Macaulay formula |
The Macaulay duration is defined as
,
while
A numeric value representing either the duration or the convexity of the cash flow series
Broverman, S.A., Mathematics of Investment and Credit (Fourth Edition), 2008, ACTEX Publications.
#evaluate the duration/convexity of a coupon payment cf=c(10,10,10,10,10,110) t=c(1,2,3,4,5,6) duration(cf, t, i=0.03) convexity(cf, t, i=0.03)#evaluate the duration/convexity of a coupon payment cf=c(10,10,10,10,10,110) t=c(1,2,3,4,5,6) duration(cf, t, i=0.03) convexity(cf, t, i=0.03)
This help page groups four classical life-contingency present values:
Exn: pure endowment, pays 1 at time n if alive.
Axn: term/whole life insurance, pays 1 at death within n years
(or up to limiting age if n is missing), with fractional claim timing.
AExn: n-year endowment insurance, i.e. Axn + Exn.
axn: survival annuity (immediate/due), with deferment m and k payments per year.
Exn(actuarialtable, x, n, i = actuarialtable@interest, type = "EV", power = 1) axn( actuarialtable, x, n, i = actuarialtable@interest, m, k = 1, type = "EV", power = 1, payment = "advance", ... ) Axn( actuarialtable, x, n, i = actuarialtable@interest, m, k = 1, type = "EV", power = 1, ... ) AExn( actuarialtable, x, n, i = actuarialtable@interest, k = 1, type = "EV", power = 1 )Exn(actuarialtable, x, n, i = actuarialtable@interest, type = "EV", power = 1) axn( actuarialtable, x, n, i = actuarialtable@interest, m, k = 1, type = "EV", power = 1, payment = "advance", ... ) Axn( actuarialtable, x, n, i = actuarialtable@interest, m, k = 1, type = "EV", power = 1, ... ) AExn( actuarialtable, x, n, i = actuarialtable@interest, k = 1, type = "EV", power = 1 )
actuarialtable |
A |
x |
Attained age at inception. |
n |
Contract length in years. If missing, for |
i |
Annual effective interest rate. Defaults to |
type |
Output type: |
power |
Power of the discounted payoff before expectation (default 1). |
m |
Deferment (years). Default 0. Vector accepted. (Axn/axn) |
k |
Fractional periods per year ( |
payment |
Payment timing for annuities: |
... |
Extra args forwarded to mortality helpers ( |
Exn: with .
Axn: With fractional claims,
where , computed via pxt(...) and qxt(..., t=1/k).
AExn: returns Axn(...) + Exn(...) with aligned arguments.
Vectorization: Exn and AExn accept vectors for x, n and i;
the arguments are recycled to a common length and one value per element is returned.
axn: Survival annuity with payment timing "immediate" (arrears) or "due" (advance),
deferment m and k payments per year (see function-specific parameters).
axn — Survival annuity (immediate/due), with deferment m and k fractional payments.
For type="EV" the annuity is computed as
where are the payment times depending on payment and m.
Axn — Life insurance (term / whole life), fractional claim times.
Vectorized in x, n, m. k must be scalar.
AExn — n-year endowment insurance, computed as Axn + Exn.
A numeric value (or vector for vectorized inputs): the APV in expected value,
or one simulated realization when type="ST".
Exn — Pure endowmentComputes the actuarial present value (APV) of a pure endowment that pays 1 at
time n provided survival to x+n.
Bowers, N. L., Gerber, H. U., Hickman, J. C., Jones, D. A., Nesbitt, C. J. (1997). Actuarial Mathematics, 2nd ed., SOA.
Other life-contingency APVs:
arithmetic_variation_insurances
## Common setup used in legacy docs data(soaLt) soa08Act <- with(soaLt, new("actuarialtable", interest=0.06, x=x, lx=Ix, name="SOA2008")) ## Exn (pure endowment) Exn(soa08Act, x=30, n=35) ## Axn (term / whole life insurance) # 10-year term, semiannual claims: Axn(soa08Act, x=50, n=10, k=2) # Whole life (n inferred), monthly: Axn(soa08Act, x=30, k=12) # Several ages and terms at once: Exn(soa08Act, x=c(30,40,50), n=c(35,25,15)) ## AExn = Axn + Exn (legacy book-check) AExn(soa08Act, x=35, n=30, i=0.06) Exn(soa08Act, x=35, n=30, i=0.06) + Axn(soa08Act, x=35, n=30, i=0.06) AExn(soa08Act, x=c(35,45), n=c(30,20)) ## axn (survival annuity, legacy example) # Life-long annuity for age 65: axn(soa08Act, x=65) ## axn specific legacy examples # Immediate (arrears) vs due (advance), quarterly, 15-year term deferred 5 years: axn(soa08Act, x=60, n=15, m=5, k=4, payment="immediate") axn(soa08Act, x=60, n=15, m=5, k=4, payment="due") # Vectorization over x/n: axn(soa08Act, x=c(60,65), n=c(10,20), k=12, payment="due")## Common setup used in legacy docs data(soaLt) soa08Act <- with(soaLt, new("actuarialtable", interest=0.06, x=x, lx=Ix, name="SOA2008")) ## Exn (pure endowment) Exn(soa08Act, x=30, n=35) ## Axn (term / whole life insurance) # 10-year term, semiannual claims: Axn(soa08Act, x=50, n=10, k=2) # Whole life (n inferred), monthly: Axn(soa08Act, x=30, k=12) # Several ages and terms at once: Exn(soa08Act, x=c(30,40,50), n=c(35,25,15)) ## AExn = Axn + Exn (legacy book-check) AExn(soa08Act, x=35, n=30, i=0.06) Exn(soa08Act, x=35, n=30, i=0.06) + Axn(soa08Act, x=35, n=30, i=0.06) AExn(soa08Act, x=c(35,45), n=c(30,20)) ## axn (survival annuity, legacy example) # Life-long annuity for age 65: axn(soa08Act, x=65) ## axn specific legacy examples # Immediate (arrears) vs due (advance), quarterly, 15-year term deferred 5 years: axn(soa08Act, x=60, n=15, m=5, k=4, payment="immediate") axn(soa08Act, x=60, n=15, m=5, k=4, payment="due") # Vectorization over x/n: axn(soa08Act, x=c(60,65), n=c(10,20), k=12, payment="due")
Expected future lifetime of a life aged , either over the whole remaining
lifespan or over a temporary period of years.
exn(object, x, n, type = "curtate", fxt = 0.5, axOmega = 1 - fxt)exn(object, x, n, type = "curtate", fxt = 0.5, axOmega = 1 - fxt)
object |
A lifetable/actuarialtable object. |
x |
Attained age |
n |
Length (in years) of the period over which the expected lifetime is computed, i.e. a temporary expectation. Assumed omega - x + 1 (the whole remaining lifespan) whether missing. |
type |
Either |
fxt |
fraction of the year of age lived by those who die within the year, used by the
|
axOmega |
mean number of years lived in the last, open-ended age interval, used by the
|
For type = "curtate" the function returns the (temporary) curtate expectation of life
that is the expected number of complete future years lived by (x) within the next years.
With missing it is the curtate expectation of life .
For type = "complete" the function returns the (temporary) complete expectation of life
evaluated under the uniform distribution of deaths (UDD) assumption within each year, i.e.
(see Lxt). With missing it is
.
Under UDD the two quantities are related by
, which reduces to
when covers the whole remaining lifespan.
The last tabulated age is treated as a closed interval: those alive at
are assumed to die on average half a year later. Published tables that close the table with an open
interval (e.g. , as in the NCHS tables) can therefore
show a slightly larger complete life expectancy.
A numeric value representing the expected life span.
Giorgio Alfredo Spedicato
Actuarial Mathematics (Second Edition), 1997, by Bowers, N.L., Gerber, H.U., Hickman, J.C., Jones, D.A. and Nesbitt, C.J.
#loads and show data(soa08Act) #curtate expectation of life at birth exn(object=soa08Act, x=0) #complete expectation of life at birth (curtate + 0.5 under UDD) exn(object=soa08Act, x=0,type="complete") #temporary 20-year expectations at age 50 exn(object=soa08Act, x=50, n=20) exn(object=soa08Act, x=50, n=20, type="complete")#loads and show data(soa08Act) #curtate expectation of life at birth exn(object=soa08Act, x=0) #complete expectation of life at birth (curtate + 0.5 under UDD) exn(object=soa08Act, x=0,type="complete") #temporary 20-year expectations at age 50 exn(object=soa08Act, x=50, n=20) exn(object=soa08Act, x=50, n=20, type="complete")
This function list the character decrements of the mdf class
getDecrements(object)getDecrements(object)
object |
A |
A character vector is returned
A character vector listing the decrements defined in the class
To be updated
Giorgio Alfredo Spedicato
Marcel Finan A Reading of the Theory of Life Contingency Models: A Preparation for Exam MLC/3L
#create a new table tableDecr=data.frame(d1=c(150,160,160),d2=c(50,75,85)) newMdt<-new("mdt",name="testMDT",table=tableDecr) getDecrements(newMdt)#create a new table tableDecr=data.frame(d1=c(150,160,160),d2=c(50,75,85)) newMdt<-new("mdt",name="testMDT",table=tableDecr) getDecrements(newMdt)
It returns the present value of a life contingency, specified by its APV symbol, known the time to death ob the sibjects
getLifecontingencyPv(deathsTimeX, lifecontingency, object, x, t, i = object@interest, m = 0, k = 1, payment = "advance") getLifecontingencyPvXyz(deathsTimeXyz, lifecontingency, tablesList, x, t, i, m = 0, k = 1, status = "joint", payment = "advance")getLifecontingencyPv(deathsTimeX, lifecontingency, object, x, t, i = object@interest, m = 0, k = 1, payment = "advance") getLifecontingencyPvXyz(deathsTimeXyz, lifecontingency, tablesList, x, t, i, m = 0, k = 1, status = "joint", payment = "advance")
deathsTimeX |
Time to death |
lifecontingency |
lifecontingency symbol |
object |
life table(s) |
x |
age(s) of the policyholder(s) |
t |
term of the contract |
i |
interest rate |
m |
deferrement |
k |
fractional payments |
payment |
The Payment type, either |
deathsTimeXyz |
matrix of death times from birth |
tablesList |
list of table of the same size of num column of deathTimeXyz. |
status |
Either |
This function is a wrapper to the many internal functions that give the PV known the age of death.
A vector or matrix of size number of rows of deathTimeXyz / deathTimeXy
The function is provided as is, without any warranty regarding the accuracy of calculations. The author disclaims any liability for eventual losses arising from direct or indirect use of this software.
Multiple life function needs to be tested
Spedicato Giorgio
Actuarial Mathematics (Second Edition), 1997, by Bowers, N.L., Gerber, H.U., Hickman, J.C., Jones, D.A. and Nesbitt, C.J.
rLifeContingenciesXyz, rLifeContingencies
#simulate the PV values for some life contingencies given some death times data(soa08Act) testgetLifecontingencyPvXyzAxyz<-getLifecontingencyPvXyz(deathsTimeXyz= matrix(c(50,50,51,43,44,22,12,56,20,24,53,12), ncol=2), lifecontingency = "Axyz",tablesList = list(soa08Act, soa08Act), i = 0.03, t=30,x=c(40,50), m=0, k=1,status="last") testgetLifecontingencyPvAxn<-getLifecontingencyPv(deathsTimeX = seq(0, 110, by=1), lifecontingency = "Axn", object=soa08Act, x=40,t=20, m=0, k=1)#simulate the PV values for some life contingencies given some death times data(soa08Act) testgetLifecontingencyPvXyzAxyz<-getLifecontingencyPvXyz(deathsTimeXyz= matrix(c(50,50,51,43,44,22,12,56,20,24,53,12), ncol=2), lifecontingency = "Axyz",tablesList = list(soa08Act, soa08Act), i = 0.03, t=30,x=c(40,50), m=0, k=1,status="last") testgetLifecontingencyPvAxn<-getLifecontingencyPv(deathsTimeX = seq(0, 110, by=1), lifecontingency = "Axn", object=soa08Act, x=40,t=20, m=0, k=1)
This function returns the value of a life table object, that is,
the last attainable age within a life table.
getOmega(object)getOmega(object)
object |
A life table object. |
A numeric value representing the value of a life table object
The function is provided as is, without any guarantee regarding the accuracy of calculation. We disclaim any liability for eventual losses arising from direct or indirect use of this software.
Giorgio A. Spedicato
Actuarial Mathematics (Second Edition), 1997, by Bowers, N.L., Gerber, H.U., Hickman, J.C., Jones, D.A. and Nesbitt, C.J.
#assumes SOA example life table to be load data(soaLt) soa08=with(soaLt, new("lifetable", x=x,lx=Ix,name="SOA2008")) #the last attainable age under SOA life table is getOmega(soa08)#assumes SOA example life table to be load data(soaLt) soa08=with(soaLt, new("lifetable", x=x,lx=Ix,name="SOA2008")) #the last attainable age under SOA life table is getOmega(soa08)
This function evaluates increasing annuities
Iaxn(actuarialtable, x, n, i, m = 0, type = "EV", power=1)Iaxn(actuarialtable, x, n, i, m = 0, type = "EV", power=1)
actuarialtable |
An |
x |
The age of the insured head. |
n |
The duration of the insurance |
i |
The interest rate that overrides the one in the |
m |
The deferring period. |
type |
Yet only "EV" is implemented. |
power |
The power of the APV. Default is 1 (mean) |
This actuarial mathematics is generally exoteric. I have seen no valid example of it.
The APV of the insurance
The function is provided as is, without any guarantee regarding the accuracy of calculation. We disclaim any liability for eventual losses arising from direct or indirect use of this software.
The function is provided as is, without any guarantee regarding the accuracy of calculation. We disclaim any liability for eventual losses arising from direct or indirect use of this software.
Giorgio A. Spedicato
Actuarial Mathematics (Second Edition), 1997, by Bowers, N.L., Gerber, H.U., Hickman, J.C., Jones, D.A. and Nesbitt, C.J.
#using SOA illustrative life tables data(soaLt) soa08Act=with(soaLt, new("actuarialtable",interest=0.06, x=x,lx=Ix,name="SOA2008")) #evaluate the value of a lifetime increasing annuity for a subject aged 80 Iaxn(actuarialtable=soa08Act, x=80, n=10)#using SOA illustrative life tables data(soaLt) soa08Act=with(soaLt, new("actuarialtable",interest=0.06, x=x,lx=Ix,name="SOA2008")) #evaluate the value of a lifetime increasing annuity for a subject aged 80 Iaxn(actuarialtable=soa08Act, x=80, n=10)
This function evaluates non-stochastic increasing annuities.
increasingAnnuity(i, n, type = "immediate")increasingAnnuity(i, n, type = "immediate")
i |
A numeric value representing the interest rate. |
n |
The number of periods. |
type |
The payment type. Use |
An increasing annuity shows the following flow of payments: .
For an annuity-immediate these payments occur at times ;
for an annuity-due they occur at times .
The value of the annuity.
The function is provided as is, without any guarantee regarding the accuracy of calculation. We disclaim any liability for eventual losses arising from direct or indirect use of this software.
This function calls internally presentValue function.
Giorgio A. Spedicato
Broverman, S.A., Mathematics of Investment and Credit (Fourth Edition), 2008, ACTEX Publications.
# The present value of an increasing sequence of payments payable at the end # of each period for 10 periods is increasingAnnuity(i = 0.03, n = 10) # Assuming a 3% interest rate# The present value of an increasing sequence of payments payable at the end # of each period for 10 periods is increasingAnnuity(i = 0.03, n = 10) # Assuming a 3% interest rate
independentRatesFromMdt returns a matrix of ASDT independent rates
for every combination of age and decrement in the supplied
multiple-decrement table.
independentRatesFromMdt(object, x, t = 1)independentRatesFromMdt(object, x, t = 1)
object |
An |
x |
Optional numeric vector of ages to include. Defaults to all ages
tabulated in |
t |
Period (default 1). |
The independent rate for decrement at age is obtained under
the Uniform Distribution of Deaths (UDD) assumption as
which is the same formula used by qxt.prime.fromMdt for a single
age/decrement pair. independentRatesFromMdt is a convenience wrapper
that applies this extraction to all ages and all decrements at once, returning
the result as a tidy matrix.
A numeric matrix with one row per age and one column per decrement. Row names are the ages, column names the decrement identifiers.
qxt.prime.fromMdt for a single age/decrement pair,
buildMdtFromIndependentRates for the inverse operation.
valdezDf <- data.frame( x = 50:54, lx = c(4832555, 4821937, 4810206, 4797185, 4782737), heart = c(5168, 5363, 5618, 5929, 6277), accidents = c(1157, 1206, 1443, 1679, 2152), other = c(4293, 5162, 5960, 6840, 7631)) valdezMdt <- new("mdt", name = "ValdezExample", table = valdezDf) # ASDT matrix on the ages actually supplied independentRatesFromMdt(valdezMdt, x = 50:54) # Subset of ages independentRatesFromMdt(valdezMdt, x = 50:52)valdezDf <- data.frame( x = 50:54, lx = c(4832555, 4821937, 4810206, 4797185, 4782737), heart = c(5168, 5363, 5618, 5929, 6277), accidents = c(1157, 1206, 1443, 1679, 2152), other = c(4293, 5162, 5960, 6840, 7631)) valdezMdt <- new("mdt", name = "ValdezExample", table = valdezDf) # ASDT matrix on the ages actually supplied independentRatesFromMdt(valdezMdt, x = 50:54) # Subset of ages independentRatesFromMdt(valdezMdt, x = 50:52)
There functions switch from interest to intensity and vice - versa.
intensity2Interest(intensity) interest2Intensity(i)intensity2Interest(intensity) interest2Intensity(i)
intensity |
Intensity rate |
i |
interest rate |
Simple financial mathematics formulas are applied.
A numeric value.
Giorgio A. Spedicato
Broverman, S.A., Mathematics of Investment and Credit (Fourth Edition), 2008, ACTEX Publications.
# a force of interest of 0.02 corresponds to an APR of intensity2Interest(intensity=0.02) #an interest rate equal to 0.02 corresponds to a force of interest of of interest2Intensity(i=0.02)# a force of interest of 0.02 corresponds to an APR of intensity2Interest(intensity=0.02) #an interest rate equal to 0.02 corresponds to a force of interest of of interest2Intensity(i=0.02)
These functions switch from interest to discount rates and vice - versa
interest2Discount(i) discount2Interest(d)interest2Discount(i) discount2Interest(d)
i |
Interest rate |
d |
Discount rate |
The following formula (and its inverse) rules the relationships:
A numeric value
Giorgio Alfredo Spedicato
Broverman, S.A., Mathematics of Investment and Credit (Fourth Edition), 2008, ACTEX Publications.
intensity2Interest,nominal2Real
discount2Interest(d=0.04)discount2Interest(d=0.04)
This function evaluates non - stochastic increasing annuities future values.
Isn(i, n, type = "immediate")Isn(i, n, type = "immediate")
i |
Interest rate. |
n |
Terms. |
type |
Either "due" for annuity due or "immediate" for annuity immediate. |
It calls increasingAnnuity after having capitalized by
A numeric value
The function is provided as is, without any guarantee regarding the accuracy of calculation. We disclaim any liability for eventual losses arising from direct or indirect use of this software.
This function calls internally increasingAnnuity function.
Giorgio A. Spedicato
Broverman, S.A., Mathematics of Investment and Credit (Fourth Edition), 2008, ACTEX Publications.
Isn(n=10,i=0.03)Isn(n=10,i=0.03)
"lifetable"
lifetable objects allow to define and use life tables with the aim to evaluate
survival probabilities and mortality rates easily.
Such values represent the building blocks used to estimate life insurances actuarial mathematics.
Objects can be created by calls of the form new("lifetable", ...).
Two vectors are needed. The age vector and the population at risk vector.
x:Object of class "numeric", representing the sequence 0,1,
lx:Object of class "numeric", representing the number of lives at the beginning of age . It is a non
increasing sequence. The last element of vector x is supposed to be > 0.
name:Object of class "character", reporting the name of the table
signature(from = "lifetable", to = "data.frame"): method to create a data - frame from a lifetable object
signature(from = "lifetable", to = "markovchainList"): coerce method from lifetable to markovchainList; available only when the optional markovchain package is installed
signature(from = "lifetable", to = "numeric"): brings to numeric
signature(from = "data.frame", to = "lifetable"): brings to life table
signature(object = "lifetable"): returns the maximum attainable life age
signature(x = "lifetable"): plot method
signature(x = "lifetable"): head method
signature(x = "lifetable"): method to print the survival probability implied in the table
signature(object = "lifetable"): identical to plot method
signature(object = "lifetable"): it returns summary information about the object
The function is provided as is, without any warranty regarding the accuracy of calculations. The author disclaims any liability for eventual losses arising from direct or indirect use of this software.
t may be missing in pxt, qxt, ext. It assumes value equal to 1 in such case.
Giorgio A. Spedicato
Actuarial Mathematics (Second Edition), 1997, by Bowers, N.L., Gerber, H.U., Hickman, J.C., Jones, D.A. and Nesbitt, C.J.
showClass("lifetable") data(soa08) summary(soa08) #the last attainable age under SOA life table is getOmega(soa08) #head and tail data(soaLt) tail(soaLt) head(soaLt)showClass("lifetable") data(soa08) summary(soa08) #the last attainable age under SOA life table is getOmega(soa08) #head and tail data(soaLt) tail(soaLt) head(soaLt)
Various demographic functions
Lxt(object, x, t = 1, fxt = 0.5) Tx(object, x, fxt = 0.5, axOmega = 1 - fxt)Lxt(object, x, t = 1, fxt = 0.5) Tx(object, x, fxt = 0.5, axOmega = 1 - fxt)
object |
a |
x |
age of the subject |
t |
duration of the calculation |
fxt |
fraction of the year of age lived by those who die within the
year (so that |
axOmega |
mean number of years lived in the last, open-ended age
interval by those still alive at the last tabulated age |
Tx il the sum of years lived since age x by the population of the life table, it is the sum of Lx. The function is provided as is,
without any warranty regarding the accuracy of calculations. Use at own risk.
A numeric value
Giorgio Alfredo Spedicato.
Actuarial Mathematics (Second Edition), 1997, by Bowers, N.L., Gerber, H.U., Hickman, J.C., Jones, D.A. and Nesbitt, C.J.
data(soaLt) soa08Act=with(soaLt, new("actuarialtable",interest=0.06, x=x,lx=Ix,name="SOA2008")) Lxt(soa08Act, 67,10) #assumes SOA example life table to be load data(soaLt) soa08Act=with(soaLt, new("actuarialtable",interest=0.06,x=x,lx=Ix,name="SOA2008")) Tx(soa08Act, 67)data(soaLt) soa08Act=with(soaLt, new("actuarialtable",interest=0.06, x=x,lx=Ix,name="SOA2008")) Lxt(soa08Act, 67,10) #assumes SOA example life table to be load data(soaLt) soa08Act=with(soaLt, new("actuarialtable",interest=0.06,x=x,lx=Ix,name="SOA2008")) Tx(soa08Act, 67)
"mdt"
A class to store multiple decrement tables
Objects can be created by calls of the form new("mdt", name, table,
bottomCompletionSurvival, ...). They store absolute decrements.
bottomCompletionSurvival (default 0.99) is the one-year
survival ratio used to synthetically back-fill ages below the lowest age
supplied in table; it does not affect rows for ages actually
supplied.
name:The name of the table
table:A data frame containing at least the number of decrements
signature(object = "mdt"): return the name of decrements
signature(object = "mdt"): maximum attainable age
signature(.Object = "mdt"): method to initialize the class
signature(x = "mdt"): tabulate absolute decrement rates
signature(object = "mdt"): show rates of decrement
signature(from = "mdt", to = "markovchainList"): coercing to markovchainList objects; available only when the optional markovchain package is installed
signature(from = "mdt", to = "data.frame"): coercing to data.frame
signature(object = "mdt"): it returns summary information about the object
Currently only decrements storage of the class is defined.
Giorgio Alfredo Spedicato
Marcel Finan A Reading of the Theory of Life Contingency Models: A Preparation for Exam MLC/3L
#shows the class definition showClass("mdt") #create a new table tableDecr=data.frame(d1=c(150,160,160),d2=c(50,75,85)) newMdt<-new("mdt",name="testMDT",table=tableDecr)#shows the class definition showClass("mdt") #create a new table tableDecr=data.frame(d1=c(150,160,160),d2=c(50,75,85)) newMdt<-new("mdt",name="testMDT",table=tableDecr)
mdtToLong reshapes a multiple decrement table into an aggregated
long data set with one row per (exit time, cause) and a count
column, ready for competing-risks tools such as
survival::survfit(Surv(time, status) ~ 1, weights = count)
(Aalen-Johansen cumulative incidence) or for any analysis based on
survival::Surv.
mdtToLong(object, x, t, exitTime = c("end", "mid"), dropZero = TRUE)mdtToLong(object, x, t, exitTime = c("end", "mid"), dropZero = TRUE)
object |
an |
x |
entry age of the cohort (default: the lowest tabulated age, 0). |
t |
length of the follow-up in years (default: to the end of the
table). Lives still in the table at |
exitTime |
where in the year of age decrements are placed:
|
dropZero |
logical: drop rows with zero count (default |
With exitTime = "end" the Aalen-Johansen estimate of the
cumulative incidence of cause at time computed on the
weighted long data coincides with qxt(object, x, k, decrement = j);
see the multiple decrement vignette.
A data.frame with columns time (years since age
x), age (age at exit or censoring), status (a
factor whose first level, "censored", is followed by the
decrement names, as expected by survival::Surv for multi-state
data) and count (number of lives, possibly non-integer).
valdezDf <- data.frame( x = 50:54, lx = c(4832555, 4821937, 4810206, 4797185, 4782737), heart = c(5168, 5363, 5618, 5929, 6277), accidents = c(1157, 1206, 1443, 1679, 2152), other = c(4293, 5162, 5960, 6840, 7631)) valdezMdt <- new("mdt", name = "ValdezExample", table = valdezDf) long <- mdtToLong(valdezMdt, x = 50, t = 5) head(long) if (requireNamespace("survival", quietly = TRUE)) { fit <- survival::survfit(survival::Surv(time, status) ~ 1, data = long, weights = count) summary(fit, times = 1:5)$pstate }valdezDf <- data.frame( x = 50:54, lx = c(4832555, 4821937, 4810206, 4797185, 4782737), heart = c(5168, 5363, 5618, 5929, 6277), accidents = c(1157, 1206, 1443, 1679, 2152), other = c(4293, 5162, 5960, 6840, 7631)) valdezMdt <- new("mdt", name = "ValdezExample", table = valdezDf) long <- mdtToLong(valdezMdt, x = 50, t = 5) head(long) if (requireNamespace("survival", quietly = TRUE)) { fit <- survival::survfit(survival::Surv(time, status) ~ 1, data = long, weights = count) summary(fit, times = 1:5)$pstate }
S4 method for the median generic: the median age at
death implied by a lifetable, i.e. the age at which the survivorship
column has fallen to half of its value at age (linear
interpolation on ).
## S4 method for signature 'lifetable' median(x, na.rm = FALSE, ...)## S4 method for signature 'lifetable' median(x, na.rm = FALSE, ...)
x |
A |
na.rm |
Unused, kept for compatibility with the generic. |
... |
Optional |
The median age at death (a numeric value).
data(soa08Act) median(soa08Act) # median age at death from birth median(soa08Act, age = 65) # median age at death given survival to 65data(soa08Act) median(soa08Act) # median age at death from birth median(soa08Act, age = 65) # median age at death given survival to 65
Returns the age at which the number of deaths is largest, i.e. the
Lexis modal age at death. (R's base mode returns the
storage type of an object and cannot be used for this, so a dedicated
function is provided.)
modalAge(object, startAge = NULL, interpolate = FALSE)modalAge(object, startAge = NULL, interpolate = FALSE)
object |
A |
startAge |
Optional lower age bound for the search. Use it (e.g.
|
interpolate |
Logical. If |
The death counts are ; the artificial mass
at the last, open age interval (all remaining survivors) is excluded from
the search.
The modal age at death (a numeric value).
data(soa08Act) modalAge(soa08Act) modalAge(soa08Act, startAge = 10, interpolate = TRUE)data(soa08Act) modalAge(soa08Act) modalAge(soa08Act, startAge = 10, interpolate = TRUE)
These functions evaluate multiple life survival probabilities, either for joint or last life status. Arbitrary life probabilities can be generated as well as random samples of lifes.
exyzt(tablesList, x, t = Inf, status = "joint", type = "Kx", ...) pxyzt(tablesList, x, t, status = "joint", fractional=rep("linear", length(tablesList)), ...) qxyzt(tablesList, x, t, status = "joint", fractional=rep("linear",length(tablesList)), ...)exyzt(tablesList, x, t = Inf, status = "joint", type = "Kx", ...) pxyzt(tablesList, x, t, status = "joint", fractional=rep("linear", length(tablesList)), ...) qxyzt(tablesList, x, t, status = "joint", fractional=rep("linear",length(tablesList)), ...)
tablesList |
A list whose elements are either |
x |
A vector of the same size of tableList that contains the initial ages. |
t |
The duration. |
status |
Either |
type |
Either |
fractional |
Assumptions for fractional age. One of |
... |
Options to be passed to |
These functions extends pxyt family to an arbitrary number of life contingencies.
An estimate of survival / death probability or expected lifetime, or a matrix of ages.
The procedure is experimental.
Giorgio Alfredo, Spedicato
Broverman, S.A., Mathematics of Investment and Credit (Fourth Edition), 2008, ACTEX Publications.
#assessment of curtate expectation of future lifetime of the joint-life status #generate a sample of lifes data(soaLt) soa08Act=with(soaLt, new("actuarialtable",interest=0.06,x=x,lx=Ix,name="SOA2008")) tables=list(males=soa08Act, females=soa08Act) xVec=c(60,65) test=rLifexyz(n=50000, tablesList = tables,x=xVec,type="Kx") #check first survival status t.test(x=apply(test,1,"min"),mu=exyzt(tablesList=tables, x=xVec,status="joint")) #check last survival status t.test(x=apply(test,1,"max"),mu=exyzt(tablesList=tables, x=xVec,status="last"))#assessment of curtate expectation of future lifetime of the joint-life status #generate a sample of lifes data(soaLt) soa08Act=with(soaLt, new("actuarialtable",interest=0.06,x=x,lx=Ix,name="SOA2008")) tables=list(males=soa08Act, females=soa08Act) xVec=c(60,65) test=rLifexyz(n=50000, tablesList = tables,x=xVec,type="Kx") #check first survival status t.test(x=apply(test,1,"min"),mu=exyzt(tablesList=tables, x=xVec,status="joint")) #check last survival status t.test(x=apply(test,1,"max"),mu=exyzt(tablesList=tables, x=xVec,status="last"))
Function to convert mortality rates to probabilities of death
mx2qx(mx, ax = 0.5)mx2qx(mx, ax = 0.5)
mx |
mortality rates vector |
ax |
the average number of years lived between ages x and x +1 by individuals who die in that interval |
Function to convert mortality rates to probabilities of death
A vector of death probabilities
mxt, qxt, qx2mx
#using some recursion qx2mx(mx2qx(.2))#using some recursion qx2mx(mx2qx(.2))
This function returns the central mortality rate demographic function.
mxt(object, x, t)mxt(object, x, t)
object |
a |
x |
subject's age |
t |
period on which the rate is evaluated |
A numeric value representing the central mortality rate between age and .
Actuarial Mathematics (Second Edition), 1997, by Bowers, N.L., Gerber, H.U., Hickman, J.C., Jones, D.A. and Nesbitt, C.J.
#assumes SOA example life table to be load data(soaLt) soa08Act=with(soaLt, new("actuarialtable",interest=0.06,x=x,lx=Ix,name="SOA2008")) #compare mx and qx mxt(soa08Act, 60,10) qxt(soa08Act, 60,10)#assumes SOA example life table to be load data(soaLt) soa08Act=with(soaLt, new("actuarialtable",interest=0.06,x=x,lx=Ix,name="SOA2008")) #compare mx and qx mxt(soa08Act, 60,10) qxt(soa08Act, 60,10)
Functions to switch from nominal / effective / convertible rates
nominal2Real(i, k = 1, type = "interest") convertible2Effective(i, k = 1, type = "interest") real2Nominal(i, k = 1, type = "interest") effective2Convertible(i, k = 1, type = "interest")nominal2Real(i, k = 1, type = "interest") convertible2Effective(i, k = 1, type = "interest") real2Nominal(i, k = 1, type = "interest") effective2Convertible(i, k = 1, type = "interest")
i |
The rate to be converted. |
k |
The original / target compounding frequency. |
type |
Either "interest" (default) or "nominal". |
effective2Convertible and convertible2Effective wrap the other two functions.
A numeric value.
Convertible rates are synonims of nominal rates
Broverman, S.A., Mathematics of Investment and Credit (Fourth Edition), 2008, ACTEX Publications.
#a nominal rate of 0.12 equates an APR of nominal2Real(i=0.12, k = 12, "interest")#a nominal rate of 0.12 equates an APR of nominal2Real(i=0.12, k = 12, "interest")
S4 method for the plot generic: visualises the
decrement structure of an mdt object. Three views are available:
a stacked-area chart of death counts (default), a stacked
bar chart, or a line chart of decrement probabilities
.
## S4 method for signature 'mdt,missing' plot(x, y, type = c("area", "bar", "probability"), ...)## S4 method for signature 'mdt,missing' plot(x, y, type = c("area", "bar", "probability"), ...)
x |
An |
y |
Not used (kept for S4 generic compatibility). |
type |
Character: one of |
... |
Further arguments (currently unused). |
A ggplot2 object (returned invisibly).
valdezDf <- data.frame( x = 50:54, lx = c(4832555, 4821937, 4810206, 4797185, 4782737), heart = c(5168, 5363, 5618, 5929, 6277), accidents = c(1157, 1206, 1443, 1679, 2152), other = c(4293, 5162, 5960, 6840, 7631)) valdezMdt <- new("mdt", name = "ValdezExample", table = valdezDf) plot(valdezMdt) plot(valdezMdt, type = "bar") plot(valdezMdt, type = "probability")valdezDf <- data.frame( x = 50:54, lx = c(4832555, 4821937, 4810206, 4797185, 4782737), heart = c(5168, 5363, 5618, 5929, 6277), accidents = c(1157, 1206, 1443, 1679, 2152), other = c(4293, 5162, 5960, 6840, 7631)) valdezMdt <- new("mdt", name = "ValdezExample", table = valdezDf) plot(valdezMdt) plot(valdezMdt, type = "bar") plot(valdezMdt, type = "probability")
This function evaluates the present values of a series of cash flows, given occurrence time. Probabilities of occurrence can also be taken into account.
presentValue(cashFlows, timeIds, interestRates, probabilities, power = 1)presentValue(cashFlows, timeIds, interestRates, probabilities, power = 1)
cashFlows |
Numeric vector of cash flows. Must be coherent with |
timeIds |
Numeric vector of time points where |
interestRates |
A single numeric interest rate or a numeric vector of the same
length as |
probabilities |
Optional numeric vector of occurrence probabilities. If missing, a vector of ones (certainty) is assumed. |
power |
Numeric power applied to discount and cash flows. Defaults to 1. |
Present value of a series of cash flows.
Evaluate the present value (or actuarial present value when probabilities are provided) of a vector of cash flows occurring at given time instants and discounted by provided interest rates.
probabilities is optional; when omitted a sequence of 1's with the
same length as timeIds is assumed. Interest rate may be a fixed number
or a vector of the same size as timeIds. The power parameter is
normally unused except in special actuarial evaluations.
A numeric scalar representing the present value of the cash flow vector,
or the actuarial present value if probabilities are provided.
This simple function is the kernel working core of the package. Actuarial and financial mathematics ground on it.
Giorgio A. Spedicato
Broverman, S.A., Mathematics of Investment and Credit (Fourth Edition), 2008, ACTEX Publications.
# simple example cf <- c(10,10,10) # $10 payments one per year for three years t <- c(1,2,3) # years p <- c(1,1,1) # payments certainty presentValue(cashFlows = cf, timeIds = t, interestRates = 0.03, probabilities = p)# simple example cf <- c(10,10,10) # $10 payments one per year for three years t <- c(1,2,3) # years p <- c(1,1,1) # payments certainty presentValue(cashFlows = cf, timeIds = t, interestRates = 0.03, probabilities = p)
This function returns a newly created lifetable object given either survival or death (one year) probabilities)
probs2lifetable(probs, radix = 10000, type = "px", name = "ungiven")probs2lifetable(probs, radix = 10000, type = "px", name = "ungiven")
probs |
A real valued vector representing either one year survival or death probabilities. The last value in the vector must be either 1 or 0, depending if it represents death or survival probabilities respectively. |
radix |
The radix of the life table. |
type |
Character value either "px" or "qx" indicating how probabilities must be interpreted. |
name |
The character value to be put in the corresponding slot of returned object. |
The value is the length of the probs vector.
A lifetable object.
The function is provided as is, without any guarantee regarding the accuracy of calculation. We disclaim any liability for eventual losses arising from direct or indirect use of this software.
This function allows to use mortality projection given by other softwares with the lifecontingencies package.
Giorgio A. Spedicato
Actuarial Mathematics (Second Edition), 1997, by Bowers, N.L., Gerber, H.U., Hickman, J.C., Jones, D.A. and Nesbitt, C.J.
fakeSurvivalProbs=seq(0.9,0,by=-0.1) newTable=probs2lifetable(fakeSurvivalProbs,type="px",name="fake") head(newTable) tail(newTable)fakeSurvivalProbs=seq(0.9,0,by=-0.1) newTable=probs2lifetable(fakeSurvivalProbs,type="px",name="fake") head(newTable) tail(newTable)
These functions evaluate raw survival and death probabilities between age x and x+t
dxt(object, x, t, decrement) pxt(object, x, t, fractional = "linear", decrement) qxt(object, x, t, fractional = "linear", decrement)dxt(object, x, t, decrement) pxt(object, x, t, fractional = "linear", decrement) qxt(object, x, t, fractional = "linear", decrement)
object |
A |
x |
Age of life |
t |
Period until which the age shall be evaluated. Default value is 1.
(can be a vector for |
fractional |
Assumptions for fractional age. One of |
decrement |
The reason of decrement (only for |
Fractional assumptions are:
linear: linear interpolation between consecutive ages, i.e. assume uniform distribution.
constant force of mortality : constant force of mortality, also known as exponential interpolation.
hyperbolic: Balducci assumption, also known as harmonic interpolation.
Note that fractional="uniform", "exponential", "harmonic" or "Balducci"
is also authorized.
See references for details.
dxt, pxt and qxt are S4 generics with methods for lifetable (and hence
actuarialtable) and mdt objects; other packages can add methods for new table classes.
For mdt objects with a decrement, and
pxt returns its complement ; ages must be tabulated integers and fractional
t is interpolated linearly (UDD) within the year.
A numeric value representing requested probability.
The function is provided as is, without any warranty regarding the accuracy of calculations. The author disclaims any liability for eventual losses arising from direct or indirect use of this software.
Function dxt accepts also fractional value of t. Linear interpolation is used in such case. These functions are called by many other functions.
Giorgio A. Spedicato
Actuarial Mathematics (Second Edition), 1997, by Bowers, N.L., Gerber, H.U., Hickman, J.C., Jones, D.A. and Nesbitt, C.J.
#dxt example data(soa08Act) dxt(object=soa08Act, x=90, t=2) #qxt example qxt(object=soa08Act, x=90, t=2) #pxt example pxt(object=soa08Act, x=90, t=2, "constant force" ) #MDT example (Valdez) valdezMdt <- new("mdt", name = "ValdezExample", table = data.frame( x = 50:54, lx = c(4832555, 4821937, 4810206, 4797185, 4782737), heart = c(5168, 5363, 5618, 5929, 6277), accidents = c(1157, 1206, 1443, 1679, 2152), other = c(4293, 5162, 5960, 6840, 7631))) qxt(valdezMdt, x = 50, t = 3, decrement = "heart") qxt(valdezMdt, x = 50, t = 3, decrement = c("heart", "accidents")) pxt(valdezMdt, x = 50, t = 3)#dxt example data(soa08Act) dxt(object=soa08Act, x=90, t=2) #qxt example qxt(object=soa08Act, x=90, t=2) #pxt example pxt(object=soa08Act, x=90, t=2, "constant force" ) #MDT example (Valdez) valdezMdt <- new("mdt", name = "ValdezExample", table = data.frame( x = 50:54, lx = c(4832555, 4821937, 4810206, 4797185, 4782737), heart = c(5168, 5363, 5618, 5929, 6277), accidents = c(1157, 1206, 1443, 1679, 2152), other = c(4293, 5162, 5960, 6840, 7631))) qxt(valdezMdt, x = 50, t = 3, decrement = "heart") qxt(valdezMdt, x = 50, t = 3, decrement = c("heart", "accidents")) pxt(valdezMdt, x = 50, t = 3)
These functions evaluate survival and death probabilities for two heads.
exyt(objectx, objecty, x, y, t, status = "joint") pxyt(objectx, objecty, x, y, t, status = "joint") qxyt(objectx, objecty, x, y, t, status = "joint")exyt(objectx, objecty, x, y, t, status = "joint") pxyt(objectx, objecty, x, y, t, status = "joint") qxyt(objectx, objecty, x, y, t, status = "joint")
objectx |
|
objecty |
|
x |
Age of life X. |
y |
Age of life Y. |
t |
Time until survival has to be evaluated. |
status |
Either |
A numeric value representing joint survival probability.
The function is provided as is, without any warranty regarding the accuracy of calculations. The author disclaims any liability for eventual losses arising from direct or indirect use of this software. Also it is being Deprecated and asap removed from the package.
These functions are used to evaluate two or more life contingencies.
Giorgio A. Spedicato, Kevin J. Owens.
Actuarial Mathematics (Second Edition), 1997, by Bowers, N.L., Gerber, H.U., Hickman, J.C., Jones, D.A. and Nesbitt, C.J.
## Not run: data(soa08Act) pxyt(soa08Act, soa08Act, 65, 70,10) pxyt(soa08Act, soa08Act, 65, 70,10, "last") ## End(Not run)## Not run: data(soa08Act) pxyt(soa08Act, soa08Act, 65, 70,10) pxyt(soa08Act, soa08Act, 65, 70,10, "last") ## End(Not run)
S4 method for the quantile generic: quantiles of the
age at death implied by a lifetable, obtained by linear interpolation
on the survivorship column .
## S4 method for signature 'lifetable' quantile(x, probs = seq(0, 1, 0.25), age = min(x@x), names = TRUE, ...)## S4 method for signature 'lifetable' quantile(x, probs = seq(0, 1, 0.25), age = min(x@x), names = TRUE, ...)
x |
A |
... |
Further arguments (currently unused). |
probs |
Numeric vector of probabilities in |
age |
Youngest age to condition on (default: the youngest tabulated
age). Quantiles refer to the age at death given survival to |
names |
Logical: if |
A numeric vector of age-at-death quantiles.
data(soa08Act) quantile(soa08Act) quantile(soa08Act, probs = c(0.1, 0.9), age = 65)data(soa08Act) quantile(soa08Act) quantile(soa08Act, probs = c(0.1, 0.9), age = 65)
Function to convert death probabilities to mortality rates
qx2mx(qx, ax = 0.5)qx2mx(qx, ax = 0.5)
qx |
death probabilities |
ax |
the average number of years lived between ages x and x +1 by individuals who die in that interval |
Function to convert death probabilities to mortality rates
A vector of mortality rates
mxt, qxt, mx2qx
data(soa08Act) soa08qx<-as(soa08Act,"numeric") soa08mx<-qx2mx(qx=soa08qx) soa08qx2<-mx2qx(soa08mx)data(soa08Act) soa08qx<-as(soa08Act,"numeric") soa08mx<-qx2mx(qx=soa08qx) soa08qx2<-mx2qx(soa08mx)
Return Associated single decrement from absolute rate of decrement
qxt.prime.fromMdt(object, x, t = 1, decrement) qxt.fromQxprime(qx.prime, other.qx.prime, t = 1)qxt.prime.fromMdt(object, x, t = 1, decrement) qxt.fromQxprime(qx.prime, other.qx.prime, t = 1)
object |
a mdj object |
x |
age |
t |
period (default 1) |
decrement |
type (necessary) |
qx.prime |
single ASDT decrement of which corresponding decrement is desired |
other.qx.prime |
ASDT decrements other than |
a single value (AST)
qxt.fromQxprime(): Obtain decrement from single decrements
#Creating the valdez mdf valdezDf<-data.frame( x=c(50:54), lx=c(4832555,4821937,4810206,4797185,4782737), hearth=c(5168, 5363, 5618, 5929, 6277), accidents=c(1157, 1206, 1443, 1679,2152), other=c(4293,5162,5960,6840,7631)) valdezMdt<-new("mdt",name="ValdezExample",table=valdezDf) qxt.prime.fromMdt(object=valdezMdt,x=53,decrement="other") #Finan example 67.2 qxt.fromQxprime(qx.prime = 0.01,other.qx.prime = c(0.03,0.06))#Creating the valdez mdf valdezDf<-data.frame( x=c(50:54), lx=c(4832555,4821937,4810206,4797185,4782737), hearth=c(5168, 5363, 5618, 5929, 6277), accidents=c(1157, 1206, 1443, 1679,2152), other=c(4293,5162,5960,6840,7631)) valdezMdt<-new("mdt",name="ValdezExample",table=valdezDf) qxt.prime.fromMdt(object=valdezMdt,x=53,decrement="other") #Finan example 67.2 qxt.fromQxprime(qx.prime = 0.01,other.qx.prime = c(0.03,0.06))
Function to generate samples from the life contingencies stochastic variables
rLifeContingencies( n, lifecontingency, object, x, t, i = object@interest, m = 0, k = 1, parallel = FALSE, nthreads = NULL, payment = "advance" ) rLifeContingenciesXyz( n, lifecontingency, tablesList, x, t, i, m = 0, k = 1, status = "joint", parallel = FALSE, nthreads = NULL, payment = "advance" )rLifeContingencies( n, lifecontingency, object, x, t, i = object@interest, m = 0, k = 1, parallel = FALSE, nthreads = NULL, payment = "advance" ) rLifeContingenciesXyz( n, lifecontingency, tablesList, x, t, i, m = 0, k = 1, status = "joint", parallel = FALSE, nthreads = NULL, payment = "advance" )
n |
Size of sample |
lifecontingency |
A character string, either |
object |
An |
x |
Policyholder's age at issue time; for |
t |
The lenght of the insurance. Must be specified according to the present value of benefits definition. |
i |
The interest rate, whose default value is the |
m |
Deferring period, default value is zero. |
k |
Fractional payment, default value is 1. |
parallel |
Request multi-threaded (OpenMP) computation of the per-sample
payoff. This is opt-in twice: it has an effect only if
|
nthreads |
Number of OpenMP threads used when parallelisation is active.
Defaults to |
payment |
The Payment type, either |
tablesList |
A list of |
status |
Either |
A numeric vector
## Not run: #assumes SOA example life table to be load data(soaLt) soa08Act=with(soaLt, new("actuarialtable",interest=0.06, x=x,lx=Ix,name="SOA2008")) out<-rLifeContingencies(n=1000, lifecontingency="Axn",object=soa08Act, x=40, t=getOmega(soa08Act)-40, m=0) APV=Axn(soa08Act,x=40) #check if out distribution is unbiased t.test(x=out, mu=APV)$p.value>0.05 ## End(Not run) ## Not run: data(soa08Act) n=10000 lifecontingency="Axyz" tablesList=list(soa08Act,soa08Act) x=c(60,60); i=0.06; m=0; status="joint"; t=30; k=1 APV=Axyzn(tablesList=tablesList,x=x,n=t,m=m,k=k,status=status,type="EV") samples<-rLifeContingenciesXyz(n=n,lifecontingency = lifecontingency,tablesList = tablesList, x=x,t=t,m=m,k=k,status=status, parallel=FALSE) APV mean(samples) ## End(Not run)## Not run: #assumes SOA example life table to be load data(soaLt) soa08Act=with(soaLt, new("actuarialtable",interest=0.06, x=x,lx=Ix,name="SOA2008")) out<-rLifeContingencies(n=1000, lifecontingency="Axn",object=soa08Act, x=40, t=getOmega(soa08Act)-40, m=0) APV=Axn(soa08Act,x=40) #check if out distribution is unbiased t.test(x=out, mu=APV)$p.value>0.05 ## End(Not run) ## Not run: data(soa08Act) n=10000 lifecontingency="Axyz" tablesList=list(soa08Act,soa08Act) x=c(60,60); i=0.06; m=0; status="joint"; t=30; k=1 APV=Axyzn(tablesList=tablesList,x=x,n=t,m=m,k=k,status=status,type="EV") samples<-rLifeContingenciesXyz(n=n,lifecontingency = lifecontingency,tablesList = tablesList, x=x,t=t,m=m,k=k,status=status, parallel=FALSE) APV mean(samples) ## End(Not run)
Function to generate random future lifetimes
rLife(n, object, x = 0, k = 1, type = "Tx") rLifexyz(n, tablesList, x, k = 1, type = "Tx")rLife(n, object, x = 0, k = 1, type = "Tx") rLifexyz(n, tablesList, x, k = 1, type = "Tx")
n |
Number of variates to generate |
object |
An object of class lifetable |
x |
The attained age of subject x, default value is 0 |
k |
Number of periods within the year when it is possible death to happen, default value is 1 |
type |
Either |
tablesList |
An list of lifetables |
Under the uniform distribution of deaths assumption the complete future lifetime is the curtate one plus an independent uniform fraction of year, with , hence . For type="Tx" the function returns , i.e. a deterministic mid-period fraction, so only the expected value (not the full distribution) of is reproduced.
A numeric vector of n elements.
The function is provided as is, without any warranty regarding the accuracy of calculations. The author disclaims any liability for eventual losses arising from direct or indirect use of this software.
Actuarial Mathematics (Second Edition), 1997, by Bowers, N.L., Gerber, H.U., Hickman, J.C., Jones, D.A. and Nesbitt, C.J.
## Not run: ##get 20000 random future lifetimes for the Soa life table at birth data(soa08Act) lifes=rLife(n=20000,object=soa08Act, x=0, type="Tx") # check if the expected life at birth derived from the life table is statistically equal # to the expected value of the sample t.test(x=lifes, mu=exn(soa08Act, x=0, type="continuous")) ## End(Not run) ## Not run: #assessment of curtate expectation of future lifetime of the joint-life status #generate a sample of lifes data(soaLt) soa08Act=with(soaLt, new("actuarialtable",interest=0.06,x=x,lx=Ix,name="SOA2008")) tables=list(males=soa08Act, females=soa08Act) xVec=c(60,65) test=rLifexyz(n=50000, tablesList = tables,x=xVec,type="Kx") #check first survival status t.test(x=apply(test,1,"min"),mu=exyzt(tablesList=tables, x=xVec,status="joint")) #check last survival status t.test(x=apply(test,1,"max"),mu=exyzt(tablesList=tables, x=xVec,status="last")) ## End(Not run)## Not run: ##get 20000 random future lifetimes for the Soa life table at birth data(soa08Act) lifes=rLife(n=20000,object=soa08Act, x=0, type="Tx") # check if the expected life at birth derived from the life table is statistically equal # to the expected value of the sample t.test(x=lifes, mu=exn(soa08Act, x=0, type="continuous")) ## End(Not run) ## Not run: #assessment of curtate expectation of future lifetime of the joint-life status #generate a sample of lifes data(soaLt) soa08Act=with(soaLt, new("actuarialtable",interest=0.06,x=x,lx=Ix,name="SOA2008")) tables=list(males=soa08Act, females=soa08Act) xVec=c(60,65) test=rLifexyz(n=50000, tablesList = tables,x=xVec,type="Kx") #check first survival status t.test(x=apply(test,1,"min"),mu=exyzt(tablesList=tables, x=xVec,status="joint")) #check last survival status t.test(x=apply(test,1,"max"),mu=exyzt(tablesList=tables, x=xVec,status="last")) ## End(Not run)
Simulate from a multiple decrement table
rmdt(n = 1, object, x = 0, t = 1, t0 = "alive", include.t0 = TRUE)rmdt(n = 1, object, x = 0, t = 1, t0 = "alive", include.t0 = TRUE)
n |
Number of simulations. |
object |
The |
x |
the period to simulate from. |
t |
the period until to simulate. |
t0 |
initial status (default is "alive"). |
include.t0 |
should initial status to be included (default is TRUE)? |
A matrix with n columns (the length of simulation) and either t (if initial status is not included) or t+1 rows.
The function uses rmarkovchain from the optional markovchain package to simulate the chain: it stops with an informative error if that package is not installed.
Giorgio Alfredo Spedicato
rLifeContingenciesXyz,rLifeContingencies
mdtDf<-data.frame(x=c(0,1,2,3),death=c(100,50,30,10),lapse=c(150,20,2,0)) myMdt<-new("mdt",name="example Mdt",table=mdtDf) # rmdt() needs the optional markovchain package if (requireNamespace("markovchain", quietly = TRUE)) { ciao<-rmdt(n=5,object = myMdt,x = 0,t = 4,include.t0=FALSE,t0="alive") }mdtDf<-data.frame(x=c(0,1,2,3),death=c(100,50,30,10),lapse=c(150,20,2,0)) myMdt<-new("mdt",name="example Mdt",table=mdtDf) # rmdt() needs the optional markovchain package if (requireNamespace("markovchain", quietly = TRUE)) { ciao<-rmdt(n=5,object = myMdt,x = 0,t = 4,include.t0=FALSE,t0="alive") }
This is the table that appears in the classical book Actuarial Mathematics in Appendix 2A and used throughout the book to illustrate life contingent calculations. The Society of Actuaries has been using this table when administering US actuarial professional MLC preliminary examinations.
data(soa08)data(soa08)
Formal class 'lifetable' [package "lifecontingencies"] with 3 slots ..@ x : int [1:141] 0 1 2 3 4 5 6 7 8 9 ... ..@ lx : num [1:141] 100000 97958 97826 97707 97597 ... ..@ name: chr "SOA Illustrative Life Table"
This table is a blend of Makeham's mortality law for ages 13 and above and some ad hoc values for ages 0 to 12.
The parameters for Makeham's mortality law are
1000 * mu(x) = 0.7 + 0.05 * 10^(0.04 * x)
where mu(x) is the force of mortality.
The published Illustrative Life Table just shows ages 0 to 110 but in the computing exercises of chapter 3 the authors explain that the table's age range is from 0 to 140.
This table is based on US 1990 general population mortality.
Actuarial Mathematics (Second Edition), 1997, by Bowers, N.L., Gerber, H.U., Hickman, J.C., Jones, D.A. and Nesbitt, C.J.
data(soa08) ## maybe str(soa08) ; plot(soa08) ...data(soa08) ## maybe str(soa08) ; plot(soa08) ...
An object of class actuarialtable built from the SOA illustrative life table. Interest rate is 6
data(soa08Act)data(soa08Act)
Formal class 'actuarialtable' [package "lifecontingencies"] with 4 slots ..@ interest: num 0.06 ..@ x : int [1:141] 0 1 2 3 4 5 6 7 8 9 ... ..@ lx : num [1:141] 100000 97958 97826 97707 97597 ... ..@ name : chr "SOA Illustrative Life Table"
This table is a blend of Makeham's mortality law for ages 13 and above and some ad hoc values for ages 0 to 12.
The parameters for Makeham's mortality law are
1000 * mu(x) = 0.7 + 0.05 * 10^(0.04 * x)
where mu(x) is the force of mortality.
The published Illustrative Life Table just shows ages 0 to 110 but in the computing exercises of chapter 3 the authors explain that the table's age range is from 0 to 140.
Actuarial Mathematics (Second Edition), 1997, by Bowers, N.L., Gerber, H.U., Hickman, J.C., Jones, D.A. and Nesbitt, C.J.
## Not run: data(soa08Act) ## End(Not run)## Not run: data(soa08Act) ## End(Not run)
Bowers' book Illustrative Service Table
data(SoAISTdata)data(SoAISTdata)
A data frame with 41 observations on the following 6 variables.
xAttained age
lxSurviving subjects ate the beginning of each age
deathDrop outs for death cause
withdrawalDrop outs for withdrawal cause
inabilityDrop outs for inability cause
retirementDrop outs for retirement cause
It is a data frame that can be used to create a multiple decrement table
Optical recognized characters from below source with some few adjustments
Actuarial Mathematics (Second Edition), 1997, by Bowers, N.L., Gerber, H.U., Hickman, J.C., Jones, D.A. and Nesbitt, C.J.
data(SoAISTdata) head(SoAISTdata)data(SoAISTdata) head(SoAISTdata)
This table has been used by the classical book Actuarial Mathematics and by the Society of Actuaries for US professional examinations.
data(soaLt)data(soaLt)
A data.frame with 111 obs on the following 2 variables:
xa numeric vector
Ixa numeric vector
Early ages have been found elsewere since miss in the original data sources; SOA did not provide population at risk data for certain spans of age (e.g. 1-5, 6-9, 11-14 and 16-19)
Actuarial Mathematics (Second Edition), 1997, by Bowers, N.L., Gerber, H.U., Hickman, J.C., Jones, D.A. and Nesbitt, C.J.
data(soaLt) head(soaLt)data(soaLt) head(soaLt)
Uk AM AF life tables
data(AF92Lt)data(AF92Lt)
The format is: Formal class 'lifetable' [package ".GlobalEnv"] with 3 slots ..@ x : int [1:111] 0 1 2 3 4 5 6 7 8 9 ... ..@ lx : num [1:111] 100000 99924 99847 99770 99692 ... ..@ name: chr "AF92"
Probabilities for earliest (under 16) and lastest ages (over 92) have been derived using a Brass - Logit model fit on Society of Actuaries life table.
See Uk life table.
data(AF92Lt) exn(AF92Lt) data(AM92Lt) exn(AM92Lt)data(AF92Lt) exn(AF92Lt) data(AM92Lt) exn(AM92Lt)
varxn and sdxn return the variance and the standard deviation
of the future lifetime of a life aged , as the natural second-moment
companions of exn (which returns the mean).
varxn(object, x, n, type = "Kx") sdxn(object, x, n, type = "Kx")varxn(object, x, n, type = "Kx") sdxn(object, x, n, type = "Kx")
object |
A |
x |
Attained age. Defaults to |
n |
Length (in years) of a temporary period. If missing, the whole remaining lifespan is used. |
type |
Either |
For the curtate future lifetime the (temporary) variance is computed exactly from the life table as
For the complete future lifetime the variance is returned only for the whole
remaining lifespan (n missing), using the uniform-distribution-of-deaths
relation (because, under UDD,
with independent of ).
A temporary complete variance is not provided; use type = "Kx" for a
temporary period.
A numeric value: the variance (varxn) or standard deviation
(sdxn) of the (temporary) future lifetime.
Giorgio Alfredo Spedicato
Dickson, D.C.M., Hardy, M.R., Waters, H.R. (2013), Actuarial Mathematics for Life Contingent Risks, 2nd ed., Cambridge University Press.
data(soa08Act) # variance and sd of the curtate future lifetime at birth varxn(soa08Act, x = 0) sdxn(soa08Act, x = 0) # complete future lifetime: Var(T) = Var(K) + 1/12 varxn(soa08Act, x = 65, type = "complete") # temporary (20-year) curtate future lifetime at age 40 varxn(soa08Act, x = 40, n = 20)data(soa08Act) # variance and sd of the curtate future lifetime at birth varxn(soa08Act, x = 0) sdxn(soa08Act, x = 0) # complete future lifetime: Var(T) = Var(K) + 1/12 varxn(soa08Act, x = 65, type = "complete") # temporary (20-year) curtate future lifetime at age 40 varxn(soa08Act, x = 40, n = 20)