Statistique de l’assurance STT6705V, partie 12 bis
[This article was first published on Freakonometrics - Tag - R-english, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
In the previous post (here) discussing forecasts of actuarial quantities, I did not mention much how to forecast the temporal component in the Lee-Carter model. Actually, many things can be done. Consider here some exponential smoothing techniques (see here for more details). For instance, with a simple model, with an additive error, no trend and no seasonal component,Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
or equivalently
Then , and if we want a confidence interval
> (ETS.ANN=ets(Y,model="ANN")) ETS(A,N,N) Call: ets(y = Y, model = "ANN") Smoothing parameters: alpha = 0.7039 Initial states: l = 75.0358 sigma: 11.4136 AIC AICc BIC 941.0089 941.1339 946.1991 > plot(forecast(ETS.ANN,h=100))Here, a natural idea will probably be to take into account a linear trend on the series, i.e.
where
then the forecast we make is i.e.
ETS.AAN=ets(Y,model="AAN") plot(forecast(ETS.AAN,h=100))It is also possible to ask for an “optimal” exponential smoothing model (without any specification)
> ETS ETS(A,A,N) Call: ets(y = Y) Smoothing parameters: alpha = 0.6107 beta = 1e-04 Initial states: l = 74.5622 b = -1.9812 sigma: 11.0094 AIC AICc BIC 937.8695 938.2950 948.2500 > plot(forecast(ETS,h=100))
Another idea can be to consider some autoregressive integrated moving average models (ARIMA), here with a linear trend
For instance, if we want only the integrated component, i.e.
then the code is
> ARIMA010T=Arima(Y,order=c(0,1,0),include.drift=TRUE) Series: Y ARIMA(0,1,0) with drift Call: Arima(x = Y, order = c(0, 1, 0), include.drift = TRUE) Coefficients: drift -2.0337 s.e. 1.1904 sigma^2 estimated as 138.9: log likelihood = -380.8 AIC = 765.6 AICc = 765.73 BIC = 770.77 > plot(forecast(ARIMA010T,h=100))But note that any kind of ARIMA model can be considered, e.g. integrated with an autoregressive component (here of order 1)
or with also a moving average component (again of order 1)
Actually, note that, once again, we can ask for an automatic selection of the model,
> (autoARIMA=auto.arima(Y,allowdrift=TRUE)) Series: Y ARIMA(0,1,1) with drift Call: auto.arima(x = Y, allowdrift = TRUE) Coefficients: ma1 drift -0.3868 -2.0139 s.e. 0.0970 0.6894 sigma^2 estimated as 122.3: log likelihood = -374.65 AIC = 755.29 AICc = 755.55 BIC = 763.05 > plot(forecast(autoARIMA,h=100))
Finally, it is possible to use also also some specific functions of the package, for instance to consider a random walk with a drift,
RWF=rwf(Y,h=100,drift=TRUE) plot(RWF)or Holt model (with a trend)
HOLT=holt(Y,h=100,damped=TRUE) plot(HOLT)And if all that is not enough, it is also possible to go further by changing the size of the series we use to fit the model. A question that naturally arises is the treatment of wars in our model: shouldn’t we assume that the forecast should be based only on the last 50 years (and exclude wars from our analysis) ? In that case, for instance, the exponential smoothing technique gives
while the ARIMA procedure returns
And finally, with the Holt technique, we have
So, it looks like we have a lot of techniques that can be used to provide a forecast for the temporal component in the Lee-Carter model,
All those estimators can be used to estimate annuities of insurance contracts (as here),
BASEB=BASEB[,1:99] BASEC=BASEC[,1:99] AGE=AGE[1:99] library(gnm) D=as.vector(BASEB) E=as.vector(BASEC) A=rep(AGE,each=length(ANNEE)) Y=rep(ANNEE,length(AGE)) base=data.frame(D,E,A,Y,a=as.factor(A), y=as.factor(Y)) LC2=gnm(D~a+Mult(a,y),offset=log(E), family=poisson,data=base) A=LC2$coefficients[1]+LC2$coefficients[2:99] B=LC2$coefficients[100:198] K0=LC2$coefficients[199:297] Y=as.numeric(K01) K1=c(K0,forecast(ets(Y),h=120)$mean) K2=c(K0,forecast(auto.arima(Y,allowdrift=TRUE),h=120)$mean) K3=c(K0,rwf(Y,h=120,drift=TRUE)$mean) K4=c(K0,holt(Y,h=120,drift=TRUE)$mean) K5=c(K0,forecast(ets(Y[50:99]),h=120)$mean) K6=c(K0,forecast(auto.arima(Y[50:99],allowdrift=TRUE),h=120)$mean) K7=c(K0,rwf(Y[50:99],h=120,drift=TRUE)$mean) K8=c(K0,holt(Y[50:99],h=120,drift=TRUE)$mean) MU=matrix(NA,length(A),length(K1)) MU1=MU2=MU3=MU4=MU5=MU6=MU7=MU8=MU for(i in 1:length(A)){ for(j in 1:length(K1)){ MU1[i,j]=exp(A[i]+B[i]*K1[j]) MU2[i,j]=exp(A[i]+B[i]*K5[j]) MU3[i,j]=exp(A[i]+B[i]*K3[j]) MU4[i,j]=exp(A[i]+B[i]*K4[j]) MU5[i,j]=exp(A[i]+B[i]*K5[j]) MU6[i,j]=exp(A[i]+B[i]*K6[j]) MU7[i,j]=exp(A[i]+B[i]*K7[j]) MU8[i,j]=exp(A[i]+B[i]*K8[j]) }} t=2000 x=40 s=seq(0,98-x-1) Pxt1=cumprod(exp(-diag(MU1[x+1+s,t+s-1898]))) Pxt2=cumprod(exp(-diag(MU2[x+1+s,t+s-1898]))) Pxt3=cumprod(exp(-diag(MU3[x+1+s,t+s-1898]))) Pxt4=cumprod(exp(-diag(MU4[x+1+s,t+s-1898]))) Pxt5=cumprod(exp(-diag(MU5[x+1+s,t+s-1898]))) Pxt6=cumprod(exp(-diag(MU6[x+1+s,t+s-1898]))) Pxt7=cumprod(exp(-diag(MU7[x+1+s,t+s-1898]))) Pxt8=cumprod(exp(-diag(MU8[x+1+s,t+s-1898]))) r=.035 m=70 h=seq(0,21) V1=1/(1+r)^(m-x+h)*Pxt1[m-x+h] V2=1/(1+r)^(m-x+h)*Pxt2[m-x+h] V3=1/(1+r)^(m-x+h)*Pxt3[m-x+h] V4=1/(1+r)^(m-x+h)*Pxt4[m-x+h] V5=1/(1+r)^(m-x+h)*Pxt5[m-x+h] V6=1/(1+r)^(m-x+h)*Pxt6[m-x+h] V7=1/(1+r)^(m-x+h)*Pxt7[m-x+h] V8=1/(1+r)^(m-x+h)*Pxt8[m-x+h]Hence, here the difference is significant,
> M=cbind(V1,V2,V3,V4,V5,V6,V7,V8) > apply(M,2,sum) V1 V2 V3 V4 V5 V6 V7 V8 4.389372 4.632793 4.406465 4.389372 4.632793 4.468934 4.482064 4.632793or graphically,
To leave a comment for the author, please follow the link and comment on their blog: Freakonometrics - Tag - R-english.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.