%MM_Severity_Create_Scorecode Autocall Macro

Creates DATA step statements to compute the predicted values of a model that you create using the SEVERITY procedure.

Syntax

Arguments

ParmEst=severity-parmeter-estimate-dataset

specifies the name of the parameter estimations output data. This data set is created when you specify the OUTEST= option in the PROC SEVERITY statement.

ModelInfo=model-info-data-set

specifies the name of the model information output data set. This data set is created when you specify the OUTMODELINGINFO= option in the PROC SEVERITY statement.

FileRef=output-fileref

specifies the fileref that defines the location of the macro output files.

Default The SAS log

PredPrefix=dependent-variable-prefix

specifies a prefix for the predicted dependent variable. The variable is named in the PROC SEVERITY LOSS= statement. When is prefix is applied to the dependent variable, this new name becomes the prediction variable.

Default P_

Details

To create score code for a model that you create with PROC SEVERITY, include the following SAS code:
  1. Use a LIBNAME statement to identify the location of the output that you create using PROC SEVERITY.
  2. Build your model using PROC SEVERITY. Specify the OUTEST= option to create the ParameterEstimates data. Specify OUTMODELINFO= option to create the ModelInformation data set. Close the ODS OUTPUT destination.
  3. Use the FILENAME statement to define a fileref for the macro output location.
  4. Invoke the %MM_Severity_Create_Scorecode Macro.

Example: Generate the PROC SEVERITY Score Code for Insurance Risk

Create the Sample Insurance Data

%let MyProj = C:\Users\myID;
%let MyProj = C:\MyJob\Projects;
libname Severity "&MyProj.\Severity\Test";
   
data Severity.phf;
   
   /* Regression Coefficient for the Intercept Term */
   retain fIntercept 6.8024;
   
   /* Regression Coefficient for continuous AgeDriver */
   retain fAgeDriver 0.01234;
   
   /* Regression Coefficient for the three dummy indicators for nominal CarType */
   retain fCarType_SEDAN 0;
   retain fCarType_SPORT 1.0;
   retain fCarType_TRUCK 0.5;
   
   /* Regression Coefficient for the two dummy indicators for nominal Gender */
   retain fGender_Female -1.5;
   retain fGender_Male 0;
   
   /* Regression Coefficient for the two dummy indicators for nominal HomeOwner */
   retain fHomeOwner_NO 0;
   retain fHomeOwner_YES 0.7;
   
   /* Regression Coefficient for continuous IS */
   retain fIS -0.00456;
   
   /* Regression Coefficient for continuous MileageDriven */
   retain fMileageDriven 0.013579;
   
   /* Variable Labels */
   label AgeDriver = 'Age of Driver';
   
   label AmountLoss = 'Amount of Loss in Dollars';
   format AmountLoss dollar.;
   
   label CarType_SEDAN = 'Indicator of Car Type is Sedan';
   label CarType_SPORT = 'Indicator of Car Type is Sport';
   label CarType_TRUCK = 'Indicator of Car Type is Truck';
   
   label EExp = 'Earned Exposure in Units of One Year';
   
   label ExpYr = 'Exposure Year';
   
   label Gender_Female = 'Indicator of Gender is Female';
   label Gender_Male = 'Indicator of Gender is Male';
   
   label HomeOwner_NO = 'Indicator of Home Ownership is No';
   label HomeOwner_YES = 'Indicator of Home Ownership is Yes';
   
   label IS = 'Insurance Score of Driver';
   
   label MileageDriven = 'Mileage Driven in Units of 1,000 Miles';
   
   label PolicyId = 'Policy Identifier';
   
   call streaminit(27513);
     do PolicyId = 00001 to 99999;
       StartYr = 2000 + 
                 rand('table', 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1);
         do ExpYr = StartYr to 2011;
            EExp = rand('uniform');
   
            AgeDriver = 18 + rand('binomial',0.375, 72);
   
            CarType_SEDAN = 0;
            CarType_SPORT = 0;
            CarType_TRUCK = 0;
            select (rand('table', 0.4999, 0.2999, 0.1999, 0.0003));
               when (1) CarType_SEDAN = 1;
               when (2) CarType_SPORT = 1;
               when (3) CarType_TRUCK = 1;
               otherwise
               do;
                  CarType_SEDAN = .;
                  CarType_SPORT = .;
                  CarType_TRUCK = .;
               end;
         end;
   
         Gender_Female = 0;
         Gender_Male = 0;
         if (EExp lt 0.4999) then Gender_Female = 1;
           else if (EExp lt 0.9999) then Gender_Male = 1;
            else
            do;
               Gender_Female = .;
               Gender_Male = .;
            end;
   
            HomeOwner_NO = 0;
            HomeOwner_YES = 0;
            if (rand('bernoulli', 0.25) eq 1) then HomeOwner_YES = 1;
            else HomeOwner_NO = 1;
   
            IS = round(rand('gamma', 600));
            if (IS gt 800) then IS = 800;
            else if (IS lt 1) then IS = 1;
   
            MileageDriven = rand('gamma', 12);      
            /* Annual Mileage Driven in unit of 1000 miles */
   
            if (nmiss(MileageDriven,AgeDriver,CarType_SEDAN,CarType_TRUCK, 
                CarType_SPORT,
                Gender_Male,Gender_Female,
                HomeOwner_YES,HomeOwner_NO,IS) eq 0) 
              then
            do;
               mu = fIntercept
                    + fAgeDriver * (28 - AgeDriver)
                    + fCarType_SEDAN * CarType_SEDAN + fCarType_SPORT 
                    * CarType_SPORT 
                    + fCarType_TRUCK * CarType_TRUCK 
                    + fGender_Female * Gender_Female + fGender_Male 
                    * Gender_Male
                    + fHomeOwner_NO * HomeOwner_NO + fHomeOwner_YES 
                    * HomeOwner_YES
                    + fIS * IS
                    + fMileageDriven * (MileageDriven - 12);
               AmountLoss = exp(mu) * rand('gamma', 25);
            end;
            else AmountLoss = .;
            output;
     end;
    end;
   drop fAgeDriver fCarType_SEDAN fCarType_TRUCK fCarType_SPORT fGender_Male 
        fGender_Female fHomeOwner_YES fHomeOwner_NO fIntercept fIS fMileageDriven;
      drop mu StartYr;
