## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

## ----message = FALSE, warning = FALSE-----------------------------------------
library(insurancerating)

portfolio <- as.data.frame(MTPL)

age_breaks <- c(18, 25, 32, 39, 51, 58, 65, 84, 95)
portfolio$age_band <- cut(
  portfolio$age_policyholder,
  breaks = age_breaks,
  include.lowest = TRUE
)
portfolio$bm_group <- cut(
  portfolio$bm,
  breaks = c(0, 4, 8, Inf),
  labels = c("Low", "Medium", "High")
)
portfolio$bm_detail <- factor(as.character(portfolio$bm))
portfolio$zip <- factor(portfolio$zip)

unrestricted <- glm(
  nclaims ~ age_band + zip + bm_group + offset(log(exposure)),
  family = poisson(),
  data = portfolio
)

## -----------------------------------------------------------------------------
head(rating_table(unrestricted, exposure = FALSE))

## -----------------------------------------------------------------------------
refinement <- prepare_refinement(
  unrestricted,
  data = portfolio
)

refinement

## -----------------------------------------------------------------------------
refinement <- refinement |>
  add_smoothing(
    model_variable = "age_band",
    source_variable = "age_policyholder",
    breaks = age_breaks,
    smoothing = "spline",
    k = 5,
    weights = "exposure"
  )

## -----------------------------------------------------------------------------
summary(refinement)

autoplot(
  refinement,
  variable = "age_band",
  x_max = 90
)

## -----------------------------------------------------------------------------
explicit_age_refinement <- refinement |>
  edit_smoothing(
    model_variable = "age_band",
    from = 32,
    to = 65,
    from_value = 0.95,
    to_value = 1.10,
    control_positions = 51,
    control_values = 1.02
  )

autoplot(explicit_age_refinement, variable = "age_band", x_max = 90)

## -----------------------------------------------------------------------------
relative_age_refinement <- refinement |>
  edit_smoothing(
    model_variable = "age_band",
    from = 32,
    to = 65,
    adjustment = 1.05
  )

autoplot(
  relative_age_refinement,
  variable = "age_band",
  x_max = 90,
  show_initial_smoothing = TRUE
)

## -----------------------------------------------------------------------------
cumulative_age_refinement <- relative_age_refinement |>
  edit_smoothing(
    model_variable = "age_band",
    from = 50,
    adjustment = 1.02,
    transition = "linear"
  )

# Step 3 is the cumulative result of the initial smoothing and both edits.
autoplot(
  cumulative_age_refinement,
  step = 3,
  x_max = 90,
  show_initial_smoothing = TRUE
)

## ----eval = FALSE-------------------------------------------------------------
# # Refine the upper tail
# edit_smoothing(
#   refinement,
#   model_variable = "age_band",
#   from = 50,
#   adjustment = 1.05
# )
# 
# # Refine the lower tail
# edit_smoothing(
#   refinement,
#   model_variable = "age_band",
#   to = 35,
#   adjustment = 0.95
# )

## ----eval = FALSE-------------------------------------------------------------
# # Continuous straight transitions
# edit_smoothing(
#   refinement,
#   model_variable = "age_band",
#   from = 32,
#   to = 65,
#   adjustment = 1.05,
#   transition = "linear"
# )
# 
# # Immediate changes at both boundaries
# edit_smoothing(
#   refinement,
#   model_variable = "age_band",
#   from = 32,
#   to = 65,
#   adjustment = 1.05,
#   transition = "step"
# )

## -----------------------------------------------------------------------------
slope_refinement <- refinement |>
  edit_smoothing(
    model_variable = "age_band",
    from = 50,
    slope_adjustment = 1.10
  )

autoplot(
  slope_refinement,
  variable = "age_band",
  show_initial_smoothing = TRUE
)

## ----eval=FALSE---------------------------------------------------------------
# refinement |>
#   edit_smoothing(
#     model_variable = "age_band",
#     from = 30,
#     to = 50,
#     adjustment = 1.05
#   ) |>
#   edit_smoothing(
#     model_variable = "age_band",
#     from = 50,
#     slope_adjustment = 1.10
#   )

## -----------------------------------------------------------------------------
refinement <- relative_age_refinement

## -----------------------------------------------------------------------------
autoplot(refinement, variable = "age_band")

## -----------------------------------------------------------------------------
premium_change(
  refinement,
  variable = "age_band",
  at = c(20, 25, 30, 35)
)

## -----------------------------------------------------------------------------
premium_change(
  refinement,
  variable = "age_band",
  at = seq(20, 60, by = 5),
  increment = 5
)

## -----------------------------------------------------------------------------
premium_change(
  refinement,
  variable = "age_band",
  at = c(20, 25, 30, 35),
  basis = "segments"
)

## ----eval = FALSE-------------------------------------------------------------
# premium_change(
#   relative_age_refinement,
#   variable = "age_band",
#   at = c(20, 25, 30),
#   steps = c(1, 2)
# ) |>
#   as_gt()

## -----------------------------------------------------------------------------
zip_restrictions <- data.frame(
  zip = c("0", "3"),
  zip_restricted = c(0.95, 1.10)
)

refinement <- refinement |>
  add_restriction(zip_restrictions)

## -----------------------------------------------------------------------------
autoplot(refinement, variable = "zip")

## -----------------------------------------------------------------------------
refinement <- refinement |>
  add_shrinkage(
    model_variable = "bm_group",
    credibility = 0.9,
    weights = "exposure"
  )

## -----------------------------------------------------------------------------
autoplot(refinement, variable = "bm_group")

## -----------------------------------------------------------------------------
bm_relativities <- relativities(
  split_level(
    "Low",
    new_levels = c("1", "2", "3", "4"),
    relativities = c(0.95, 0.98, 1.02, 1.05)
  ),
  split_level(
    "Medium",
    new_levels = c("5", "6", "7", "8"),
    relativities = c(0.96, 0.99, 1.02, 1.05)
  )
)

refinement <- refinement |>
  add_relativities(
    model_variable = "bm_group",
    split_variable = "bm_detail",
    relativities = bm_relativities,
    exposure = "exposure",
    normalize = TRUE,
    output_variable = "bm_tariff_segment"
  )

## -----------------------------------------------------------------------------
summary(refinement)

## -----------------------------------------------------------------------------
refined_model <- refit(
  refinement,
  intercept_only = TRUE
)

## -----------------------------------------------------------------------------
head(rating_table(refined_model, exposure = FALSE))

## -----------------------------------------------------------------------------
calibrated_model <- calibrate_model(
  refined_model,
  factor = 1.05
)

head(rating_table(calibrated_model, exposure = FALSE))

## -----------------------------------------------------------------------------
refinement_audit <- audit_refinement(
  refined_model,
  exposure = "exposure",
  metric = "frequency"
)

summary(refinement_audit)

## ----eval = FALSE-------------------------------------------------------------
# refined_model <- refit(refinement)
# 
# refinement <- refinement |>
#   edit_smoothing(
#     model_variable = "age_band",
#     from = 32,
#     to = 65,
#     adjustment = 1.03,
#     transition = "linear"
#   )
# 
# updated_model <- refit(refinement)

