Gross premium under a simple expense-loaded equivalence principle
Source:R/premium_gross.R
premium_gross.RdConverts a net-premium result from premium_x or
premium_xy into an expense-loaded gross premium.
Usage
premium_gross(
prem,
alpha = 0,
beta = 0,
gamma = 0,
k = NULL,
output = c("value", "summary", "audit", "table"),
tidy = NULL,
check = TRUE,
tol = 1e-10,
...
)Arguments
- prem
A one-row data frame or tibble. The preferred input is
premium_x(..., output = "summary")orpremium_xy(..., output = "summary"). It must contain an annualized net premium and the APV of the normalized premium annuity.- alpha
Nonnegative numeric scalar. Initial acquisition expense as a multiple of one gross premium installment. The expense at issue is \(\alpha G^{(k)} / k\).
- beta
Numeric scalar in \([0,1)\). Proportional expense charged on every gross premium installment.
- gamma
Nonnegative numeric scalar. Fixed monetary expense incurred at every premium-payment date. Its APV is \(\gamma k a^{(k)}\), because
a_premiumsis normalized with payments of \(1/k\).- k
Optional positive integer payment frequency. By default it is inferred from
payments_per_yearorkinprem; if neither is present,k = 1is used.- output
Output level.
"value"returns the annualized gross premium,"summary"returns a compact one-row tibble, and"audit"returns the extended-equivalence components in long format."table"is accepted as a compatibility alias for"summary".- tidy
Deprecated compatibility argument.
TRUEmaps tooutput = "summary"andFALSEtooutput = "value".- check
Logical scalar. If
TRUE, validates the inputs.- tol
Nonnegative finite numeric tolerance. Monetary consistency is checked relatively to the compared amounts, without a one-currency-unit floor; frequency and integer checks use absolute tolerance.
- ...
Transitional compatibility. The deprecated argument
payments_per_yearis mapped tok.
Value
For output = "value", a numeric scalar containing the annualized
gross premium \(G^{(k)}\).
For output = "summary", a one-row tibble with six columns:
annualized gross premium, gross premium per payment, annualized net premium,
annualized loading, payment frequency, and equivalence residual.
For output = "audit", a long-format tibble with the APVs of gross
premiums, benefits, and each expense component.
Details
The function preserves the package-wide distinction between an annualized
premium and the amount paid at each of the k payment dates.
Let \(a^{(k)}\) denote the APV of the premium annuity returned by
premium_x or premium_xy. That annuity has
\(k\) payments per year, each of amount \(1/k\); hence it represents an
annual payment rate of 1.
If \(P^{(k)}\) is the annualized net premium and \(G^{(k)}\) is the annualized gross premium, the extended equivalence equation implemented is $$ G^{(k)}a^{(k)} = P^{(k)}a^{(k)} + \alpha\frac{G^{(k)}}{k} + \beta G^{(k)}a^{(k)} + \gamma k a^{(k)}. $$
Therefore, $$ G^{(k)} = \frac{P^{(k)} + k\gamma} {(1-\beta)-\alpha/(k a^{(k)})}. $$
The actual premium installment is $$ G_{\mathrm{per\ payment}} = \frac{G^{(k)}}{k}. $$
For k = 1, this reduces to the previous annual formula:
$$
G =
\frac{P_{\mathrm{net}}+\gamma}
{(1-\beta)-\alpha/a}.
$$
This intentionally simple model assumes that gamma is incurred at
the same dates and under the same contingency as premium payments. Expenses
with a different timing or contingency require their own APV and are not
represented by gamma.
Preferred column names in prem are
premium_annualized, premium_per_payment,
payments_per_year, and apv_premium_annuity. Legacy annual
tables using P, premium, P_net,
a_premiums, or apv_premiums remain supported.
Legacy premium columns are accepted automatically only when k = 1,
because their unit is ambiguous for subannual premiums.
When annualized and per-payment premiums are both supplied, both must be
valid and agree in their units. A supplied payment frequency is validated
even if k is explicit. Acquisition shares and expense products retain
representable values without overflowing \(k a^{(k)}\) first. The loading
is evaluated directly from the expense equation; a small positive loading
can be reported even when the rounded gross and net premiums coincide.
The equivalence residual uses the same equation factored in annuity units,
avoiding subtraction of overflowing APVs where possible; it is not forced
to zero. Individual audit APVs may still be infinite. No finite result is
promised when the annualized premium itself is outside numeric range.
See also
premium_x, premium_xy,
annuity_x, annuity_xy
Other life-contingencies:
add_insurance(),
add_premium_schedule(),
annuity_multi(),
annuity_x(),
annuity_xy(),
insurance_variable_k(),
insurance_x(),
insurance_xy(),
life_contract(),
premium_x(),
premium_xy(),
reserve_x(),
reserve_xy(),
simulate_annuity_x(),
simulate_insurance_x()
Examples
net <- tibble::tibble(
premium_annualized = 1200,
premium_per_payment = 100,
payments_per_year = 12,
apv_premium_annuity = 10
)
premium_gross(
net,
alpha = 0.5,
beta = 0.05,
gamma = 20,
output = "summary"
)
#> # A tibble: 1 × 6
#> gross_premium_annualized gross_premium_per_payment net_premium_annualized
#> <dbl> <dbl> <dbl>
#> 1 1522. 127. 1200
#> # ℹ 3 more variables: loading_annualized <dbl>, payments_per_year <int>,
#> # equivalence_residual <dbl>
# Pipeline from a net-premium calculation
if (FALSE) { # \dontrun{
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
) |>
premium_x(output = "summary") |>
premium_gross(
alpha = 0.5,
beta = 0.05,
gamma = 20,
output = "summary"
)
} # }