run;

Run the Sample Program

%let MyProj = C:\Users\emdev;
%let MyProj = C:\Users\minlam\Documents\Projects;
libname Severity "&MyProj.\Severity\Test";
  
title "SCALEMODEL and all applicable distributions";
  
%let model = 1;
%let predlist = AgeDriver CarType_SEDAN CarType_TRUCK CarType_SPORT 
     Gender_Male Gender_Female HomeOwner_YES HomeOwner_NO IS MileageDriven;

/* Build the model and obtain the required datasets */
proc severity data = Severity.phf
              outest = Severity.ParamEst_&Model.
              outmodelinfo = Severity.ModelInfo_&model.;
   loss AmountLoss;
   dist _predefined_ stweedie;
   scalemodel &predlist.;
   nloptions maxiter = 1000;
run;
  
/* Define the fileref for the output syntax */
filename ThisFile "&MyProj.\Severity\Test\ScoreCode_&Model..sas";
  
/* Invoke the macro */
%mm_severity_create_scorecode
   (
     ParamEst = Severity.ParamEst_&Model.,
     ModelInfo = Severity.ModelInfo_&model.,
     FileRef = ThisFile,
     PredPrefix = MyPred_,
  );
  
/* Execute the score codes within a DATA STEP */
data Severity.phf_wPrediction;
   set Severity.phf;
   %include ThisFile;
run;
  
proc contents data = Severity.phf_wPrediction;
run;

The Generated Score Code and Output Tables

Generated Score Code
/**********************************************************************/
/* Begin scoring code for SEVERITY                                    */
/* Created By: emdev                                                  */
/* Date: May 15, 2013                                                 */
/* Time: 12:06:28                                                     */
/**********************************************************************/

LENGTH _WARN_ $ 4;
_WARN_ = '    ';
LABEL _WARN_ = "Warnings" ;

_nInputMiss = 0;

/**********************************************************************/
/* Check the SCALEMODEL regression variables                          */
/**********************************************************************/

IF ( MISSING( MileageDriven ) EQ 1 ) THEN _nInputMiss = _nInputMiss + 1;

IF ( MISSING( IS ) EQ 1 ) THEN _nInputMiss = _nInputMiss + 1;

/* NOTE: HomeOwner_NO is not checked for missing values because it is a redundant regressor. */

