Computes terminal benefit reserves at selected integer policy durations by the prospective or recursive method.
Usage
reserve_x(
lt,
x,
i,
i_type = "effective",
m = 1L,
type = c("whole", "term", "endowment"),
n = Inf,
h = 0L,
benefit = 1,
P = NULL,
k = 1L,
frac = c("UDD", "CF", "CML", "Balducci"),
timing = c("due", "immediate"),
premium_start = c("issue", "deferred"),
n_prem = NULL,
woolhouse = c("none", "first", "second"),
t = NULL,
method = c("prospective", "recursive"),
output = c("summary", "value", "audit", "table"),
tidy = NULL,
check = TRUE,
...
)Arguments
- lt
A life table containing columns
xandlx, or a single-life contract created withlife_contract.- x
Integer actuarial age at issue. Optional for a life contract.
- i
Numeric scalar. Annual interest-rate input. Optional for a life contract.
- i_type
Interest-rate type:
"effective","nominal_interest","nominal_discount", or"force".- m
Positive integer. Conversion frequency for nominal interest rates.
- type
Insurance type:
"whole","term", or"endowment".- n
Insurance term in years. Use
Inffor whole-life insurance.- h
Nonnegative integer deferment period in years.
- benefit
Positive insurance benefit.
- P
Optional annualized premium \(P^{(k)}\). If
NULL, it is calculated withpremium_xby the equivalence principle.- k
Positive integer. Number of premium payments per year.
- frac
Fractional-age assumption for exact k-thly premium annuities.
- timing
Premium timing. Currently only
"due"is supported, which gives reserves immediately before any premium payable at durationt.Start of premium payments:
"issue"or"deferred".- n_prem
Premium-paying term in years. A fractional term is permitted when
n_prem * kis an integer.- woolhouse
Woolhouse approximation order for the premium annuity:
"none","first", or"second".- t
Optional integer vector of policy durations. If
NULL, all supported integer durations are returned.- method
Reserve method:
"prospective"or"recursive". The recursive method currently supports annual premiums only (k = 1).- output
Output level.
"summary"returns a compact reserve schedule,"value"returns a named numeric vector, and"audit"returns the reserve components in long format."table"is accepted as a deprecated alias for"summary".- tidy
Deprecated compatibility argument.
TRUEmaps tooutput = "summary"andFALSEtooutput = "value".- check
Logical scalar. If
TRUE, validates inputs.- ...
Transitional compatibility for older calls using
mortality_table,age,rate,rate_type,insurance_type,term_years,premium,premium_term_years, anddurations.
Value
For output = "summary", a tibble with at most six columns:
duration, attained age, reserve, annualized premium, premium per payment,
and method.
For output = "value", a named numeric vector.
For output = "audit", a long-format tibble containing future benefit
APV, future premium APV, reserve, and premium amounts at each duration.
Details
The prospective method supports annual and true k-thly premiums payable in
advance. The premium input P is always interpreted as the annualized
premium \(P^{(k)}\). The amount paid at each premium date is
\(P^{(k)} / k\).
At integer duration \(t\), conditional on survival to age \(x+t\), the prospective reserve is $$ {}_tV_x = \operatorname{APV}_t(\text{future benefits}) - P^{(k)} \operatorname{APV}_t(\text{future premium annuity}). $$
The premium annuity is normalized to an annual payment rate of 1, so each installment has amount \(1/k\). Therefore, the multiplier in the reserve formula is the annualized premium \(P^{(k)}\), not the installment \(P^{(k)}/k\).
Reserves are measured immediately before any premium payable at duration \(t\). This is the standard fully discrete terminal-reserve convention for premiums payable in advance.
For annual premiums, the recursive method uses $$ {}_{t+1}V_x = \frac{ ({}_tV_x + P_t)(1+i) - b_{t+1}q_{x+t} }{p_{x+t}}. $$
The implementation evaluates its algebraically equivalent backward form $${}_tV_x = v(p_{x+t}{}_{t+1}V_x + q_{x+t}b_{t+1}) - P_t.$$ This avoids amplification by repeated division by small survival probabilities. The boundary value is the prospective value at the last supported positive cohort within the contract horizon; it is not generally zero for whole-life insurance. Already defined maturity payments are retained. Unrequested extinct conditioning states are not traversed. A requested intermediate reserve conditional on an extinct cohort remains undefined.
Tables must have nonincreasing finite lx on an annual age grid.
The recursive calculation retains the original log accumulation rate and
forms death decrements before dividing survivor counts. Positive survival is
obtained directly from counts, not as \(1-q_x\). The whole-life output
horizon remains the last recorded age with positive lx; finite
coverage must be supported by recorded table ages. These local conventions
are retained separately from the implicit final interval in insurance APVs.
t indexes durations of one contract, not independent policy scenarios.
No clipping or zeroing of small/negative reserves is applied. Nonfinite
future APV components do not in general identify their difference; exact
recovery of arbitrary cancellations between infinite components is not promised.
See also
premium_x, insurance_x,
annuity_x, life_contract,
add_insurance, add_premium_schedule
Other life-contingencies:
add_insurance(),
add_premium_schedule(),
annuity_multi(),
annuity_x(),
annuity_xy(),
insurance_variable_k(),
insurance_x(),
insurance_xy(),
life_contract(),
premium_gross(),
premium_x(),
premium_xy(),
reserve_xy(),
simulate_annuity_x(),
simulate_insurance_x()
Examples
lt <- data.frame(
x = 40:90,
lx = round(100000 * exp(-0.018 * (0:50)^1.35))
)
lt$lx[nrow(lt)] <- 0
reserve_x(
lt = lt,
x = 40,
i = 0.05,
type = "term",
n = 20,
benefit = 100000,
k = 12,
n_prem = 10,
t = c(0, 5, 10, 15, 20)
)
#> # A tibble: 5 × 6
#> t age reserve premium_annualized premium_per_payment method
#> <int> <int> <dbl> <dbl> <dbl> <chr>
#> 1 0 40 0 5841. 487. prospective
#> 2 5 45 17829. 5841. 487. prospective
#> 3 10 50 36402. 5841. 487. prospective
#> 4 15 55 24485. 5841. 487. prospective
#> 5 20 60 0 5841. 487. prospective
life_contract(
lt = lt,
lives = "single",
x = 40,
i = 0.05
) |>
add_insurance(
type = "term",
benefit = 100000,
n = 20
) |>
add_premium_schedule(
k = 12,
n_prem = 10
) |>
reserve_x(
t = c(0, 5, 10, 15, 20),
output = "summary"
)
#> # A tibble: 5 × 6
#> t age reserve premium_annualized premium_per_payment method
#> <int> <int> <dbl> <dbl> <dbl> <chr>
#> 1 0 40 0 5841. 487. prospective
#> 2 5 45 17829. 5841. 487. prospective
#> 3 10 50 36402. 5841. 487. prospective
#> 4 15 55 24485. 5841. 487. prospective
#> 5 20 60 0 5841. 487. prospective