Fit a Cape Cod projection from a "Triangle" object. Cape Cod is
the prior-free Bornhuetter-Ferguson variant introduced by Stanard
(1985): the a priori expected loss ratio is estimated from the
data itself as a portfolio-pooled quantity, then plugged into the
BF formula.
$$\widehat{\mathrm{ELR}}^{CC} = \frac{\sum_i L_{obs, i}}{\sum_i E_i^{ult} \cdot q_i}$$
where
\(L_{obs, i}\): cohort \(i\)'s observed cumulative loss at its latest observed development period.
\(q_i = L_{obs, i} / \hat L_{ult, i}^{CL}\): the expected emerged fraction (inverse of cumulative LDF).
\(E_i^{ult}\): cohort \(i\)'s ultimate premium (projected via chain ladder on premium).
Given \(\widehat{\mathrm{ELR}}^{CC}\), the per-cohort ultimate is obtained from the BF formula with this single pooled ELR:
$$\hat L_{ult, i}^{CC} = L_{obs, i} + (1 - q_i) \cdot \widehat{\mathrm{ELR}}^{CC} \cdot E_i^{ult}$$
When multiple groups are present, \(\widehat{\mathrm{ELR}}^{CC}\) is computed within group (not pooled across groups) so each group retains its own portfolio-level ELR estimate.
This is a peer worker alongside fit_bf() / fit_cl() / fit_ed().
Standalone for the Cape Cod recipe – composition with fit_ratio()
is not part of this worker. Point projection is always computed;
bootstrap SE / CI is opt-in via bootstrap = TRUE (Phase 3b). The
bootstrap path also produces per-replicate pooled ELR draws
(elr_cc_se, elr_cc_cv, elr_cc_ci_lo, elr_cc_ci_hi) since the
Cape Cod ELR itself is data-driven and thus uncertain.
Usage
fit_cc(
x,
loss = "loss",
exposure = "premium",
bootstrap = NULL,
B = 999L,
seed = NULL,
type = c("parametric", "nonparametric", "analytical"),
residual = c("cell", "link"),
process = c("gamma", "od_pois", "normal"),
alpha = 1,
sigma_method = c("locf", "min_last2", "loglinear", "mack", "none"),
recent = NULL,
regime = NULL,
credibility = NULL,
conf_level = 0.95,
...
)Arguments
- x
A
Triangleobject.- loss
A single cumulative loss variable. Default
"loss".- exposure
A single cumulative premium variable. Default
"premium".- bootstrap
Bootstrap configuration. Same forms as
fit_bf()'sbootstraparg – see there for the full description.- B
Integer number of bootstrap replicates. Used only when
bootstrapresolves to"auto". Default999.- seed
Optional integer seed for reproducible bootstrap. Default
NULL.- type
One of
"parametric"(default),"nonparametric", or"analytical"."parametric"/"nonparametric"select the bootstrap residual paradigm;"analytical"skips simulation and uses the closed-form Mack (2008) MSEP decomposition (withVar(ELR_cc)from the delta method on the pooled ELR). When no bootstrap is requested the analytical path is used regardless oftype.- residual
Residual scope for
type = "nonparametric". One of"cell"(default) or"link".- process
One of
"gamma"(default),"od_pois","normal".- alpha
Numeric scalar passed through to the inner
fit_cl()/fit_premium()calls. Default1.- sigma_method
Sigma extrapolation method forwarded to
fit_cl()/fit_premium(). Default"locf".- recent
Optional positive integer; calendar-diagonal filter forwarded to the inner fits. Default
NULL.- regime
Optional regime specification forwarded to the inner loss and premium fits. See
fit_cl()for the four-type dispatch.- credibility
Optional credibility specification.
NULL(default) gives the classical CC blend weighted by the emergence fractionq. A listlist(method = "bs", K = NULL)switches to a Buehlmann-Straub credibility blendult = Z * CL + (1 - Z) * priorwith the pooled ELR as the prior;Z = K / (K + s^2)shrinks a green / rare-event cohort toward the pooled ELR. Seefit_bf()for the full description. A credibility blend uses the analytical SE path.- conf_level
Confidence level for the SE-based CI (bootstrap quantile or analytical normal). Default
0.95.- ...
Reserved for future extension (currently unused).
Value
An object of class "CCFit" containing:
callThe matched call.
dataThe input
Triangle.method"cc".groups,cohort,dev,loss,premiumMetadata.
full,proj,summarySame shape as
BFFit. With bootstrap enabled,$fullcarriesloss_total_se/loss_total_cv/loss_ci_lo/loss_ci_hion projected cells, and$summarycarries the same pluselr_cc_se/elr_cc_cv/elr_cc_ci_lo/elr_cc_ci_hi(uncertainty on the pooled ELR itself).elr_ccdata.table(group..., elr_cc)– the pooled ELR per group (or scalar if no group).qPer-cohort emerged fraction.
credibilityNULLfor the classical blend, or a listlist(method, weights)with the Buehlmann-StraubZ/Kper cohort.cl_fit,premium_fitInner CL / Premium fits.
bootstrapWhen
bootstrapis enabled, aCCBootstraphelper holding both Triangle-levelBootstrapTriangleobjects, the per-replicate ultimate replicates, and the per-replicate pooled ELR draws;NULLotherwise.ci_type"bootstrap"when a bootstrap was run,"analytical"when the closed-form Mack (2008) MSEP was used. In the analytical case$summarycarriesloss_total_se/loss_total_cv/loss_ci_lo/loss_ci_hiplus the pooled-ELR columnselr_cc_se/elr_cc_cv/elr_cc_ci_lo/elr_cc_ci_hi.alpha,sigma_method,recent,regimeInputs forwarded to the inner
fit_cl()/fit_premium()calls.
References
Stanard, J. N. (1985). A simulation test of prediction errors of loss reserve estimation techniques. Proceedings of the Casualty Actuarial Society, 72, 124-148.
Bornhuetter, R. L. and Ferguson, R. E. (1972). The actuary and IBNR. Proceedings of the Casualty Actuarial Society, 59, 181-195.
See also
fit_bf() (Bornhuetter-Ferguson with user-supplied prior),
fit_cl(), fit_premium()
Examples
if (FALSE) { # \dontrun{
data(experience)
tri <- as_triangle(
experience[coverage == "surgery"],
groups = "coverage",
cohort = "uy_m",
calendar = "cy_m",
loss = "incr_loss",
premium = "incr_premium"
)
cc <- fit_cc(tri)
summary(cc)
cc$elr_cc # pooled ELR per group
} # }
