Considérons le triangle d'incréments de payements suivants,
> PAID [,1] [,2] [,3] [,4] [,5] [,6] [1,] 3209 4372 4411 4428 4435 4456 [2,] 3367 4659 4696 4720 4730 NA [3,] 3871 5345 5338 5420 NA NA [4,] 4239 5917 6020 NA NA NA [5,] 4929 6794 NA NA NA NA [6,] 5217 NA NA NA NA NA > INC=PAID > INC[,2:6]=PAID[,2:6]-PAID[,1:5] > INC [,1] [,2] [,3] [,4] [,5] [,6] [1,] 3209 1163 39 17 7 21 [2,] 3367 1292 37 24 10 NA [3,] 3871 1474 -7 82 NA NA [4,] 4239 1678 103 NA NA NA [5,] 4929 1865 NA NA NA NA [6,] 5217 NA NA NA NA NA
> lambda=rep(NA,5) > for(k in 1:5){ + lambda[k]=(sum(PAID[1:(6-k),k+1])/ + sum(PAID[1:(6-k),k]))} > lambda [1] 1.380933 1.008476 1.008515 1.001858 1.004735 > PROJECTION=PAID > for(k in 1:5){ + PROJECTION[((7-k):6),k+1]= + PROJECTION[((7-k):6),k]*lambda[k]} > sum(PROJECTION[,6]- + diag(PROJECTION[,6:1])) [1] 2469.703
> MackChainLadder(PAID) MackChainLadder(Triangle = PAID) Latest Dev.To.Date Ultimate IBNR Mack.S.E CV(IBNR) 1 4,456 1.000 4,456 0.0 0.000 NaN 2 4,730 0.995 4,752 22.4 0.146 0.00652 3 5,420 0.993 5,456 35.8 2.405 0.06721 4 6,020 0.985 6,111 91.3 41.679 0.45629 5 6,794 0.977 6,956 161.5 71.620 0.44334 6 5,217 0.707 7,376 2,158.6 95.750 0.04436 Totals Latest: 32,637.00 Dev: 0.93 Ultimate: 35,106.70 IBNR: 2,469.70 Mack S.E.: 146.62 CV(IBNR): 0.059366227164502 Message d'avis : In Mack.S.E(CL[["Models"]], FullTriangle, est.sigma = est.sigma, 'loglinear' model to estimate sigma_n doesn't appear appropriate p-value > 5. est.sigma will be overwritten to 'Mack'. Mack's estimation method will be used instead.
> Y=as.vector(INC) > D=rep(1:6,each=6) > A=rep(2001:2006,6) > base=data.frame(Y,D,A) > reg=glm(Y~as.factor(D)+as.factor(A), + data=base,family=poisson(link="log")) Erreur dans eval(expr, envir, enclos) : les valeurs négatives sont interdites pour la famille poisson
- Prendre de l'argent à droite et à gauche
[3,] 3871 1474 -7 82 NA NAOn peut renflouer en prenant à gauche,
[3,] 3871 1467 0 82 NA NAou à droite
[3,] 3871 1474 0 75 NA NAEn faisant ces opérations, on change seulement localement la courbe de paiements pour la troisième année de survenance. On peut se demander si le fait de prendre à gauche a un impact sur l'estimation du montant de provisions, ou sur l'incertitude associée. Pour ça, on peut utiliser les fonctions suivantes,
library(ChainLadder) CL=function(T){ sum( MackChainLadder(T)$FullTriangle[,ncol(T)] -diag(T[,ncol(T):1]))} CL.SE=function(T){ MackChainLadder(T)$Total.Mack.S.E} CumInc=function(T){ m=T for(i in 2:nrow(T)){m[,i]=apply(T[,1:i],1,sum)} return(m)}
VCL=rep(NA,8) for(j in 1:8){ INCd=INC INCd[3,2:4]=INC[3,2:4]+c(1-j,+7,j-1-7) VCL[j]=CL(CumInc(INCd))} plot(1:8,VCL,type="b",col="blue",xlim=c(0,9),ylim=c(2462,2474)) VCL=rep(NA,10) for(j in 1:10){ INCd=INC INCd[3,2:4]=INC[3,2:4]+c(1-j,+9,j-1-9) VCL[j]=CL(CumInc(INCd))} lines(0:9,VCL,type="b",pch=0,col="red")avec la courbe bleu si on renfloue à 0, et rouge si on renfloue à 1, pour l'estimation du montant total de provisions,

VCL=rep(NA,8) for(j in 1:8){ INCd=INC INCd[3,2:4]=INC[3,2:4]+c(1-j,+7,j-1-7) VCL[j]=CL.SE(CumInc(INCd))} plot(1:8,VCL,type="b",col="blue",xlim=c(0,9),ylim=c(130,145)) VCL=rep(NA,10) for(j in 1:10){ INCd=INC INCd[3,2:4]=INC[3,2:4]+c(1-j,+9,j-1-9) VCL[j]=CL.SE(CumInc(INCd))} lines(0:9,VCL,type="b",pch=0,col="red")

