| Title: | Parametric Mortality Models, Life Tables and HMD |
|---|---|
| Description: | Fit the most popular human mortality 'laws', and construct full and abridge life tables given various input indices. A mortality law is a parametric function that describes the dying-out process of individuals in a population during a significant portion of their life spans. For a comprehensive review of the most important mortality laws see Tabeau (2001) <doi:10.1007/0-306-47562-6_1>. Practical functions for downloading data from various human mortality databases are provided as well. |
| Authors: | Marius D. Pascariu [aut, cre, cph] (ORCID: <https://orcid.org/0000-0002-2568-6489>), Vladimir Canudas-Romo [ctb] |
| Maintainer: | Marius D. Pascariu <[email protected]> |
| License: | MIT + file LICENSE |
| Version: | 2.2.2 |
| Built: | 2026-05-07 18:31:01 UTC |
| Source: | https://github.com/mpascariu/mortalitylaws |
Dataset containing altered death rates (mx), death counts (Dx)
and exposures (Ex) for the female population living in
England & Wales in four different years: 1850, 1900, 1950 and 2010.
This dataset is provided for testing purposes only.
Download the actual data free of charge from https://www.mortality.org.
Once a username and a password are created on the website, the function
ReadHMD can be used for downloading.
ahmdahmd
An object of class list of length 3.
head(ahmd$mx)head(ahmd$mx)
Returns information about the data available in the Human Mortality Database (HMD), including the range of years covered by the life tables for each country or region.
availableHMD(link = "https://www.mortality.org/Data/DataAvailability")availableHMD(link = "https://www.mortality.org/Data/DataAvailability")
link |
URL to the HMD available data. Default: "https://www.mortality.org/Data/DataAvailability" |
A tibble.
Marius D. Pascariu
availableHMD()availableHMD()
The function returns information about the parametric models that can be
called and fitted in the MortalityLaw function.
For a comprehensive review of the most important mortality laws,
Tabeau (2001) is a good starting point.
availableLaws(law = NULL)availableLaws(law = NULL)
law |
Optional. Default: |
The output is of the "availableLaws" class with the following
components:
table |
Table with mortality models and codes to be used in |
legend |
Table with details about the section of the mortality curve. |
Marius D. Pascariu
Gompertz, B. (1825). On the Nature of the Function Expressive of the Law of Human Mortality, and on a New Mode of Determining the Value of Life Contingencies. Philosophical Transactions of the Royal Society of London, 115, 513-583.
Makeham, W. (1860). On the Law of Mortality and Construction of Annuity Tables. The Assurance Magazine and Journal of the Institute of Actuaries, 8(6), 301-310. doi:10.1017/S204616580000126X
Thiele, T. (1871). On a Mathematical Formula to express the Rate of Mortality throughout the whole of Life, tested by a Series of Observations made use of by the Danish Life Insurance Company of 1871. Journal of the Institute of Actuaries and Assurance Magazine, 16(5), 313-329. doi:10.1017/S2046167400043688
Oppermann, L. H. F. (1870). On the graduation of life tables, with special application to the rate of mortality in infancy and childhood. The Insurance Record Minutes from a meeting in the Institute of Actuaries, 42.
Wittstein, T. and D. Bumsted. (1883). The Mathematical Law of Mortality. Journal of the Institute of Actuaries and Assurance Magazine, 24(3), 153-173.
Steffensen, J. (1930). Infantile mortality from an actuarial point of view. Skandinavisk Aktuarietidskrift 13, 272-286. doi:10.1080/03461238.1930.10416902
Perks, W. (1932). On Some Experiments in the Graduation of Mortality Statistics. Journal of the Institute of Actuaries, 63(1), 12-57. doi:10.1017/S0020268100046680
Harper, F. S. (1936). An actuarial study of infant mortality. Scandinavian Actuarial Journal 1936 (3-4), 234-270. doi:10.1080/03461238.1936.10405113
Weibull, W. (1951). A statistical distribution function of wide applicability. Journal of applied mechanics 103, 293-297. doi:10.1115/1.4010337
Beard, R. E. (1971). Some aspects of theories of mortality, cause of death analysis, forecasting and stochastic processes. Biological aspects of demography 999, 57-68.
Vaupel, J., Manton, K.G., and Stallard, E. (1979). The impact of heterogeneity in individual frailty on the dynamics of mortality. Demography 16(3): 439-454. doi:10.2307/2061224
Siler, W. (1979), A Competing-Risk Model for Animal Mortality. Ecology, 60: 750-757. doi:10.2307/1936612
Heligman, L., & Pollard, J. (1980). The age pattern of mortality. Journal of the Institute of Actuaries, 107(1), 49-80. doi:10.1017/S0020268100040257
Rogers A and Planck F (1983). MODEL: A General Program for Estimating Parametrized Model Schedules of Fertility, Mortality, Migration, and Marital and Labor Force Status Transitions. IIASA Working Paper. IIASA, Laxenburg, Austria: WP-83-102
Martinelle S. (1987). A generalized Perks formula for old-age mortality. Stockholm, Sweden, Statistiska Centralbyran, 1987. 55 p. (R&D Report, Research-Methods-Development, U/STM No. 38)
Carriere J.F. (1992). Parametric models for life tables. Transactions of the Society of Actuaries. Vol.44
Kostaki A. (1992). A nine-parameter version of the Heligman-Pollard formula. Mathematical Population Studies. Vol. 3 277-288. doi:10.1080/08898489209525346
Thatcher AR, Kannisto V and Vaupel JW (1998). The force of mortality at ages 80 to 120. Odense Monographs on Population Aging Vol. 5, Odense University Press, 1998. 104, 20 p. Odense, Denmark
Tabeau E. (2001). A Review of Demographic Forecasting Models for Mortality. In: Tabeau E., van den Berg Jeths A., Heathcote C. (eds) Forecasting Mortality in Developed Countries. European Studies of Population, vol 9. Springer, Dordrecht. doi:10.1007/0-306-47562-6_1
Finkelstein M. (2012) Discussing the Strehler-Mildvan model of mortality Demographic Research, Vol. 26(9), 191-206. doi:10.4054/DemRes.2012.26.9
availableLaws()availableLaws()
Returns information about the loss functions implemented for use with the
optimisation procedure in the MortalityLaw function.
availableLF()availableLF()
A list of class availableLF with the components:
table |
Table with loss functions and codes to be used in |
legend |
Table with details about the abbreviation used. |
Marius D. Pascariu
availableLF()availableLF()
Easily convert between different life table indicators (e.g., from death
rates mx to death probabilities qx, or from survivorship
lx to life expectancy ex). The function wraps
LifeTable internally, so the conversion relies on the
same constant-force-of-mortality (CFM) assumption and life-table
methodology used throughout the package.
convertFx(x, data, from, to, ...)convertFx(x, data, from, to, ...)
x |
Numeric vector of ages at the beginning of each age interval.
For a full life table, use single-year ages (e.g., |
data |
A numeric |
from |
The type of indicator supplied in |
to |
The desired output indicator. One of:
|
... |
Further arguments passed to |
This function provides a convenient interface for converting a single
mortality indicator into another, without having to call
LifeTable directly and extract the desired column.
The supported input types (from) are:
mx, qx, dx, and lx.
The supported output types (to) are:
mx, qx, dx, lx, Lx, Tx, and
ex.
There are 28 possible from-to combinations (4 inputs
7 outputs). All conversions pass through the full life-table
computation; for example, converting mx to ex will
internally compute qx, lx, dx, Lx, and
Tx in sequence.
When data is a vector, the function returns a named vector.
When data is a matrix or data.frame with multiple
columns, the function applies the conversion column-wise and returns a
matrix with the same row and column names as the input.
A numeric vector or matrix containing the converted life table indicator. If the input was a named object, the output retains those names.
Marius D. Pascariu
LifeTable for the underlying life-table construction;
LawTable for generating life tables from parametric
mortality laws.
# ---- Basic conversions ---- x <- 0:110 mx <- ahmd$mx # Convert death rates to death probabilities qx <- convertFx(x, data = mx, from = "mx", to = "qx") # Convert death rates to death distribution dx <- convertFx(x, data = mx, from = "mx", to = "dx") # Convert death rates to survivorship lx <- convertFx(x, data = mx, from = "mx", to = "lx") # ---- All 28 possible conversions ---- from <- c("mx", "qx", "dx", "lx") to <- c("mx", "qx", "dx", "lx", "Lx", "Tx", "ex") K <- expand.grid(from = from, to = to) for (i in 1:nrow(K)) { In <- as.character(K[i, "from"]) Out <- as.character(K[i, "to"]) N <- paste0(Out, "_from_", In) cat(i, " Create", N, "\n") assign(N, convertFx(x = x, data = get(In), from = In, to = Out)) }# ---- Basic conversions ---- x <- 0:110 mx <- ahmd$mx # Convert death rates to death probabilities qx <- convertFx(x, data = mx, from = "mx", to = "qx") # Convert death rates to death distribution dx <- convertFx(x, data = mx, from = "mx", to = "dx") # Convert death rates to survivorship lx <- convertFx(x, data = mx, from = "mx", to = "lx") # ---- All 28 possible conversions ---- from <- c("mx", "qx", "dx", "lx") to <- c("mx", "qx", "dx", "lx", "Lx", "Tx", "ex") K <- expand.grid(from = from, to = to) for (i in 1:nrow(K)) { In <- as.character(K[i, "from"]) Out <- as.character(K[i, "to"]) N <- paste0(Out, "_from_", In) cat(i, " Create", N, "\n") assign(N, convertFx(x = x, data = get(In), from = In, to = Out)) }
Generate a complete life table directly from the fitted parameters of a
parametric mortality model. This function evaluates the mortality law at
the given ages and passes the resulting death rates (mx) or death
probabilities (qx) to LifeTable for further
computation of all standard life-table columns (lx, dx,
Lx, Tx, ex, etc.).
LawTable(x, par, law, sex = NULL, lx0 = 1e+05, ax = NULL)LawTable(x, par, law, sex = NULL, lx0 = 1e+05, ax = NULL)
x |
Numeric vector of ages at the beginning of each age interval.
For a full life table, use single-year ages (e.g., |
par |
The parameters of the mortality model. Can be:
|
law |
The name of the mortality law to be used (e.g., |
sex |
Sex of the population. Options are |
lx0 |
Radix, the starting population (or probability scale) at
age 0. Default is |
ax |
Numeric vector representing the average number of person-years
lived in the age interval by those who die in that interval. If
|
This function is designed to work with models that have been fitted
externally (e.g., via MortalityLaw or by hand). The
par argument must contain the estimated coefficients of the
mortality law, and law must be one of the valid codes listed by
availableLaws.
Important caveat: age scaling during fitting
Several mortality laws (e.g., Gompertz, Makeham) internally scale
the age vector during optimisation to ensure numerical stability. If the
model was fitted using MortalityLaw over an age range [a, b],
the published coefficients correspond to the scaled ages, not the
original ages. Consequently, LawTable will only produce valid life
tables for ages (the lower bound of the fitting range).
Attempting to use the same coefficients at younger ages will yield
incorrect results (e.g., life expectancy at age 25 will equal that at
age 45).
To determine which models apply age scaling, run:
A <- availableLaws()$table
A[, c("CODE", "SCALE_X")]
Models with SCALE_X = TRUE rescale the age vector internally. When
using LawTable with such a model, make sure the x argument
starts from the same lower age bound used during fitting.
For models that do not scale (e.g., Heligman-Pollard "HP"),
this limitation does not apply, and LawTable can be used for any
age range.
An object of class "LifeTable" containing the following
components:
lt |
A |
call |
The matched function call. |
process_date |
Timestamp of when the life table was computed. |
Marius D. Pascariu
LifeTable for constructing life tables from raw mortality
data;
MortalityLaw for fitting parametric mortality models;
availableLaws for the list of implemented laws and their
scaling behaviour.
# Example 1 --- Makeham --- multiple life tables from a matrix of parameters x1 <- 45:100 L1 <- "makeham" C1 <- matrix( c(0.00717, 0.07789, 0.00363, 0.01018, 0.07229, 0.00001, 0.00298, 0.09585, 0.00002, 0.00067, 0.11572, 0.00078), nrow = 4, dimnames = list(1:4, c("A", "B", "C")) ) LawTable(x = x1, par = C1, law = L1) # ---- Important note on age scaling ---- # The Makeham model applies internal age scaling during fitting. # If the coefficients above were estimated over ages 45-100, the life # table produced by LawTable is valid only from age 45 onward. # ---- Example 1B: correct usage ---- LawTable(x = 45:100, par = c(0.00717, 0.07789, 0.00363), law = L1) # ---- Example 1C: incorrect usage ---- # The code below uses the same coefficients but starts at age 25. # Because the model was fitted on scaled ages (starting at 45), # the life table at age 25 will be meaningless (e.g., e25 equals e45). ## Not run: LawTable(x = 25:100, par = c(0.00717, 0.07789, 0.00363), law = L1) ## End(Not run) # ---- How to check which laws apply scaling ---- A <- availableLaws()$table A[, c("CODE", "SCALE_X")] # Example 2 --- Heligman-Pollard (no scaling) --- x2 <- 0:110 L2 <- "HP" C2 <- c(0.00223, 0.01461, 0.12292, 0.00091, 2.75201, 29.01877, 0.00002, 1.11411) LawTable(x = x2, par = C2, law = L2) # Because "HP" does NOT scale the age vector, the output is valid for # any starting age. Compare: LawTable(x = 3:110, par = C2, law = L2) # Note that e3 = 70.31 in both tables, confirming consistency.# Example 1 --- Makeham --- multiple life tables from a matrix of parameters x1 <- 45:100 L1 <- "makeham" C1 <- matrix( c(0.00717, 0.07789, 0.00363, 0.01018, 0.07229, 0.00001, 0.00298, 0.09585, 0.00002, 0.00067, 0.11572, 0.00078), nrow = 4, dimnames = list(1:4, c("A", "B", "C")) ) LawTable(x = x1, par = C1, law = L1) # ---- Important note on age scaling ---- # The Makeham model applies internal age scaling during fitting. # If the coefficients above were estimated over ages 45-100, the life # table produced by LawTable is valid only from age 45 onward. # ---- Example 1B: correct usage ---- LawTable(x = 45:100, par = c(0.00717, 0.07789, 0.00363), law = L1) # ---- Example 1C: incorrect usage ---- # The code below uses the same coefficients but starts at age 25. # Because the model was fitted on scaled ages (starting at 45), # the life table at age 25 will be meaningless (e.g., e25 equals e45). ## Not run: LawTable(x = 25:100, par = c(0.00717, 0.07789, 0.00363), law = L1) ## End(Not run) # ---- How to check which laws apply scaling ---- A <- availableLaws()$table A[, c("CODE", "SCALE_X")] # Example 2 --- Heligman-Pollard (no scaling) --- x2 <- 0:110 L2 <- "HP" C2 <- c(0.00223, 0.01461, 0.12292, 0.00091, 2.75201, 29.01877, 0.00002, 1.11411) LawTable(x = x2, par = C2, law = L2) # Because "HP" does NOT scale the age vector, the output is valid for # any starting age. Compare: LawTable(x = 3:110, par = C2, law = L2) # Note that e3 = 70.31 in both tables, confirming consistency.
Construct either a full (single-year age intervals) or an abridged (wider age intervals) life table from a variety of input data types. The function accepts:
Death counts and mid-interval population estimates (Dx, Ex)
Age-specific death rates (mx)
Death probabilities (qx)
Survivorship curve (lx)
Distribution of deaths (dx)
Only one of these input options needs to be provided; the others
are ignored if present. The input can be a numeric vector,
matrix, or data.frame. When a matrix or
data.frame with multiple columns is supplied, the function
computes one life table per column.
LifeTable(x, Dx = NULL, Ex = NULL, mx = NULL, qx = NULL, lx = NULL, dx = NULL, sex = NULL, lx0 = 1e5, ax = NULL)LifeTable(x, Dx = NULL, Ex = NULL, mx = NULL, qx = NULL, lx = NULL, dx = NULL, sex = NULL, lx0 = 1e5, ax = NULL)
x |
Numeric vector of ages at the beginning of each age interval.
For a full life table, use single-year ages (e.g., |
Dx |
Death counts. Each element represents the total number of
deaths during the calendar year to persons aged |
Ex |
Exposure-to-risk in the period. This is usually approximated
by the mid-year population aged |
mx |
Age-specific death rate in the age interval |
qx |
Probability of dying within the age interval |
lx |
Probability of surviving to exact age |
dx |
Number of deaths in the life-table population occurring in
the age interval |
sex |
Sex of the population. Options are |
lx0 |
Radix, the starting population (or probability scale) at
age 0. Default is |
ax |
Numeric vector representing the average number of person-years
lived in the age interval by those who die in that interval. If
|
A life table (also called a mortality table or actuarial table) summarises the mortality experience of a population. For each age (or age interval) it reports:
Death rates (mx) and death probabilities (qx)
Survivorship (lx)
Distribution of deaths (dx)
Person-years lived (Lx) and total person-years remaining
(Tx)
Life expectancy (ex)
The life table is constructed sequentially: from the input data the
function derives mx, then qx, then lx, dx,
Lx, Tx, and finally ex. The constant-force-of-mortality
(CFM) assumption is used to convert between mx and qx.
If the sex argument is supplied, the first two values of the
ax column are adjusted using the Coale-Demeny method, which
accounts for the different infant mortality patterns between males
and females.
An object of class "LifeTable" containing the following
components:
lt |
A |
call |
The matched function call. |
process_date |
Timestamp of when the life table was computed. |
Marius D. Pascariu
LawTable for generating life tables from a fitted
parametric mortality law;
convertFx for converting between mortality measures.
# Example 1 --- Full life tables with different inputs ------------ y <- 1900 x <- as.numeric(rownames(ahmd$mx)) Dx <- ahmd$Dx[, paste(y)] Ex <- ahmd$Ex[, paste(y)] LT1 <- LifeTable(x, Dx = Dx, Ex = Ex) LT2 <- LifeTable(x, mx = LT1$lt$mx) LT3 <- LifeTable(x, qx = LT1$lt$qx) LT4 <- LifeTable(x, lx = LT1$lt$lx) LT5 <- LifeTable(x, dx = LT1$lt$dx) LT1 LT5 ls(LT5) # Example 2 --- Compute multiple life tables at once ------------ LTs <- LifeTable(x, mx = ahmd$mx) LTs # A warning is printed if the input contains missing values. # Some of the missing values can be handled automatically. # Example 3 --- Abridged life table ----------------------------- x <- c(0, 1, seq(5, 110, by = 5)) mx <- c(.053, .005, .001, .0012, .0018, .002, .003, .004, .004, .005, .006, .0093, .0129, .019, .031, .049, .084, .129, .180, .2354, .3085, .390, .478, .551) LT6 <- LifeTable(x, mx = mx, sex = "female") LT6 # Example 4 --- Abridged life table using a custom 'ax' -------- # This example reuses the ages (x) and death rates (mx) from Example 3. # Note that 'ax' must have the same length as 'x', otherwise an error # will be returned. my_ax <- c(0.1, 1.5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1) LT7 <- LifeTable(x = x, mx = mx, ax = my_ax)# Example 1 --- Full life tables with different inputs ------------ y <- 1900 x <- as.numeric(rownames(ahmd$mx)) Dx <- ahmd$Dx[, paste(y)] Ex <- ahmd$Ex[, paste(y)] LT1 <- LifeTable(x, Dx = Dx, Ex = Ex) LT2 <- LifeTable(x, mx = LT1$lt$mx) LT3 <- LifeTable(x, qx = LT1$lt$qx) LT4 <- LifeTable(x, lx = LT1$lt$lx) LT5 <- LifeTable(x, dx = LT1$lt$dx) LT1 LT5 ls(LT5) # Example 2 --- Compute multiple life tables at once ------------ LTs <- LifeTable(x, mx = ahmd$mx) LTs # A warning is printed if the input contains missing values. # Some of the missing values can be handled automatically. # Example 3 --- Abridged life table ----------------------------- x <- c(0, 1, seq(5, 110, by = 5)) mx <- c(.053, .005, .001, .0012, .0018, .002, .003, .004, .004, .005, .006, .0093, .0129, .019, .031, .049, .084, .129, .180, .2354, .3085, .390, .478, .551) LT6 <- LifeTable(x, mx = mx, sex = "female") LT6 # Example 4 --- Abridged life table using a custom 'ax' -------- # This example reuses the ages (x) and death rates (mx) from Example 3. # Note that 'ax' must have the same length as 'x', otherwise an error # will be returned. my_ax <- c(0.1, 1.5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1) LT7 <- LifeTable(x = x, mx = mx, ax = my_ax)
Fit parametric mortality models given a set of input data. The data can be
supplied as death counts and mid-interval population estimates
(Dx, Ex), age-specific death rates (mx), or death
probabilities (qx). Use the law argument to specify the
model to be fitted. Over 30 parametric models are currently implemented;
run availableLaws to see the full list. Models can be fitted
using maximum likelihood or by optimising a loss function. See the
availableLF function for the implemented options.
MortalityLaw(x, Dx = NULL, Ex = NULL, mx = NULL, qx = NULL, law = NULL, opt.method = "LF2", parS = NULL, fit.this.x = x, custom.law = NULL, show = FALSE, ...)MortalityLaw(x, Dx = NULL, Ex = NULL, mx = NULL, qx = NULL, law = NULL, opt.method = "LF2", parS = NULL, fit.this.x = x, custom.law = NULL, show = FALSE, ...)
x |
Numeric vector of ages at the beginning of each age interval.
For a full life table, use single-year ages (e.g., |
Dx |
Death counts. Each element represents the total number of
deaths during the calendar year to persons aged |
Ex |
Exposure-to-risk in the period. This is usually approximated
by the mid-year population aged |
mx |
Age-specific death rate in the age interval |
qx |
Probability of dying within the age interval |
law |
The name of the mortality law to be used (e.g., |
opt.method |
The function to optimise. Available options:
See |
parS |
Optional starting parameter values for the optimisation. If
|
fit.this.x |
A subset of |
custom.law |
A user-defined function for fitting a model not included
in the package. The function must accept arguments |
show |
Logical. If |
... |
Additional arguments passed to or from other methods. |
Optimisation: The PORT routines (via nlminb) are used
for unconstrained and box-constrained optimisation. Parameters are estimated
on the log scale to ensure positivity, and the routine is set to allow up to
5000 iterations. When the optimisation method is "poissonL" or
"binomialL", the AIC, BIC and log-likelihood are computed from the
likelihood. Otherwise these are set to NaN.
Scaling of the age vector: For models that cover only a portion
of the lifespan (e.g., adult or old-age mortality), the age vector x
is automatically re-scaled as x = x - min(x) + 1 before fitting.
This transformation improves numerical stability and helps the optimisation
algorithm converge, especially when the starting age is far from zero.
Models that apply this scaling are flagged with SCALE_X = TRUE in
the table returned by availableLaws. When using
predict.MortalityLaw or LawTable with such
models, the same scaling is applied internally, so predictions remain
consistent with the fitted coefficients.
Handling matrix input: If Dx, Ex, mx or
qx are provided as matrices (with one column per population or
time period), the function iterates over the columns and fits a separate
model to each, returning a collection of results.
An object of class "MortalityLaw", which is a list with the following
components:
input |
List of input arguments, stored for reproducibility. |
info |
Model information (name, formula, date of fitting). |
coefficients |
Estimated parameters of the mortality law. A named vector for a single fit, or a matrix for multiple fits. |
fitted.values |
Fitted hazard rates (or death probabilities) evaluated
at the input ages |
residuals |
Deviance residuals, computed as observed minus fitted values. |
goodness.of.fit |
List or matrix of goodness-of-fit measures: AIC, BIC and log-likelihood (available only for likelihood-based methods). |
opt.diagnosis |
Object returned by the optimisation routine, useful for checking convergence. |
df |
Number of parameters and residual degrees of freedom. |
deviance |
Sum of squared log-residuals, used as a deviance measure. |
Marius D. Pascariu
availableLaws for a list of all implemented models;
availableLF for loss function details;
LifeTable for life table construction;
ReadHMD for downloading data from the Human Mortality Database.
# Example 1: Fitting the Makeham model -------------------------- x <- 45:75 Dx <- ahmd$Dx[paste(x), "1950"] Ex <- ahmd$Ex[paste(x), "1950"] M1 <- MortalityLaw(x = x, Dx = Dx, Ex = Ex, law = 'makeham') M1 ls(M1) coef(M1) summary(M1) fitted(M1) predict(M1, x = 45:95) plot(M1) # Example 2: -------------------------- # We can fit the same model using a different data format # and a different optimization method. x <- 45:75 mx <- ahmd$mx[paste(x), ] M2 <- MortalityLaw(x = x, mx = mx, law = 'makeham', opt.method = 'LF1') M2 fitted(M2) predict(M2, x = 55:90) # Example 3: -------------------------- # Now let's fit a mortality law that is not defined # in the package, say a reparameterized Gompertz in # terms of modal age at death # hx = b*exp(b*(x-m)) (here b and m are the parameters to be estimated) # A function with 'x' and 'par' as input has to be defined, which returns # at least an object called 'hx' (hazard rate). my_gompertz <- function(x, par = c(b = 0.13, M = 45)){ hx <- with(as.list(par), b*exp(b*(x - M)) ) return(as.list(environment())) } M3 <- MortalityLaw(x = x, Dx = Dx, Ex = Ex, custom.law = my_gompertz) summary(M3) # predict M3 for different ages predict(M3, x = 85:130) # Example 4: -------------------------- # Fit Heligman-Pollard model for a single # year in the dataset between age 0 and 100 and build a life table. x <- 0:100 mx <- ahmd$mx[paste(x), "1950"] # select data M4 <- MortalityLaw(x = x, mx = mx, law = 'HP', opt.method = 'LF2') M4 plot(M4) LifeTable(x = x, qx = fitted(M4))# Example 1: Fitting the Makeham model -------------------------- x <- 45:75 Dx <- ahmd$Dx[paste(x), "1950"] Ex <- ahmd$Ex[paste(x), "1950"] M1 <- MortalityLaw(x = x, Dx = Dx, Ex = Ex, law = 'makeham') M1 ls(M1) coef(M1) summary(M1) fitted(M1) predict(M1, x = 45:95) plot(M1) # Example 2: -------------------------- # We can fit the same model using a different data format # and a different optimization method. x <- 45:75 mx <- ahmd$mx[paste(x), ] M2 <- MortalityLaw(x = x, mx = mx, law = 'makeham', opt.method = 'LF1') M2 fitted(M2) predict(M2, x = 55:90) # Example 3: -------------------------- # Now let's fit a mortality law that is not defined # in the package, say a reparameterized Gompertz in # terms of modal age at death # hx = b*exp(b*(x-m)) (here b and m are the parameters to be estimated) # A function with 'x' and 'par' as input has to be defined, which returns # at least an object called 'hx' (hazard rate). my_gompertz <- function(x, par = c(b = 0.13, M = 45)){ hx <- with(as.list(par), b*exp(b*(x - M)) ) return(as.list(environment())) } M3 <- MortalityLaw(x = x, Dx = Dx, Ex = Ex, custom.law = my_gompertz) summary(M3) # predict M3 for different ages predict(M3, x = 85:130) # Example 4: -------------------------- # Fit Heligman-Pollard model for a single # year in the dataset between age 0 and 100 and build a life table. x <- 0:100 mx <- ahmd$mx[paste(x), "1950"] # select data M4 <- MortalityLaw(x = x, mx = mx, law = 'HP', opt.method = 'LF2') M4 plot(M4) LifeTable(x = x, qx = fitted(M4))
Fit the most popular human mortality 'laws', and construct full and abridge life tables given various input indices. A mortality law is a parametric function that describes the dying-out process of individuals in a population during a significant portion of their life spans. For a comprehensive review of the most important mortality laws see Tabeau (2001) doi:10.1007/0-306-47562-6_1. Practical functions for downloading data from various human mortality databases are provided as well.
To learn more about the package, start with the vignettes:
browseVignettes(package = "MortalityLaws")
Maintainer: Marius D. Pascariu [email protected] (ORCID) [copyright holder]
Other contributors:
Vladimir Canudas-Romo [contributor]
Useful links:
Report bugs at https://github.com/mpascariu/MortalityLaws/issues
Plot Method for MortalityLaw
## S3 method for class 'MortalityLaw' plot(x, ...)## S3 method for class 'MortalityLaw' plot(x, ...)
x |
An object of class |
... |
Further arguments passed to graphical methods, such as
parameters (see |
A plot is generated as a side effect.
Marius D. Pascariu
# See complete example in MortalityLaw help page# See complete example in MortalityLaw help page
Predict function for MortalityLaw
## S3 method for class 'MortalityLaw' predict(object, x, ...)## S3 method for class 'MortalityLaw' predict(object, x, ...)
object |
An object of class |
x |
Vector of ages to be considered in prediction |
... |
Additional arguments affecting the predictions produced. |
A vector of predicted hazard rates
Marius D. Pascariu
# Extrapolate old-age mortality with the Kannisto model # Fit ages 80-94 and extrapolate up to 120. Mx <- ahmd$mx[paste(80:94), "1950"] M1 <- MortalityLaw(x = 80:94, mx = Mx, law = 'kannisto') fitted(M1) predict(M1, x = 80:120) # See more examples in MortalityLaw function help page.# Extrapolate old-age mortality with the Kannisto model # Fit ages 80-94 and extrapolate up to 120. Mx <- ahmd$mx[paste(80:94), "1950"] M1 <- MortalityLaw(x = 80:94, mx = Mx, law = 'kannisto') fitted(M1) predict(M1, x = 80:120) # See more examples in MortalityLaw function help page.
Download detailed mortality and population data for different provinces and territories in Australia, in a single object from the Australian Human Mortality Database.
ReadAHMD(what, regions = NULL, interval = "1x1", save = FALSE, show = TRUE)ReadAHMD(what, regions = NULL, interval = "1x1", save = FALSE, show = TRUE)
what |
What type of data are you looking for? The following options might be available for some or all the countries and regions:
|
regions |
Specify the region specific data you want to download by adding the AHMD region code/s. Options:
|
interval |
Datasets are given in various age and time formats based on which the records are aggregated. Interval options:
|
save |
Do you want to save a copy of the dataset on your local machine?
Logical. Default: |
show |
Choose whether to display a progress bar. Logical.
Default: |
(Description taken from the AHMD website).
The Australian Human Mortality Database (AHMD) was created to provide detailed Australian mortality and population data to researchers, students, journalists, policy analysts, and others interested in the history of human longevity. The project is an achievement of the Mortality, Ageing & Health research team in the ANU School of Demography under the supervision of Associate Professor Vladimir Canudas-Romo, in collaboration with demographers at the Max Plank Institute for Demographic Research (Rostock, Germany) and the Department of Demography, University of California at Berkeley.
The AHMD is a "satellite" of the Human Mortality Database (HMD), an international database which currently holds detailed data for multiple countries or regions. Consequently, the AHMD's underlying methodology corresponds to the one used for the HMD.
The AHMD gathers all required data (deaths counts, births counts, population size, exposure-to-risk, death rates) to compute life tables for Australia, its states and its territories. One of the great advantages of the database is to include data that is validated and corrected, when required, and rendered comparable, if possible, for the period ranging from 1971 thru 2016. For comparison purposes, various life tables published by governmental organizations are also available for download in PDF format.
A ReadAHMD object that contains:
input |
List with the input values; |
data |
Data downloaded from AHMD; |
download.date |
Time stamp; |
years |
Numerical vector with the years covered in the data; |
ages |
Numerical vector with ages covered in the data. |
Marius D. Pascariu
# Download demographic data for Australian Capital Territory and # Tasmania regions in 5x1 format # Death counts. We don't want to export data outside R. AHMD_Dx <- ReadAHMD(what = "Dx", regions = c('ACT', 'TAS'), interval = "5x1", save = FALSE) AHMD_Dx # Download life tables for female population in all the states and export data. LTF <- ReadAHMD(what = "LT_f", interval = "5x1", save = FALSE) LTF# Download demographic data for Australian Capital Territory and # Tasmania regions in 5x1 format # Death counts. We don't want to export data outside R. AHMD_Dx <- ReadAHMD(what = "Dx", regions = c('ACT', 'TAS'), interval = "5x1", save = FALSE) AHMD_Dx # Download life tables for female population in all the states and export data. LTF <- ReadAHMD(what = "LT_f", interval = "5x1", save = FALSE) LTF
Download detailed mortality and population data for different provinces and territories in Canada, in a single object from the Canadian Human Mortality Database.
ReadCHMD(what, regions = NULL, interval = "1x1", save = FALSE, show = TRUE)ReadCHMD(what, regions = NULL, interval = "1x1", save = FALSE, show = TRUE)
what |
What type of data are you looking for? The following options are available:
|
regions |
Specify the region specific data you want to download by adding the CHMD region code/s. Options:
|
interval |
Datasets are given in various age and time formats based on which the records are aggregated. Interval options:
|
save |
Do you want to save a copy of the dataset on your local machine?
Logical. Default: |
show |
Choose whether to display a progress bar. Logical.
Default: |
(Description taken from the CHMD website).
The Canadian Human Mortality Database (CHMD) was created to provide detailed Canadian mortality and population data to researchers, students, journalists, policy analysts, and others interested in the history of human longevity. The project is an achievement of the Mortality and Longevity research team at the Department of Demography, Universite de Montreal, under the supervision of Professor Robert Bourbeau, in collaboration with demographers at the Max Plank Institute for Demographic Research (Rostock, Germany) and the Department of Demography, University of California at Berkeley. Nadine Ouellette, researcher at the Institut national d'etudes demographiques in Paris and member of the Mortality and Longevity research team at the Universite de Montreal, is in charge of computing all CHMD life tables and updating the CHMD web site.
The CHMD is a "satellite" of the Human Mortality Database (HMD), an international database which currently holds detailed data for multiple countries or regions. Consequently, the CHMD's underlying methodology corresponds to the one used for the HMD.
The CHMD gathers all required data (deaths counts, births counts, population size, exposure-to-risk, death rates) to compute life tables for Canada, its provinces and its territories. One of the great advantages of the database is to include data that is validated and corrected, when required, and rendered comparable, if possible, for the period ranging from 1921 thru 2011. For comparison purposes, various life tables published by governmental organizations are also available for download in PDF format.
A ReadCHMD object that contains:
input |
List with the input values; |
data |
Data downloaded from CHMD; |
download.date |
Time stamp; |
years |
Numerical vector with the years covered in the data; |
ages |
Numerical vector with ages covered in the data. |
Marius D. Pascariu
# Download demographic data for Quebec and Saskatchewan regions in 1x1 format # Death counts. We don't want to export data outside R. CHMD_Dx <- ReadCHMD(what = "Dx", regions = c('QUE', 'SAS'), interval = "1x1", save = FALSE) # Download life tables for female population. To export data use save = TRUE. LTF <- ReadCHMD(what = "LT_f", regions = c('QUE', 'SAS'), interval = "1x1", save = FALSE)# Download demographic data for Quebec and Saskatchewan regions in 1x1 format # Death counts. We don't want to export data outside R. CHMD_Dx <- ReadCHMD(what = "Dx", regions = c('QUE', 'SAS'), interval = "1x1", save = FALSE) # Download life tables for female population. To export data use save = TRUE. LTF <- ReadCHMD(what = "LT_f", regions = c('QUE', 'SAS'), interval = "1x1", save = FALSE)
Download detailed mortality and population data for different countries and regions in a single object from the Human Mortality Database.
ReadHMD( what, countries = NULL, interval = "1x1", username, password, save = FALSE, show = TRUE )ReadHMD( what, countries = NULL, interval = "1x1", username, password, save = FALSE, show = TRUE )
what |
What type of data are you looking for? The following options might be available for some or all the countries and regions:
|
countries |
Specify the country data you want to download by adding the
HMD country code/s. Options:
|
interval |
Datasets are given in various age and time formats based on which the records are aggregated. Interval options:
|
username |
Your HMD username. If you don't have one you can sign up for free on the Human Mortality Database website. |
password |
Your HMD password. |
save |
Do you want to save a copy of the dataset on your local machine?
Logical. Default: |
show |
Choose whether to display a progress bar. Logical.
Default: |
The Human Mortality Database (HMD) was created to provide detailed mortality and population data to researchers, students, journalists, policy analysts, and others interested in the history of human longevity. The project began as an outgrowth of earlier projects in the Department of Demography at the University of California, Berkeley, USA, and at the Max Planck Institute for Demographic Research in Rostock, Germany (see history). It is the work of two teams of researchers in the USA and Germany (see research teams), with the help of financial backers and scientific collaborators from around the world (see acknowledgements). The Center on the Economics and Development of Aging (CEDA) French Institute for Demographic Studies (INED) has also supported the further development of the database in recent years.
A ReadHMD object that contains:
input |
List with the input values (except the password). |
data |
Data downloaded from HMD. |
download.date |
Time stamp. |
years |
Numerical vector with the years covered in the data. |
ages |
Numerical vector with ages covered in the data. |
Marius D. Pascariu
## Not run: # Download demographic data for 3 countries in 1x1 format age_int <- 1 # age interval: 1,5 year_int <- 1 # year interval: 1,5,10 interval <- paste0(age_int, "x", year_int) # --> 1x1 # And the 3 countries: Sweden Denmark and USA. We have to use the HMD codes cntr <- c('SWE', 'DNK', 'USA') # Download death counts. We don't want to export data outside R. HMD_Dx <- ReadHMD(what = "Dx", countries = cntr, interval = interval, username = "[email protected]", password = "password", save = FALSE) HMD_Dx # Download life tables for female population and export data. LTF <- ReadHMD(what = "LT_f", countries = cntr, interval = interval, username = "[email protected]", password = "password", save = TRUE) LTF ## End(Not run)## Not run: # Download demographic data for 3 countries in 1x1 format age_int <- 1 # age interval: 1,5 year_int <- 1 # year interval: 1,5,10 interval <- paste0(age_int, "x", year_int) # --> 1x1 # And the 3 countries: Sweden Denmark and USA. We have to use the HMD codes cntr <- c('SWE', 'DNK', 'USA') # Download death counts. We don't want to export data outside R. HMD_Dx <- ReadHMD(what = "Dx", countries = cntr, interval = interval, username = "[email protected]", password = "password", save = FALSE) HMD_Dx # Download life tables for female population and export data. LTF <- ReadHMD(what = "LT_f", countries = cntr, interval = interval, username = "[email protected]", password = "password", save = TRUE) LTF ## End(Not run)
Download detailed mortality and population data of the 47 prefectures in Japan, in a single object. The source of data is the Japanese Mortality Database.
ReadJMD(what, regions = NULL, interval = "1x1", save = FALSE, show = TRUE)ReadJMD(what, regions = NULL, interval = "1x1", save = FALSE, show = TRUE)
what |
What type of data are you looking for? The following options might be available for some or all the countries and regions:
|
regions |
Specify the region specific data you want to download by
adding the JMD region code/s. Options: |
interval |
Datasets are given in various age and time formats based on which the records are aggregated. Interval options:
|
save |
Do you want to save a copy of the dataset on your local machine?
Logical. Default: |
show |
Choose whether to display a progress bar. Logical.
Default: |
(Description taken from the JMD website).
The Japanese Mortality Database is a comprehensively-reorganized mortality database that is optimized for mortality research and consistent with the Human Mortality Database. This database is provided as a part of the research project "Demographic research on the causes and the socio-economic consequence of longetivity extension in Japan" (2011-2013), "Demographic research on longevity extension, population aging, and their effects on the social security and socio-economic structures in Japan" (2014-2016), and "Comprehensive research from a demographic viewpoint on the longevity revolution" (2017-2019) at the National Institute of Population and Social Security Research.
The Japanese Mortality Database is designed to provide the life tables to all the people who are interested in Japanese mortality including domestic and foreign mortality researchers for the purpose of mortality research. Especially because we have structured it to conform with the HMD, our database is suitable for international comparison, we put emphasis on the compatibility with the HMD more than our country's particular characteristics. Therefore, the life tables by JMD do not necessarily exhibit the same values as ones by the official life tables prepared and released by the Statistics and Information Department, Minister's Secretariat, Ministry of Health, Labor and Welfare according to the different base population or the methods for estimating the tables. When doing things other than mortality research, if life table that statistically displays our country's mortality situation is necessary, please use the official life table that has been prepared by the Statistics and Information Department, Minister's Secretariat, Ministry of Health, Labor and Welfare.
At the present time, we offer the data for All Japan and by prefecture. The project team is studying the methodology for estimating life tables along with data preparation. Therefore, the data may be updated when a new methodology is adopted. Please refer to "Methods" for further information.
A ReadJMD object that contains:
input |
List with the input values; |
data |
Data downloaded from JMD; |
download.date |
Time stamp; |
years |
Numerical vector with the years covered in the data; |
ages |
Numerical vector with ages covered in the data. |
Marius D. Pascariu
# Download demographic data for Fukushima and Tokyo regions in 1x1 format # Death counts. We don't want to export data outside R. JMD_Dx <- ReadJMD(what = "Dx", regions = c('Fukushima', 'Tokyo'), interval = "1x1", save = FALSE) JMD_Dx # Download life tables for female population in all the states and export data. LTF <- ReadJMD(what = "LT_f", interval = "5x5", save = FALSE) LTF# Download demographic data for Fukushima and Tokyo regions in 1x1 format # Death counts. We don't want to export data outside R. JMD_Dx <- ReadJMD(what = "Dx", regions = c('Fukushima', 'Tokyo'), interval = "1x1", save = FALSE) JMD_Dx # Download life tables for female population in all the states and export data. LTF <- ReadJMD(what = "LT_f", interval = "5x5", save = FALSE) LTF