IF ( MISSING( HomeOwner_YES ) EQ 1 ) THEN _nInputMiss = _nInputMiss + 1;

IF ( MISSING( Gender_Female ) EQ 1 ) THEN _nInputMiss = _nInputMiss + 1;

/* NOTE: Gender_Male is not checked for missing values because it is a redundant regressor. */

IF ( MISSING( CarType_SPORT ) EQ 1 ) THEN _nInputMiss = _nInputMiss + 1;

IF ( MISSING( CarType_TRUCK ) EQ 1 ) THEN _nInputMiss = _nInputMiss + 1;

/* NOTE: CarType_SEDAN is not checked for missing values because it is a redundant regressor. */

IF ( MISSING( AgeDriver ) EQ 1 ) THEN _nInputMiss = _nInputMiss + 1;

/**********************************************************************/
/* Calculate scores only if current record contains valid values      */
/**********************************************************************/

IF ( _nInputMiss EQ 0 ) THEN DO;

   /**********************************************************************/
   /* Distribution: BURR                                                 */
   /**********************************************************************/

   _XBETA_ = 0;
   _XBETA_ = _XBETA_ + 1.344413338897300E-02 * MileageDriven ;
   _XBETA_ = _XBETA_ - 4.570022585401000E-03 * IS ;
   /* NOTE: HomeOwner_NO is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ + 7.004995716974000E-01 * HomeOwner_YES ;
   _XBETA_ = _XBETA_ - 1.499608973328200E+00 * Gender_Female ;
   /* NOTE: Gender_Male is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ + 9.997068084571000E-01 * CarType_SPORT ;
   _XBETA_ = _XBETA_ + 4.992376225576000E-01 * CarType_TRUCK ;
   /* NOTE: CarType_SEDAN is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ - 1.240862927421100E-02 * AgeDriver ;

   /* NOTE: MyPred_AmountLoss_BURR = GAMMA(1 + 1/Gamma) * GAMMA(Alpha - 1/Gamma) / GAMMA(Alpha) * Theta * EXP(_XBETA_) */
   MyPred_AmountLoss_BURR = 2.729080537097400E+04 * EXP(_XBETA_);

   /**********************************************************************/
   /* Distribution: EXP                                                  */
   /**********************************************************************/

   _XBETA_ = 0;
   _XBETA_ = _XBETA_ + 1.344997925413300E-02 * MileageDriven ;
   _XBETA_ = _XBETA_ - 4.570912461736200E-03 * IS ;
   /* NOTE: HomeOwner_NO is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ + 7.006247728147500E-01 * HomeOwner_YES ;
   _XBETA_ = _XBETA_ - 1.499520049919700E+00 * Gender_Female ;
   /* NOTE: Gender_Male is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ + 9.998154659889200E-01 * CarType_SPORT ;
   _XBETA_ = _XBETA_ + 4.991760040523900E-01 * CarType_TRUCK ;
   /* NOTE: CarType_SEDAN is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ - 1.240552808055000E-02 * AgeDriver ;

   /* NOTE: MyPred_AmountLoss_EXP = 1 * Theta * EXP(_XBETA_) */
   MyPred_AmountLoss_EXP = 2.730403090782800E+04 * EXP(_XBETA_);

   /**********************************************************************/
   /* Distribution: GAMMA                                                */
   /**********************************************************************/

   _XBETA_ = 0;
   _XBETA_ = _XBETA_ + 1.344997933121800E-02 * MileageDriven ;
   _XBETA_ = _XBETA_ - 4.570912459089100E-03 * IS ;
   /* NOTE: HomeOwner_NO is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ + 7.006247729158700E-01 * HomeOwner_YES ;
   _XBETA_ = _XBETA_ - 1.499520049929900E+00 * Gender_Female ;
   /* NOTE: Gender_Male is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ + 9.998154662540800E-01 * CarType_SPORT ;
   _XBETA_ = _XBETA_ + 4.991760039384900E-01 * CarType_TRUCK ;
   /* NOTE: CarType_SEDAN is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ - 1.240552804902500E-02 * AgeDriver ;

   /* NOTE: MyPred_AmountLoss_GAMMA = Alpha * Theta * EXP(_XBETA_) */
   MyPred_AmountLoss_GAMMA = 2.730405549354900E+04 * EXP(_XBETA_);
   /**********************************************************************/
   /* Distribution: GPD                                                  */
   /**********************************************************************/

   _XBETA_ = 0;
   _XBETA_ = _XBETA_ + 1.345090198095600E-02 * MileageDriven ;
   _XBETA_ = _XBETA_ - 4.569987445112400E-03 * IS ;
   /* NOTE: HomeOwner_NO is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ + 7.006260117108500E-01 * HomeOwner_YES ;
   _XBETA_ = _XBETA_ - 1.499518185889600E+00 * Gender_Female ;
   /* NOTE: Gender_Male is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ + 9.998173115643000E-01 * CarType_SPORT ;
   _XBETA_ = _XBETA_ + 4.991779592407300E-01 * CarType_TRUCK ;
   /* NOTE: CarType_SEDAN is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ - 1.240306956097400E-02 * AgeDriver ;

   /* NOTE: MyPred_AmountLoss_GPD = 1 / (1 - Xi) * Theta * EXP(_XBETA_) */
   MyPred_AmountLoss_GPD = 2.728530960810300E+04 * EXP(_XBETA_);

   /**********************************************************************/
   /* Distribution: IGAUSS                                               */
   /**********************************************************************/

   _XBETA_ = 0;
   _XBETA_ = _XBETA_ + 1.344333259472700E-02 * MileageDriven ;
   _XBETA_ = _XBETA_ - 4.572143035437300E-03 * IS ;
   /* NOTE: HomeOwner_NO is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ + 7.006130278360900E-01 * HomeOwner_YES ;
   _XBETA_ = _XBETA_ - 1.499413162869200E+00 * Gender_Female ;
   /* NOTE: Gender_Male is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ + 9.997768449055400E-01 * CarType_SPORT ;
   _XBETA_ = _XBETA_ + 4.991467916958200E-01 * CarType_TRUCK ;
   /* NOTE: CarType_SEDAN is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ - 1.241894446056000E-02 * AgeDriver ;

   /* NOTE: MyPred_AmountLoss_IGAUSS = 1 * Theta * EXP(_XBETA_) */
   MyPred_AmountLoss_IGAUSS = 2.734200065401500E+04 * EXP(_XBETA_);

   /**********************************************************************/
   /* Distribution: LOGN                                                 */
   /**********************************************************************/

   _XBETA_ = 0;
   _XBETA_ = _XBETA_ + 1.344165732039300E-02 * MileageDriven ;
   _XBETA_ = _XBETA_ - 4.571943993968500E-03 * IS ;
   /* NOTE: HomeOwner_NO is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ + 7.006057373962000E-01 * HomeOwner_YES ;
   _XBETA_ = _XBETA_ - 1.499427525786600E+00 * Gender_Female ;
   /* NOTE: Gender_Male is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ + 9.997737501240600E-01 * CarType_SPORT ;
   _XBETA_ = _XBETA_ + 4.991635085860000E-01 * CarType_TRUCK ;
   /* NOTE: CarType_SEDAN is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ - 1.241995587270100E-02 * AgeDriver ;

   /* NOTE: MyPred_AmountLoss_LOGN = EXP(Sigma*Sigma/2) * EXP(Mu) * EXP(_XBETA_) */
   MyPred_AmountLoss_LOGN = 2.734808258530300E+04 * EXP(_XBETA_);
   /**********************************************************************/
   /* Distribution: PARETO                                               */
   /**********************************************************************/

   _XBETA_ = 0;
   _XBETA_ = _XBETA_ + 1.344702841631400E-02 * MileageDriven ;
   _XBETA_ = _XBETA_ - 4.573870525107900E-03 * IS ;
   /* NOTE: HomeOwner_NO is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ + 7.006208104018000E-01 * HomeOwner_YES ;
   _XBETA_ = _XBETA_ - 1.499526007562500E+00 * Gender_Female ;
   /* NOTE: Gender_Male is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ + 9.998095632861300E-01 * CarType_SPORT ;
   _XBETA_ = _XBETA_ + 4.991697518801100E-01 * CarType_TRUCK ;
   /* NOTE: CarType_SEDAN is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ - 1.241339040886400E-02 * AgeDriver ;

   /* NOTE: MyPred_AmountLoss_PARETO = 1 / (Alpha - 1) * Theta * EXP(_XBETA_) */
   MyPred_AmountLoss_PARETO = 2.736400276713000E+04 * EXP(_XBETA_);

   /**********************************************************************/
   /* Distribution: STWEEDIE                                             */
   /**********************************************************************/

   _XBETA_ = 0;
   _XBETA_ = _XBETA_ + 1.345898239828500E-02 * MileageDriven ;
   _XBETA_ = _XBETA_ - 4.570041179676800E-03 * IS ;
   /* NOTE: HomeOwner_NO is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ + 7.006207334939600E-01 * HomeOwner_YES ;
   _XBETA_ = _XBETA_ - 1.499496885374900E+00 * Gender_Female ;
   /* NOTE: Gender_Male is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ + 9.998043617045600E-01 * CarType_SPORT ;
   _XBETA_ = _XBETA_ + 4.991607418998200E-01 * CarType_TRUCK ;
   /* NOTE: CarType_SEDAN is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ - 1.239129336545400E-02 * AgeDriver ;

   /* NOTE: MyPred_AmountLoss_STWEEDIE = Lambda * (2 - P) / (P - 1) * Theta * EXP(_XBETA_) */
   MyPred_AmountLoss_STWEEDIE = 2.726265339822600E+04 * EXP(_XBETA_);

   /**********************************************************************/
   /* Distribution: WEIBULL                                              */
   /**********************************************************************/

   _XBETA_ = 0;
   _XBETA_ = _XBETA_ + 1.350103959448200E-02 * MileageDriven ;
   _XBETA_ = _XBETA_ - 4.569462924201300E-03 * IS ;
   /* NOTE: HomeOwner_NO is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ + 7.007182928623600E-01 * HomeOwner_YES ;
   _XBETA_ = _XBETA_ - 1.499697786981000E+00 * Gender_Female ;
   /* NOTE: Gender_Male is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ + 1.000109511872200E+00 * CarType_SPORT ;
   _XBETA_ = _XBETA_ + 4.989436512356800E-01 * CarType_TRUCK ;
   /* NOTE: CarType_SEDAN is skipped because it is a redundant regressor. */
   _XBETA_ = _XBETA_ - 1.233857684563600E-02 * AgeDriver ;

   /* NOTE: MyPred_AmountLoss_WEIBULL = GAMMA(1 + 1/Tau) * Theta * EXP(_XBETA_) */
   MyPred_AmountLoss_WEIBULL = 2.707248194039600E+04 * EXP(_XBETA_);

