chainladder {ChainLadder}R Documentation

Estimate age-to-age factors


Basic chain-ladder function to estimate age-to-age factors for a given cumulative run-off triangle. This function is used by Mack- and MunichChainLadder.


chainladder(Triangle, weights = 1, delta = 1)



cumulative claims triangle. A (mxn)-matrix C_{ik} which is filled for k ≤q n+1-i; i=1,…,m; m≥q n , see qpaid for how to use (mxn)-development triangles with m<n, say higher development period frequency (e.g quarterly) than origin period frequency (e.g annual).


weights. Default: 1, which sets the weights for all triangle entries to 1. Otherwise specify weights as a matrix of the same dimension as Triangle with all weight entries in [0; 1], where entry w_{i,k} corresponds to the point C_{i,k+1}/C_{i,k}. Hence, any entry set to 0 or NA eliminates that age-to-age factor from inclusion in the model. See also 'Details'.


'weighting' parameters. Default: 1; delta=1 gives the historical chain-ladder age-to-age factors, delta=2 gives the straight average of the observed individual development factors and delta=0 is the result of an ordinary regression of C_{i,k+1} against C_{i,k} with intercept 0, see Barnett & Zehnwirth (2000).

Please note that MackChainLadder uses the argument alpha, with alpha = 2 - delta, following the original paper Mack (1999)


The key idea is to see the chain-ladder algorithm as a special form of a weighted linear regression through the origin, applied to each development period.

Suppose y is the vector of cumulative claims at development period i+1, and x at development period i, weights are weighting factors and F the individual age-to-age factors F=y/x. Then we get the various age-to-age factors:

Barnett & Zehnwirth (2000) use delta = 0, 1, 2 to distinguish between the above three different regression approaches: lm(y~x + 0, weights=weights/x^delta).

Thomas Mack uses the notation alpha = 2 - delta to achieve the same result: sum(weights*x^alpha*F)/sum(weights*x^alpha) # Mack (1999) notation


chainladder returns a list with the following elements:


linear regression models for each development period


input triangle of cumulative claims


weights used


deltas used


Markus Gesmann <>


Thomas Mack. The standard error of chain ladder reserve estimates: Recursive calculation and inclusion of a tail factor. Astin Bulletin. Vol. 29. No 2. 1999. pp.361:366

G. Barnett and B. Zehnwirth. Best Estimates for Reserves. Proceedings of the CAS. Volume LXXXVII. Number 167. November 2000.

See Also

See also ata, predict.ChainLadder MackChainLadder,


## Concept of different chain-ladder age-to-age factors.
## Compare Mack's and Barnett & Zehnwirth's papers.
x <- RAA[1:9,1]
y <- RAA[1:9,2]

F <- y/x
## wtd. average chain-ladder age-to-age factors
alpha <- 1 ## Mack notation
delta <- 2 - alpha ## Barnett & Zehnwirth notation

lm(y~x + 0 ,weights=1/x^delta)
summary(chainladder(RAA, delta=delta)$Models[[1]])$coef

## straight average age-to-age factors
alpha <- 0
delta <- 2 - alpha 
lm(y~x + 0, weights=1/x^(2-alpha))
summary(chainladder(RAA, delta=delta)$Models[[1]])$coef

## ordinary regression age-to-age factors
delta <- 2-alpha
lm(y~x + 0, weights=1/x^delta)
summary(chainladder(RAA, delta=delta)$Models[[1]])$coef

## Compare different models
CL0 <- chainladder(RAA)
## age-to-age factors
sapply(CL0$Models, function(x) summary(x)$coef["x","Estimate"])
sapply(CL0$Models, function(x) summary(x)$coef["x","Std. Error"])
## sigma
sapply(CL0$Models, function(x) summary(x)$sigma)

CL1 <- chainladder(RAA, delta=1)
## age-to-age factors
sapply(CL1$Models, function(x) summary(x)$coef["x","Estimate"])
sapply(CL1$Models, function(x) summary(x)$coef["x","Std. Error"])
## sigma
sapply(CL1$Models, function(x) summary(x)$sigma)

CL2 <- chainladder(RAA, delta=2)
## age-to-age factors
sapply(CL2$Models, function(x) summary(x)$coef["x","Estimate"])
sapply(CL2$Models, function(x) summary(x)$coef["x","Std. Error"])
## sigma
sapply(CL2$Models, function(x) summary(x)$sigma)

## Set 'weights' parameter to use only the last 5 diagonals, 
## i.e. the last 5 calendar years
calPeriods <- (row(RAA) + col(RAA) - 1)
(weights <- ifelse(calPeriods <= 5, 0, ifelse(calPeriods > 10, NA, 1)))
CL3 <- chainladder(RAA, weights=weights)

[Package ChainLadder version 0.2.12 Index]