BarnettZehnwirth#

class chainladder.BarnettZehnwirth(drop=None, drop_valuation=None, formula=None, response=None, alpha=None, gamma=None, iota=None)[source]#

This estimator enables modeling from the Probabilistic Trend Family as described by Barnett and Zehnwirth.

The model is fit on log-incremental losses and produces multiplicative ldf_ patterns for use with IBNR estimators. Specify the regression structure either with a patsy formula or with PTF period groupings (alpha, gamma, iota) that define origin, trend, and final-period cohorts.

Added in version 0.8.2.

Parameters:
drop: tuple or list of tuples

Drops specific origin/development combination(s)

drop_valuation: str or list of str (default = None)

Drops specific valuation periods. str must be date convertible.

formula: formula-like

A patsy formula describing the independent variables, X of the GLM

response: str

Column name for the reponse variable of the GLM. If ommitted, then the first column of the Triangle will be used.

alpha: list of int

List of origin periods denoting the first indices of each group

gamma: list of int
iota: list of int

Examples

When many accident years are available but you want a smaller number of origin cohorts, specify alpha, gamma, and iota instead of a separate factor for every year. The fitted design has fewer parameters than a fully saturated origin-by-development formula on the same triangle.

tri = cl.load_sample("abc")
m_ptf = cl.BarnettZehnwirth(
    alpha=[0, 5], gamma=[0, 2, 5], iota=[0, 7, 11]
).fit(tri)
m_full = cl.BarnettZehnwirth(
    formula="C(origin)+C(development)"
).fit(tri)
print(len(m_ptf.coef_.values.flatten()))
print(len(m_full.coef_.values.flatten()))
6
21

Use a patsy formula when the reserving structure needs explicit terms (for example separate origin and development factors) rather than the PTF cohort shorthand. Comparing the full ldf_ patterns of the two models shows the difference in structure: the formula model produces a single pattern shared across all accident years, while the PTF model allows the pattern to shift gradually from the earliest to the latest accident year due to the calendar trend captured in iota.

import numpy as np

tri = cl.load_sample("abc")
m_formula = cl.BarnettZehnwirth(
    formula="C(origin)+C(development)"
).fit(tri)
m_ptf = cl.BarnettZehnwirth(
    alpha=[0, 5], gamma=[0, 2, 5], iota=[0, 7, 11]
).fit(tri)
ldf_f = m_formula.ldf_.to_frame(origin_as_datetime=False)
ldf_p = m_ptf.ldf_.to_frame(origin_as_datetime=False)
print(np.round(ldf_f.values[0], 4))   # formula: earliest origin
print(np.round(ldf_f.values[-1], 4))  # formula: latest origin
print(np.round(ldf_p.values[0], 4))   # PTF: earliest origin
print(np.round(ldf_p.values[-1], 4))  # PTF: latest origin
[2.2854 1.4138 1.1976 1.1128 1.0721 1.048  1.0342 1.0264 1.0208 1.0168]
[2.2854 1.4138 1.1976 1.1128 1.0721 1.048  1.0342 1.0264 1.0208 1.0168]
[1.9716 1.4788 1.1794 1.0843 1.0431 1.0428 1.0425 1.0423 1.0421 1.0419]
[1.9727 1.4625 1.1692 1.0774 1.0384 1.037  1.0357 1.0345 1.0333 1.0322]
fit(X, y=None, sample_weight=None)[source]#
transform(X)[source]#

If X and self are of different shapes, align self to X, else return self.

Parameters:
XTriangle

The triangle to be transformed

Returns:
X_newNew triangle with transformed attributes.

Inherited Methods

BarnettZehnwirth.fit_transform

Fit to data, then transform it.

BarnettZehnwirth.get_metadata_routing

Get metadata routing of this object.

BarnettZehnwirth.get_params

Get parameters for this estimator.

BarnettZehnwirth.pipe

Apply func(self, *args, **kwargs).

BarnettZehnwirth.set_backend

Converts triangle array_backend.

BarnettZehnwirth.set_output

Set output container.

BarnettZehnwirth.set_params

Set the parameters of this estimator.

BarnettZehnwirth.to_json

Serializes triangle object to json format

BarnettZehnwirth.to_pickle

Serializes triangle object to pickle.