Skip to contents

Computes the APV of a discrete annuity contingent on multiple independent lives using compact actuarial notation.

Usage

annuity_multi(
  lt,
  ages,
  i,
  i_type = "effective",
  m = 1L,
  n = NULL,
  h = 0L,
  k = 1L,
  annuity = c("cohort", "reversionary"),
  cohort = c("first", "last"),
  alpha = NULL,
  timing = c("immediate", "due"),
  woolhouse = c("none", "first", "second"),
  frac = c("UDD", "CF", "CML", "Balducci")
)

Arguments

lt

A life table object (data frame or tibble) with column x and at least one of lx, px, or qx. For different mortality assumptions by life, pass a list of life tables of the same length as ages, for example list(lt_male, lt_female).

ages

Integer vector of actuarial ages for the lives at issue. Must have length 1, 2, or 3.

i

Numeric scalar. Annual interest-rate input.

i_type

Character string indicating the interest-rate type. Allowed values are "effective", "nominal_interest", "nominal_discount", and "force".

m

Positive integer. Conversion frequency for nominal rates. Ignored for i_type = "effective" and i_type = "force". In tidyactuarial, m is reserved for interest conversion frequency, not deferment.

n

Integer term in years after deferment. If NULL, runs to the end of the available table horizon, conservatively based on the smallest omega across life tables.

h

Integer deferment period in years.

k

Integer payments per year. If k > 1, Woolhouse approximations may be applied.

annuity

Type of annuity logic: "cohort" uses the status defined in cohort; "reversionary" uses the \(\alpha\) fractional reduction.

cohort

Survival status: "first" for joint-life, paying while all lives are alive, or "last" for last-survivor, paying while at least one life remains alive. Used only when annuity = "cohort".

alpha

Reversionary fraction, typically \(0 \le \alpha \le 1\). Used only when annuity = "reversionary". Note: alpha = 0 matches joint-life; alpha = 1 matches last-survivor.

timing

"immediate" or "due".

woolhouse

"none", "first", or "second".

frac

Fractional-age assumption for exact payments: "UDD" (default), "CF", "CML" (alias of CF), or "Balducci".

Value

A single numeric value representing the APV.

Details

This implementation supports up to three lives, which covers the most common practical multi-life arrangements.

Supports status-based annuities (joint-life / last-survivor) and a joint-and-survivor style annuity (`"reversionary"`) that pays 1 while all lives are alive and then pays a fraction \(\alpha\) while at least one life remains alive.

This function follows the compact actuarial notation used throughout tidyactuarial: i is the interest rate, i_type is the interest-rate type, m is the conversion frequency for nominal rates, n is the term, h is the deferment period, and k is the payment frequency.

Under the assumption of independent future lifetimes, the survival probability for the status is calculated as:

  • Joint-life (first-death): \({}_t p_{x_1 x_2 \dots x_n} = \prod_{j=1}^n {}_t p_{x_j}\)

  • Last-survivor: \({}_t p_{\overline{x_1 x_2 \dots x_n}} = 1 - \prod_{j=1}^n (1 - {}_t p_{x_j})\)

For annuity = "reversionary", the APV is a weighted combination of the two statuses: $$APV = APV(\text{joint-life}) + \alpha [APV(\text{last-survivor}) - APV(\text{joint-life})].$$

All values are measured at issue, conditional on the stated lives being alive at issue. Ages identify lives within one policy, not policy scenarios. A k-thly payment is \(1/k\) of an annual unit: exact valuation sums \(F(h+j/k)/k\), with \(F(t)=e^{-\delta t}w(t)\) and the expected payment weight \(w(t)\) defined above. Due uses \(j=0,\ldots,nk-1\); immediate uses \(j=1,\ldots,nk\). The historical name "reversionary" means joint-and-survivor payments; it does not mean payments only after a death.

For k > 1, woolhouse = "none" uses the actual fractional payment grid. First-order Woolhouse subtracts \((1-1/k)[F(h)-F(h+n)]/2\) from the annual due value. Second-order also subtracts \((1-1/k^2)[(\delta+\eta_h)F(h)- (\delta+\eta_{h+n})F(h+n)]/12\). Here \(\eta_t=-\log(w(t+1)/w(t))\) is an annual forward estimate of the logarithmic decay of the payment weight, not an exact instantaneous force. Positive supported weights at both borders and the following year are required for second-order approximation. This is a smoothness approximation, not exact fractional valuation under frac; negative approximations produce a warning. Immediate subtracts \([F(h)-F(h+n)]/k\) from due. Exact valuation requires consecutive annual ages and retains the documented conservative common-age horizon; it does not extrapolate unobserved lives.

Examples

lt <- data.frame(
  x = 60:90,
  lx = seq(100000, 0, length.out = 31)
)

annuity_multi(
  lt = lt,
  ages = c(60, 62),
  i = 0.05,
  n = 5,
  cohort = "first",
  timing = "due"
)
#> [1] 3.979153

# Half-yearly payments, each equal to half an annual unit, under UDD
annuity_multi(lt, ages = c(60, 62), i = 0.05, n = 5, k = 2,
              timing = "due", frac = "UDD")
#> [1] 3.860308

annuity_multi(
  lt = lt,
  ages = c(60, 62),
  i = 0.05,
  n = 5,
  cohort = "last",
  timing = "due"
)
#> [1] 4.515572