Constructs simulated actuarial losses from present values of benefits and premium-payment annuities while keeping annualized premiums distinct from amounts paid at each premium date.
Usage
mc_loss(
.data = NULL,
col_Z = "pv_benefit",
col_Y = "pv_annuity",
col_P = "P",
col_L = "L",
P = NULL,
premium_unit = c("auto", "annualized", "per_payment", "annuity_scale"),
k = NULL,
annuity_payment = NULL,
tol = 1e-10,
...
)Arguments
- .data
A data frame or tibble containing simulated present values of benefits and premium annuities.
- col_Z
Character scalar naming the simulated present value of benefits. Default is
"pv_benefit".- col_Y
Character scalar naming the simulated present value of the premium annuity. Default is
"pv_annuity".- col_P
Character scalar naming the premium input column. When omitted, the function searches, in order, for
premium_annualized,premium_per_payment,P, andpremium.- col_L
Character scalar naming the simulated loss output. Default is
"L".- P
Optional nonnegative numeric scalar supplied directly instead of reading a premium column.
Unit of
Por the selected premium column:"annualized","per_payment", or"annuity_scale". The latter is the coefficient that directly multipliescol_Y. With"auto", explicit modern column names determine the unit, whileP,premium, and a directPargument retain their historical annuity-scale interpretation.- k
Optional positive integer number of premium payments per year. By default it is inferred from
payments_per_yearorkin.data; if neither exists,k = 1is used.- annuity_payment
Optional positive numeric scalar giving the payment amount used to construct
col_Y. It is normally inferred frompayment_per_payment,payment, orpayment_annualizedin the output ofmc_annuity.- tol
Nonnegative numeric tolerance for consistency checks.
- ...
Transitional compatibility for older calls using
data,benefit_col,annuity_col,premium_col,loss_col, andpremium.
Value
A data frame or tibble containing the original simulation and standardized columns:
- premium_annualized
Annualized premium \(P^{(k)}\).
- premium_per_payment
Amount collected at each premium date.
- payments_per_year
Premium payment frequency
k.- premium_annuity_scale
Coefficient multiplying
col_Y.- pv_premiums
Simulated present value of premium income.
- L
Simulated loss, or the name supplied through
col_L.
A compatibility column loss is synchronized with col_L.
Details
Let \(Z\) be the present value random variable of benefits. Suppose
col_Y contains
$$
Y_c = c\sum_j v^{t_j},
$$
where \(c\) is the amount used in mc_annuity at each of the
\(k\) premium dates per year.
If \(P^{(k)}\) is the annualized premium, the actual installment is \(P^{(k)}/k\), and the simulated present value of premiums is $$ \Pi = \frac{P^{(k)}}{k c}Y_c. $$ Hence the loss at issue is $$ L = Z - \Pi. $$
The recommended normalized premium annuity uses
payment = 1 / k in mc_annuity. Then \(c=1/k\),
\(Y_c=Y^{(k)}\), and the expression simplifies to
$$
L = Z - P^{(k)}Y^{(k)}.
$$
This convention agrees with premium_x,
premium_xy, reserve_x, and
reserve_xy: the premium is annualized, while the amount
collected at each date is the annualized premium divided by k.
For backward compatibility, legacy columns P and premium
are interpreted as coefficients that multiply the supplied annuity present
value directly. If such a coefficient is \(q\), then
$$
P_{\mathrm{per\ payment}} = q c,
\qquad
P^{(k)} = k q c.
$$
For annualized or per-payment inputs, monetary income retains the original
premium amount and frequency until it is combined with the annuity present
value. This avoids losing a representable income when an intermediate
annuity-scale coefficient underflows or overflows. Displayed converted
amounts may still be zero or infinite if they themselves do not fit in
double precision. An explicitly supplied annuity-scale coefficient is used
as supplied; a rounded zero or nonfinite coefficient cannot reconstruct
information that has already been lost. Select a representable monetary
premium column when passing extreme results from mc_premium.
Positive infinite annualized annuity-basis metadata are accepted only when
they agree with the product of the finite per-payment basis and frequency;
they cannot be used alone to infer the payment basis.
References
Bowers, N. L., Gerber, H. U., Hickman, J. C., Jones, D. A., and Nesbitt, C. J. (1997). Actuarial Mathematics. Second Edition. Society of Actuaries.
Examples
simulated <- tibble::tibble(
pv_benefit = c(900, 700, 1100),
pv_annuity = c(8, 7, 9),
payment_per_payment = 1 / 12,
payment_annualized = 1,
payments_per_year = 12,
premium_annualized = 120
)
simulated |>
mc_loss()
#> # A tibble: 3 × 11
#> pv_benefit pv_annuity payment_per_payment payment_annualized payments_per_year
#> <dbl> <dbl> <dbl> <dbl> <int>
#> 1 900 8 0.0833 1 12
#> 2 700 7 0.0833 1 12
#> 3 1100 9 0.0833 1 12
#> # ℹ 6 more variables: premium_annualized <dbl>, premium_per_payment <dbl>,
#> # premium_annuity_scale <dbl>, pv_premiums <dbl>, L <dbl>, loss <dbl>
# A premium supplied directly as an annualized amount
simulated |>
mc_loss(
P = 120,
premium_unit = "annualized"
)
#> # A tibble: 3 × 12
#> pv_benefit pv_annuity payment_per_payment payment_annualized payments_per_year
#> <dbl> <dbl> <dbl> <dbl> <int>
#> 1 900 8 0.0833 1 12
#> 2 700 7 0.0833 1 12
#> 3 1100 9 0.0833 1 12
#> # ℹ 7 more variables: premium_annualized <dbl>, P <dbl>,
#> # premium_per_payment <dbl>, premium_annuity_scale <dbl>, pv_premiums <dbl>,
#> # L <dbl>, loss <dbl>
# Historical coefficient multiplying the annuity PV directly
tibble::tibble(
pv_benefit = c(900, 700),
pv_annuity = c(8, 7),
P = 100
) |>
mc_loss()
#> # A tibble: 2 × 10
#> pv_benefit pv_annuity P premium_annualized premium_per_payment
#> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 900 8 100 100 100
#> 2 700 7 100 100 100
#> # ℹ 5 more variables: payments_per_year <int>, premium_annuity_scale <dbl>,
#> # pv_premiums <dbl>, L <dbl>, loss <dbl>