- Jouer à faire des translations...
> lm(dist~speed,data=cars) Call: lm(formula = dist ~ speed, data = cars) Coefficients: (Intercept) speed -17.579 3.932 > lm((dist+10)~speed,data=cars) Call: lm(formula = (dist + 10) ~ speed, data = cars) Coefficients: (Intercept) speed -7.579 3.932Autrement dit, la prédiction faite par notre modèle n'est pas modifiée par la translation, à condition d'opérer la translation ensuite sur la prédiction. Sur le dessin ci-dessous, on fait pareil, mais avec une régression de Poisson: la courbe noire est sur les données brutes, la courbe bleu est obtenue sur les points translatés vers le haut, et la rouge si on translate la prédiction sur les points translatés,
Si la translation est trop importante, la prédiction finale (en rouge) se retrouve davantage éloignée de la vraie valeur (en noir).
Pareillement, on peut translater nos paiements vers le haut dans les triangles, de manière à avoir des paiements positifs. On peut commencer par translater tout le triangle, par exemple en translatant juste assez pour que tous les incréments soient positifs ou nuls,
> k=7 > Y=as.vector(INC)+k > D=rep(1:6,each=6) > A=rep(2001:2006,6) > base=data.frame(Y,D,A) > reg=glm(Y~as.factor(D)+as.factor(A), + data=base,family=poisson(link="log")) > Yp=predict(reg,type="response", + newdata=base)-k > sum(Yp[is.na(Y)==TRUE]) [1] 2508.620
> K=7:20 > R=rep(NA,length(K)) > for(i in 1:length(K)){ + k=K[i] + Y=as.vector(INC)+k + D=rep(1:6,each=6) + A=rep(2001:2006,6) + base=data.frame(Y,D,A) + reg=glm(Y~as.factor(D)+as.factor(A), + data=base,family=poisson(link="log")) + Yp=predict(reg,type="response", + newdata=base)-k + R[i]=sum(Yp[is.na(Y)==TRUE])} > plot(K,R,xlim=c(0,20),ylim=c(2465,max(R))) > abline(lm(R~K),col="blue") > (yp=predict(lm(R~K),newdata=(K=0))) 1 2470.199 > points(0,yp,col="red",pch=19)

> K=7:20 > R=rep(NA,length(K)) > for(i in 1:length(K)){ + k=K[i] + Y=as.vector(INC) + D=rep(1:6,each=6) + A=rep(2001:2006,6) + Y[D==3]=Y[D==3]+k + base=data.frame(Y,D,A) + reg=glm(Y~as.factor(D)+as.factor(A), + data=base,family=poisson(link="log")) + Yp=predict(reg,type="response", + newdata=base) + Yp[D==3]=Yp[D==3]-k + R[i]=sum(Yp[is.na(Y)==TRUE])} > predict(lm(R~K),newdata=(K=0)) 1 2469.703Tiens, on retombe exactement sur l'estimateur de la méthode chain ladder... Étonnant, non ?

Si des praticiens ont des commentaires sur les incréments négatifs, les commentaires sont ouverts (et peu modérés), donc racontez nous comment vous faites, je suis preneur...

correspond au nombre de sinistres observés pour l'assuré
correspond à l'exposition (i.e. au temps pendant lequel l'assuré a été observé dans la base),
est la première variable, ici le carburant (qui est une variable qualitative prenant 2 modalités),
est la seconde variable, ici la zone géographique (qui est encore qualitative, avec 5 zones), et enfin
est la troisième et dernière variable explicative, ici l'âge du conducteur principal (qui est pris ici comme une variable continue). Le modèle s'écrit, si l'on disjoncte les variables qualitatives
où
s'écrit
vaut -2.36, alors que
vaut 0.2244. On a ensuite une estimation de l'écart-type de ces estimateurs, par exemple
vaut 0.086. On peut alors utiliser un test de significative basé sur une hypothèse de normalité de ces estimateurs. On note que l'âge du conducteur est significatif dans ce modèle. Pour les 
est un processus de Poisson (désignant le nombre de sinistres survenant entre
et
), alors
suit une loi de Poisson de paramètre
.
sont deux variables de Poisson indépendantes.
, pour un assuré présent pendant une durée
, le nombre de sinistre suit une loi de Poisson
.


et
.

avec en 




Les ordres de grandeur des prédictions ne sont pas valides ici... Néanmoins, il est possible d'utiliser des poids, comme on le voit sur le calcul rapide ci-dessous,


Suite au cours de mardi, j'ai mis
sera de la forme














At the end of the report on standard ratemaking (

, and if
's are Gamma distributed
, with
and
, then
defined as the compound Poisson variable has aTweedie distribution with power
=1, so the theoretical power value should have been around 1.5. The same programme with 

(almost) recently, a classmate working in an insurance company told me he had
too large datasets to run simple regressions (GLM, which involves optimization issues), and that they were
thinking of a reward for the one who will write the best R-code (at least the
fastest). My first idea was to use subsampling techniques, saying that
10 regressions on 100,000 observations can take less time than a
regression on 1,000,000 observations. And perhaps provide also better results...


is a spline function (just to make it as general as possible, since in insurance ratemaking, we include continuous variates that do not influence claims frequency linearly in the score). Yes,
there might be also useless variables, including one of them which is
strongly correlated with one that has an impact in the regression. The
code to generate the dataset is simply
) of the dataset. 




subsamples (of equal size), and run
, as function of 
and a confidence interval, defined as


the previous one being now the








