Create Weighted LGD Model
This example shows how to use the fitLGDModel function to create an LGD model using weighted portfolio data. There are many reasons to create a weighted LGD model. For example, consider the scenarios where you want to weight newer data more heavily than older data, or weight certain data points more heavily because they are more relevant to the purposes of a business. In this example, you use LGD portfolio data and assign more weight to investment loans than residential loans.
Load Data
First, load the LGD portfolio data which consists of residential and investment type loans.
load LGDData.mat
disp(head(data)) LTV Age Type LGD
_______ _______ ___________ _________
0.89101 0.39716 residential 0.032659
0.70176 2.0939 residential 0.43564
0.72078 2.7948 residential 0.0064766
0.37013 1.237 residential 0.007947
0.36492 2.5818 residential 0
0.796 1.5957 residential 0.14572
0.60203 1.1599 residential 0.025688
0.92005 0.50253 investment 0.063182
Create Weights Variable
In this example, assume that the residential loans in the portfolio principally originate as investment loans or that investment loans tend to be larger. Construct a weights variable and assign weights of 1 and 0.1 for investment and residential loans, respectively.
weightedData = data;
weightedData.WeightsByType = ones(height(weightedData),1);
weightedData.WeightsByType(weightedData.Type=='residential') = 0.1;
disp(head(weightedData)) LTV Age Type LGD WeightsByType
_______ _______ ___________ _________ _____________
0.89101 0.39716 residential 0.032659 0.1
0.70176 2.0939 residential 0.43564 0.1
0.72078 2.7948 residential 0.0064766 0.1
0.37013 1.237 residential 0.007947 0.1
0.36492 2.5818 residential 0 0.1
0.796 1.5957 residential 0.14572 0.1
0.60203 1.1599 residential 0.025688 0.1
0.92005 0.50253 investment 0.063182 1
Create LGD Model
Specify a regression LGD model, and then use fitLGDModel to fit a weighted model with the WeightsVar name-value argument.
LGDmodel = fitLGDModel(weightedData,"regression",PredictorVars={'LTV','Age','Type'},ResponseVar="LGD",WeightsVar="WeightsByType"); disp(LGDmodel)
Regression with properties:
ResponseTransform: "logit"
BoundaryTolerance: 1.0000e-05
ModelID: "Regression"
Description: ""
UnderlyingModel: [1×1 classreg.regr.CompactLinearModel]
PredictorVars: ["LTV" "Age" "Type"]
ResponseVar: "LGD"
WeightsVar: "WeightsByType"
Display the underlying model.
disp(LGDmodel.UnderlyingModel)
Compact linear regression model:
LGD_logit ~ 1 + LTV + Age + Type
Estimated Coefficients:
Estimate SE tStat pValue
________ ________ _______ ___________
(Intercept) -5.029 0.28058 -17.924 8.6279e-69
LTV 3.3166 0.30562 10.852 5.2479e-27
Age -1.6089 0.068496 -23.489 2.2385e-113
Type_investment 1.3639 0.15856 8.6016 1.1698e-17
Number of observations: 3487, Error degrees of freedom: 3483
Root Mean Squared Error: 2.2
R-squared: 0.21, Adjusted R-Squared: 0.21
F-statistic vs. constant model: 309, p-value = 4.17e-178
Validate Model
Use the modelDiscrimination function to view the area under ROC (AUROC) metric for different segments of the validation data. When ShowDetails is true, you have three extra columns in the DiscMeasure output: Segment, SegmentCount, and WeightedCount. Segment shows the segmentation variable value corresponding to the given row. SegmentCount gives the number of data points contained by the given segment, while WeightedCount shows the sum of the weights associated with the segment data. The default weight for each row is 1, so if WeightsVar is not specified or does not exist in the validation data set, then WeightedCount is equal to SegmentCount.
[discMeasure,discData] = modelDiscrimination(LGDmodel,weightedData,DiscretizeBy="median",SegmentBy="Type",ShowDetails=true); disp(discMeasure)
AUROC Segment SegmentCount WeightedCount
_______ _____________ ____________ _____________
Regression, Type=residential 0.69622 "residential" 2889 288.9
Regression, Type=investment 0.69403 "investment" 598 598
Use the modelDiscriminationPlot function to visualize the ROC curves. The plotted curves account for the specified weights.
modelDiscriminationPlot(LGDmodel,data,SegmentBy="Type")
Use the modelCalibration function to evaluate the model performance.
[calMeasure,calData] = modelCalibration(LGDmodel,weightedData); disp(calMeasure)
RSquared RMSE Correlation SampleMeanError
________ _______ ___________ _______________
Regression 0.067776 0.29877 0.26034 0.11801
disp(head(calData))
Observed Predicted_Regression Residuals_Regression Weights
_________ ____________________ ____________________ _______
0.032659 0.062216 -0.029557 0.1
0.43564 0.0023048 0.43334 0.1
0.0064766 0.00079603 0.0056806 0.1
0.007947 0.0030436 0.0049035 0.1
0 0.00034465 -0.00034465 0.1
0.14572 0.0069889 0.13873 0.1
0.025688 0.0074025 0.018285 0.1
0.063182 0.19431 -0.13113 1
Use the modelCalibrationPlot function to visualize the observed LGD compared to the predicted LGD.
modelCalibrationPlot(LGDmodel,data)

See Also
fitLGDModel | Regression | Tobit | Beta | predict | modelDiscrimination | modelDiscriminationPlot | modelCalibration | modelCalibrationPlot | portfolioECL
Topics
- Basic Loss Given Default Model Validation
- Compare Tobit LGD Model to Benchmark Model
- Compare Loss Given Default Models Using Cross-Validation
- Expected Credit Loss Computation
- Incorporate Macroeconomic Scenario Projections in Loan Portfolio ECL Calculations
- Modeling Probabilities of Default with Cox Proportional Hazards
- Overview of Loss Given Default Models