Estimates net premiums from simulated present values of benefits and premium annuities, while distinguishing the annualized premium from the amount paid at each premium date.
Usage
mc_premium(
.data = NULL,
col_Z = "pv_benefit",
col_Y = "pv_annuity",
col_P = "P",
by = NULL,
na_rm = TRUE,
k = NULL,
annuity_payment = NULL,
tol = 1e-10,
...
)Arguments
- .data
A data frame or tibble containing simulated present values. Usually obtained after applying
mc_insuranceandmc_annuityto the same simulated lifetime sample.- 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 compatibility output containing the coefficient that directly multiplies
col_Y. Default is"P". For a normalized \(k\)-thly premium annuity constructed withpayment = 1 / k, this coefficient is the annualized premium.- by
Optional character vector of grouping columns. If supplied, the premium is estimated separately within each group. If
by = NULLand.datais already grouped, the current grouping is used.- na_rm
Logical scalar. If
TRUE, simulations with a missing benefit or annuity present value are removed as complete pairs. The same simulation rows are therefore used in both means.- 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 amount paid at each date when
col_Ywas constructed. 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, andpremium_col.
Value
A data frame or tibble containing the original simulations and standardized premium columns:
- premium_annualized
Estimated annualized premium \(\widehat P^{(k)}\).
- premium_per_payment
Amount collected at each premium date.
- payments_per_year
Premium payment frequency
k.- premium_annuity_scale
Coefficient \(\widehat q\) multiplying
col_Y.- mc_equivalence_residual
Difference \(\overline Z-\widehat q\overline{Y_c}\) within the estimation group.
The column selected by col_P stores
premium_annuity_scale for backward compatibility. Unless
col_P = "premium", a compatibility column premium is also
created with the same scale coefficient.
Existing grouping is used for estimation and removed from the result.
Details
Let \(Z\) denote the simulated present value of benefits. Suppose the simulated premium annuity is $$ Y_c = c\sum_j v^{t_j}, $$ where \(c\) is the amount used at each of the \(k\) premium dates per year. The Monte Carlo coefficient that directly multiplies this annuity is $$ \widehat q = \frac{\overline Z}{\overline{Y_c}}. $$
The corresponding premium amount at each payment date is $$ \widehat P_{\mathrm{per\ payment}} = \widehat q c, $$ and the annualized premium is $$ \widehat P^{(k)} = k\widehat q c. $$
The recommended premium-annuity normalization uses
payment = 1 / k in mc_annuity. In that case,
$$
\widehat q = \widehat P^{(k)},
\qquad
\widehat P_{\mathrm{per\ payment}}
= \frac{\widehat P^{(k)}}{k}.
$$
If instead payment = 1, then \(\widehat q\) is the amount paid at
each premium date, while the annualized premium is \(k\widehat q\).
When na_rm = TRUE, missing values are removed jointly: a simulation
contributes only if both col_Z and col_Y are observed. This
prevents the numerator and denominator from being estimated from different
simulated samples.
Monetary premium amounts retain the ratio before intermediate overflow or
underflow. A displayed annuity-scale coefficient may still be zero or
infinite when the coefficient itself is outside double precision, while
the per-payment and annualized amounts remain representable. The
equivalence residual uses the ratio before that loss of range.
Positive subnormal observations are retained using scaled means when an
ordinary mean rounds to zero. A genuinely zero annuity exposure is rejected.
A positive infinite payment_annualized metadata value is accepted
only when it agrees with the product of a finite payment basis and finite
frequency. The payment basis cannot be inferred from that infinite value
alone; retain payment_per_payment or supply annuity_payment.
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(800, 1200),
pv_annuity = c(8, 12),
payment_per_payment = 1 / 12,
payment_annualized = 1,
payments_per_year = 12
)
simulated |>
mc_premium()
#> # A tibble: 2 × 11
#> pv_benefit pv_annuity payment_per_payment payment_annualized payments_per_year
#> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 800 8 0.0833 1 12
#> 2 1200 12 0.0833 1 12
#> # ℹ 6 more variables: P <dbl>, premium_annualized <dbl>,
#> # premium_per_payment <dbl>, premium_annuity_scale <dbl>,
#> # mc_equivalence_residual <dbl>, premium <dbl>
# Here P is annualized because the annuity uses payment = 1 / 12.
# With payment = 1 at each monthly date, P is the monthly amount,
# while premium_annualized is twelve times P.
simulated_unit_payments <- tibble::tibble(
pv_benefit = c(800, 1200),
pv_annuity = c(96, 144),
payment_per_payment = 1,
payment_annualized = 12,
payments_per_year = 12
)
simulated_unit_payments |>
mc_premium()
#> # A tibble: 2 × 11
#> pv_benefit pv_annuity payment_per_payment payment_annualized payments_per_year
#> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 800 96 1 12 12
#> 2 1200 144 1 12 12
#> # ℹ 6 more variables: P <dbl>, premium_annualized <dbl>,
#> # premium_per_payment <dbl>, premium_annuity_scale <dbl>,
#> # mc_equivalence_residual <dbl>, premium <dbl>