END;

ELSE DO;

   /**********************************************************************/
   /* Set _WARN_ value                                                   */
   /**********************************************************************/

   SUBSTR(_WARN_,1,1) = 'M';
END;

LABEL MyPred_AmountLoss_BURR = "Predicted Mean for the Burr Distribution" ;

LABEL MyPred_AmountLoss_EXP = "Predicted Mean for the Exponential Distribution" ;

LABEL MyPred_AmountLoss_GAMMA = "Predicted Mean for the Gamma Distribution" ;

LABEL MyPred_AmountLoss_GPD = "Predicted Mean for the Generalized Pareto Distribution" ;

LABEL MyPred_AmountLoss_IGAUSS = "Predicted Mean for the Inverse Gaussian Distribution" ;

LABEL MyPred_AmountLoss_LOGN = "Predicted Mean for the Lognormal Distribution" ;

LABEL MyPred_AmountLoss_PARETO = "Predicted Mean for the Pareto Distribution" ;

LABEL MyPred_AmountLoss_STWEEDIE = "Predicted Mean for the Tweedie Distribution with Scale Parameter" ;

LABEL MyPred_AmountLoss_WEIBULL = "Predicted Mean for the Weibull Distribution" ;

DROP _nInputMiss _XBETA_;

/**********************************************************************/
/* End scoring code for SEVERITY                                      */
/**********************************************************************/
The following tables are a sampling of the output tables that are created by the example. For each distribution type, PROC SEVERITY creates these tables: Distribution Information, Convergence Status, Optimization Summary, Fit Statistics, and Parameterization Estimation. The output displays the tables for the stweedie distribution.
The SEVERITY Procedure Input Data Set and Model Selection Table
The SEVERITY Procedure Distribution, Convergence, and Optimization Tables
The SEVERITY Procedure Fit Statistics Table
The SEVERITY Procedure Parameter Estimates Table
The CONTENTS Procedure Output
The CONTENTS Procedure Engine and Host Information
The CONTENTS Procedure Variable Listing