GLM基础(四):SAS计算车险纯保费示例
数据说明
行数:2182,列数:7
| 变量名称 | 说明 |
|---|---|
| Kilometres | 车辆的行驶距离分组,有5个level,取值为1-5 |
| Zone | 地理区域分区, 有7个分类,取值为1-7 |
| Bonus | 司机的历史索赔分级,和NCD近似,有7个level,取值为1-7 |
| Make | 此处指车辆种类,有9个分类,取值为1-9 |
| Insured | 承保的风险单位数,“已赚保单年”在该行分类下的汇总,取值0.01从到127687.3 |
| Claims | 案件数量 |
| Payment | 总赔款 |
数据示例:
| Kilometres | Zone | Bonus | Make | Insured | Claims | Payment |
|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 455.13 | 108 | 392491 |
| 1 | 1 | 1 | 2 | 69.17 | 19 | 46221 |
| 1 | 1 | 1 | 3 | 72.88 | 13 | 15694 |
数据来源: Frees, Edward W. Regression modeling with actuarial and financial applications. Cambridge University Press, 2009.
输入数据
PROC IMPORT 步骤:
DATAFILE=REFFILE指定要导入的CSV文件的路径和文件名。DBMS=CSV指定要导入的文件类型为CSV格式。OUT=glm.swe指定导入后创建的数据集的名称为 “glm.swe”。GETNAMES=YES指定导入的CSV文件的第一行包含变量名。RUN;执行PROC IMPORT步骤。
PROC CONTENTS 用于查看导入的数据集 “glm.swe” 的变量名、类型、长度等。
1/*指定REFFILE作为要导入的CSV文件的路径*/
2FILENAME REFFILE '/[文件路径]/SwedishMotorInsurance.csv';
3
4PROC IMPORT DATAFILE=REFFILE
5 DBMS=CSV
6 OUT=glm.swe;
7 GETNAMES=YES;
8RUN;
9
10PROC CONTENTS DATA=glm.swe; RUN;
分别拟合索赔频率和索赔强度
纯保费 = 出险率 * 案均赔款 = 索赔频率 * 索赔强度
索赔频率 = 出险率 = 案件数量 / 已赚件数
索赔强度 = 案均赔款 = 总赔款 / 案件数量
新建变量索赔频率frequency和索赔强度severity作为GLM模型的目标变量。
1data glm.swe;
2set glm.swe;
3severity=Payment/Claims;
4frequency=Claims/Insured;
5run;
索赔频率泊松模型
data=glm.swe; 指定数据集。
class kilometres(ref="2") zone(ref="1") bonus make; 指定分类变量,SAS默认使用字母降序最大值(例如Z)作为base level(reference level)。应使用观测数最多的level作为base,默认base不符合则使用ref强制指定。
model frequecy = kilometres zone bonus make 指定frequency是因变量,kilometres zone bonus make是自变量。
/dist=poisson link=log; 使用泊松分布和log link function。
ods output parameterestimates=glm.frequency; 将参数估计结果输出指定数据集。在SAS中,ODS代表"Output Delivery System",用于控制和管理输出结果的格式、位置和样式。ODS允许将SAS过程和过程输出以多种不同的格式输出,例如HTML、PDF、RTF、Excel等。
weight insured; 指定使用 “insured” 变量作为权重。
run; 执行 proc genmod 步骤。
1proc genmod data=glm.swe;
2class kilometres(ref="2") zone(ref="1") bonus make;
3model frequency = kilometres zone bonus make/dist=poisson link=log;
4ods output parameterestimates=glm.frequency;
5weight insured;
6run;
对应的R代码
指定reference level:
1swe$Kilometres <- relevel(swe$Kilometres, ref = "2")
拟合模型,输出结果应与SAS一致。
1freq <- glm(frequency ~ Kilometres + Zone + Bonus + Make,
2 family = poisson, data = swe, weights = Insured)
索赔强度伽马模型
使用的语句和前述模型一致,目标变量替换为severity,指定分布为gamma。
weight claims; 指定使用 “claims” 变量作为权重。
1proc genmod data=glm.swe;
2class kilometres(ref="2") zone(ref="1") bonus make;
3model severity = kilometres zone bonus make/dist=gamma link=log;
4ods output parameterestimates=glm.severity;
5weight claims;
6run;
对应的R代码
Gamma分布的canonical link是inverse function,但此处选择了log link function。
log link function通常用于处理正数响应变量,如计数数据或severity等级。
inverse link function通常用于处理正数响应变量的倒数,例如某些测量的时间间隔。如果此处选择inverse link,参数的magnitude将会非常小。
1sev <- glm(severity ~ Kilometres + Zone + Bonus + Make,
2 family = Gamma(link = "log"), data = swe, weights = Claims)