Mean Square Error of Prediction for Estimated Ultimate Claims
This example shows a workflow for estimating ultimate claims using a developmentTriangle
object with simulated reported claims and then calculating the corresponding mean square error of prediction (MSEP).
Actuaries use different techniques to estimate the ultimate claims for different years. In addition to the claim values, an actuary needs to know how well the estimates predict the outcomes of random variables and the uncertainties in the estimates for the ultimate claims. To measure the quality of the estimated ultimate claims, you can calculate the MSEP.
Load Data
load('InsuranceClaimsData.mat');
disp(head(data));
OriginYear DevelopmentYear ReportedClaims PaidClaims __________ _______________ ______________ __________ 2010 12 3995.7 1893.9 2010 24 4635 3371.2 2010 36 4866.8 4079.1 2010 48 4964.1 4487 2010 60 5013.7 4711.4 2010 72 5038.8 4805.6 2010 84 5059 4853.7 2010 96 5074.1 4877.9
Create developmentTriangle
Create a developmentTriangle
object and use claimsPlot
to visualize the developmentTriangle
. For more information on unpaid claims estimation, see Overview of Claims Estimation Methods for Non-Life Insurance
dTriangle = developmentTriangle(data,'Origin','OriginYear','Development','DevelopmentYear','Claims','ReportedClaims'); dTriangleTable = view(dTriangle); % Visualize the development triangle claimsPlot(dTriangle);
Analyze developmentTriangle
Use linkRatios
to calculate the age-to-age factors.
factorsTable = linkRatios(dTriangle);
Use linkRatioAverages
to calculate the averages of the age-to-age factors.
averageFactorsTable = linkRatioAverages(dTriangle);
dTriangle.SelectedLinkRatio = averageFactorsTable{'Volume-weighted Average',:};
dTriangle.TailFactor = 1;
selectedFactorsTable = cdfSummary(dTriangle);
Display the full development triangle using the fullTriangle
function.
fullTriangleTable = fullTriangle(dTriangle); disp(fullTriangleTable);
12 24 36 48 60 72 84 96 108 120 Ultimate ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ________ 2010 3995.7 4635 4866.8 4964.1 5013.7 5038.8 5059 5074.1 5084.3 5089.4 5089.4 2011 3968 4682.3 4963.2 5062.5 5113.1 5138.7 5154.1 5169.6 5179.9 5185.1 5185.1 2012 4217 5060.4 5364 5508.9 5558.4 5586.2 5608.6 5625.4 5636.7 5642.3 5642.3 2013 4374.2 5205.3 5517.7 5661.1 5740.4 5780.6 5803.7 5821.1 5832.7 5838.6 5838.6 2014 4499.7 5309.6 5628.2 5785.8 5849.4 5878.7 5900.8 5918.5 5930.3 5936.3 5936.3 2015 4530.2 5300.4 5565.4 5715.7 5772.8 5804.1 5825.9 5843.4 5855.1 5861 5861 2016 4572.6 5304.2 5569.5 5714.3 5775.4 5806.7 5828.6 5846.1 5857.7 5863.6 5863.6 2017 4680.6 5523.1 5854.4 6000.9 6065.1 6098 6120.9 6139.3 6151.6 6157.7 6157.7 2018 4696.7 5495.1 5804.4 5949.6 6013.3 6045.9 6068.6 6086.8 6099 6105.1 6105.1 2019 4945.9 5819.2 6146.7 6300.5 6367.9 6402.4 6426.5 6445.8 6458.7 6465.2 6465.2
Compute the total reserves using ultimateClaims
.
IBNR = ultimateClaims(dTriangle) - dTriangle.LatestDiagonal; IBNR = array2table(IBNR, 'RowNames', dTriangleTable.Properties.RowNames, 'VariableNames', {'IBNR'}); IBNR{'Total',1} = sum(IBNR{:,:}); disp(IBNR);
IBNR ______ 2010 0 2011 5.1857 2012 16.89 2013 34.886 2014 57.583 2015 88.148 2016 149.34 2017 303.29 2018 609.99 2019 1519.3 Total 2784.6
Calculate Estimated Standard Deviations
The developmentTriange
link ratios are estimated using the formula:
Along, with the link ratios, the variance parameters are estimated as:
Since the last variance parameter cannot be estimated with the estimator , the Mack extrapolation method is used to estimate of :
Using this formula, you can compute the estimated conditional process standard deviations.
currentSelectedFactors = dTriangle.SelectedLinkRatio; estimatedStandardDeviations = currentSelectedFactors; for i=1:width(estimatedStandardDeviations)-1 estimatedStandardDeviations(1,i) = sqrt(sum(((factorsTable{1:end-i,i} - currentSelectedFactors(:,i)).^2).*dTriangleTable{1:end-i,i}) / (height(dTriangleTable)-i-1)); end estimatedStandardDeviations(1,end) = sqrt(min([estimatedStandardDeviations(1,end-1)^4 / estimatedStandardDeviations(1,end-2)^2, estimatedStandardDeviations(1,end-2)^2, estimatedStandardDeviations(1,end-1)^2]));
Calculate Reserves and Estimated Conditional Process Standard Deviations
Using the latest developmentTriange
diagonal information and projected ultimate claims from the developmentTriangle
object, the ReservesTable
is calculated.
h = height(dTriangleTable); ReservesTable = array2table(NaN(h, 9)); ReservesTable.Properties.RowNames = dTriangleTable.Properties.RowNames; ReservesTable.Properties.VariableNames = {'Latest Diagonal','Projected Ultimate Claims','Reserves','Estimated conditional process standard deviation','Estimated conditional variational coefficient','Conditional Var_hat','variation for Var_hat','MSEP','MSEP Uncertainty'}; ReservesTable.("Latest Diagonal") = dTriangle.LatestDiagonal; ReservesTable.("Projected Ultimate Claims") = ultimateClaims(dTriangle); ReservesTable.("Reserves") = IBNR.IBNR(1:end-1,:);
Estimate the conditional process variance for the ultimate claim of a single accident year as:
and estimate the conditional process variance for aggregated accident years as:
Calculate the estimated conditional variational coefficient for origin year relative to the estimated reserves as:
summationFactors = zeros(1,h); for i=length(summationFactors)-1:-1:1 summationFactors(i) = (estimatedStandardDeviations(1,i)^2 / currentSelectedFactors(1,i)^2) / dTriangle.LatestDiagonal(h-i+1) + summationFactors(i+1); end summationFactors = fliplr(summationFactors)'; ReservesTable.("Estimated conditional process standard deviation") = sqrt(ReservesTable.("Projected Ultimate Claims").^2 .* summationFactors); ReservesTable.("Estimated conditional variational coefficient") = ReservesTable.("Estimated conditional process standard deviation") ./ ReservesTable.("Reserves") * 100; ReservesTable('Total',:) = array2table([NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN]); ReservesTable{"Total","Reserves"} = sum(ReservesTable.("Reserves")(1:end-1)); ReservesTable{"Total","Estimated conditional process standard deviation"} = sqrt(sum(ReservesTable.("Estimated conditional process standard deviation")(1:end-1).^2)); ReservesTable{"Total","Estimated conditional variational coefficient"} = ReservesTable{"Total","Estimated conditional process standard deviation"} / ReservesTable{"Total","Reserves"} * 100; disp(ReservesTable(:,(2:5)));
Projected Ultimate Claims Reserves Estimated conditional process standard deviation Estimated conditional variational coefficient _________________________ ________ ________________________________________________ _____________________________________________ 2010 5089.4 0 0 NaN 2011 5185.1 5.1857 0.0072309 0.13944 2012 5642.3 16.89 0.011214 0.066397 2013 5838.6 34.886 0.014452 0.041426 2014 5936.3 57.583 2.7832 4.8333 2015 5861 88.148 5.8489 6.6353 2016 5863.6 149.34 11.634 7.7906 2017 6157.7 303.29 22.586 7.4472 2018 6105.1 609.99 36.512 5.9856 2019 6465.2 1519.3 77.982 5.1329 Total NaN 2784.6 90.01 3.2324
In addition to these calculated estimates, you can obtain the estimator for the conditional estimation error for origin year as:
where
factor1 = zeros(h,1); factor2 = zeros(h,1); factor1(2) = currentSelectedFactors(1,h-1)^2 + estimatedStandardDeviations(1,h-1)^2/sum(dTriangleTable{1,h-1}); factor2(2) = currentSelectedFactors(1,h-1)^2; for i = 3:length(factor1) factor1(i) = (currentSelectedFactors(1,h-i+1)^2 + estimatedStandardDeviations(1,h-i+1)^2/sum(dTriangleTable{1:i-1,h-i+1})) * factor1(i-1); factor2(i) = currentSelectedFactors(1,h-i+1)^2 * factor2(i-1); end Var_hat = sqrt(dTriangle.LatestDiagonal.^2 .* (factor1 - factor2)); ReservesTable.("Conditional Var_hat")(1:end-1) = Var_hat; ReservesTable.("variation for Var_hat")(1:end-1) = ReservesTable.("Conditional Var_hat")(1:end-1) ./ ReservesTable.("Reserves")(1:end-1) * 100;
Using the previous formulas, the estimator for the conditional MSEP of the ultimate claim for a single origin year is:
And the estimator for the conditional MSEP of the ultimate claim for aggregated origin years is:
summationFactorsMSEP = zeros(h,1); for i=2:length(summationFactorsMSEP) summationFactorsMSEP(i) = (((estimatedStandardDeviations(1,h-i+1)^2 / currentSelectedFactors(1,h-i+1)^2)) * (inv(dTriangle.LatestDiagonal(i)) + inv(sum(dTriangleTable{1:i-1,h-i+1})))) + summationFactorsMSEP(i-1); end msep = sqrt(ReservesTable.("Projected Ultimate Claims")(1:end-1).^2 .* summationFactorsMSEP); ReservesTable.MSEP(1:end-1) = msep; ReservesTable.("MSEP Uncertainty")(1:end-1) = ReservesTable.MSEP(1:end-1) ./ ReservesTable.("Reserves")(1:end-1) * 100; ReservesTable{'Total','Conditional Var_hat'} = sqrt(sum(ReservesTable.("Conditional Var_hat")(1:end-1).^2)); ReservesTable{'Total','variation for Var_hat'} = ReservesTable{'Total','Conditional Var_hat'} / ReservesTable{'Total','Reserves'} * 100; disp(ReservesTable(:,[2,3,6,7]));
Projected Ultimate Claims Reserves Conditional Var_hat variation for Var_hat _________________________ ________ ___________________ _____________________ 2010 5089.4 0 0 NaN 2011 5185.1 5.1857 0.0072985 0.14074 2012 5642.3 16.89 0.0099066 0.058655 2013 5838.6 34.886 0.011503 0.032972 2014 5936.3 57.583 1.4539 2.5248 2015 5861 88.148 2.7754 3.1486 2016 5863.6 149.34 5.0379 3.3735 2017 6157.7 303.29 9.1852 3.0285 2018 6105.1 609.99 13.941 2.2854 2019 6465.2 1519.3 28.137 1.852 Total NaN 2784.6 33.25 1.1941
Calculate MSEP
Measure the quality of the estimated ultimate claims by calculating the MSEP
and MSEP Uncertainty
.
summationFactorsCovarianceTerm = zeros(h,1); for i=2:length(summationFactorsCovarianceTerm) summationFactorsCovarianceTerm(i) = ((estimatedStandardDeviations(1,h-i+1)^2 / currentSelectedFactors(1,h-i+1)^2) / sum(dTriangleTable{1:i-1,h-i+1})) + summationFactorsCovarianceTerm(i-1); end totalSum = 0; for i = 2:h totalSum = totalSum + sum(dTriangle.LatestDiagonal(i,1) * fullTriangleTable{i+1:end, h-i+1} * summationFactorsCovarianceTerm(i)); end covarianceTerm = 2 * totalSum; totalMSEP = sqrt(sum(ReservesTable.MSEP(1:end-1) .^ 2) + covarianceTerm); ReservesTable{'Total','MSEP'} = totalMSEP; ReservesTable{'Total','MSEP Uncertainty'} = ReservesTable{'Total','MSEP'} / ReservesTable{'Total','Reserves'} * 100; disp(ReservesTable(:,[1,2,3,8,9]));
Latest Diagonal Projected Ultimate Claims Reserves MSEP MSEP Uncertainty _______________ _________________________ ________ ________ ________________ 2010 5089.4 5089.4 0 0 NaN 2011 5179.9 5185.1 5.1857 0.010274 0.19812 2012 5625.4 5642.3 16.89 0.014963 0.088593 2013 5803.7 5838.6 34.886 0.018471 0.052945 2014 5878.7 5936.3 57.583 3.14 5.453 2015 5772.8 5861 88.148 6.474 7.3445 2016 5714.3 5863.6 149.34 12.678 8.4897 2017 5854.4 6157.7 303.29 24.383 8.0394 2018 5495.1 6105.1 609.99 39.083 6.4071 2019 4945.9 6465.2 1519.3 82.903 5.4568 Total NaN NaN 2784.6 100.45 3.6074
References
Wüthrich, Mario, and Michael Merz. Stochastic Claims Reserving Methods in Insurance. Hoboken, NJ: Wiley, 2008.
Friedland, Jacqueline. "Estimating Unpaid Claims Using Basic Techniques." Arlington, VA: Casualty Actuarial Society, 2010.
See Also
developmentTriangle
| view
| linkRatios
| linkRatiosPlot
| linkRatioAverages
| cdfSummary
| ultimateClaims
| claimsPlot
| fullTriangle
| chainLadder
| expectedClaims
| bornhuetterFerguson
| capeCod