
Edit an existing smoothing step in a refinement workflow
Source:R/model_refinement.R
edit_smoothing.RdManually adjusts a smoothing step that was previously added with
add_smoothing(). This is intended for actuarial review of a smoothed tariff
curve, for example to flatten an unstable segment, align the end points of an
interval, or add extra control points where expert judgement should guide the
curve.
The adjusted smoothing is applied when refit() is called.
Usage
edit_smoothing(
model,
model_variable = NULL,
step = NULL,
from,
to,
from_value = NULL,
to_value = NULL,
control_positions = NULL,
control_values = NULL,
allow_extrapolation = FALSE,
extrapolation_step = NULL
)Arguments
- model
Object of class
rating_refinement, usually created withprepare_refinement(). Legacysmoothandrestrictedobjects are still accepted for backwards compatibility.- model_variable
Character string. The
model_variableof the smoothing step to edit. Required when more than one smoothing step exists andstepis not supplied.- step
Optional numeric index of the smoothing step to edit.
- from, to
Numeric values giving the start and end of the source-variable interval to modify.
- from_value, to_value
Optional numeric values used to override the smoothed curve value at
fromandto.- control_positions, control_values
Optional numeric vectors of equal length. These define additional points that the edited smoothing curve should pass through.
- allow_extrapolation
Logical. Whether edits may extend beyond the observed source-variable range.
- extrapolation_step
Optional positive numeric scalar used to set the spacing of extra break points when extrapolation is allowed.
Details
Use model_variable or step to identify the smoothing step to edit. The
interval from from to to defines the part of the source variable range
that should be changed. from_value and to_value can be used to force the
curve values at the interval boundaries. control_positions and
control_values add additional points that the edited curve should follow
inside the interval.
Examples
set.seed(42)
driver_age <- rep(seq(20, 59), each = 4)
exposure <- rep(1, length(driver_age))
age_band <- cut(
driver_age,
breaks = c(18, 30, 40, 50, 60),
include.lowest = TRUE
)
expected_claims <- exp(
-1.7 + 0.018 * (driver_age - 20) + 0.0006 * (driver_age - 40)^2
)
portfolio <- data.frame(
claims = rpois(length(driver_age), exposure * expected_claims),
exposure = exposure,
driver_age = driver_age,
age_band = age_band
)
model <- glm(
claims ~ age_band + offset(log(exposure)),
family = poisson(),
data = portfolio
)
refined <- prepare_refinement(model, data = portfolio) |>
add_smoothing(
model_variable = "age_band",
source_variable = "driver_age",
breaks = c(18, 30, 40, 50, 60),
degree = 2,
weights = "exposure"
) |>
edit_smoothing(
model_variable = "age_band",
from = 30,
to = 50,
from_value = 1.00,
to_value = 1.10,
control_positions = c(40),
control_values = c(1.05)
)
refined_model <- refit(refined)