基于data.table的IBNR发展因子计算实现方案求助
IBNR数据处理及发展因子计算实现方案
步骤1:计算累计赔付额
按承保年度(IncurredYear)分组,对各发展年的赔付额做累计求和,生成AmountCumulative字段:
library(data.table) # 原始数据 IBNR <- data.table(IncurredYear=c(2020,2020,2020,2020,2021,2021,2021,2022,2022,2023), DevYear=c(0,1,2,3,0,1,2,0,1,0), Amount=c(100,80,70,50,70,40,35,50,45,80)) # 计算累计赔付额 IBNRCumulative <- IBNR[, AmountCumulative := cumsum(Amount), by = IncurredYear]
步骤2:转换为三角宽表
通过dcast将长表转为宽表,行对应承保年度,列对应发展年,值为累计赔付额:
IBNRtriang <- dcast(IBNRCumulative, IncurredYear ~ DevYear, fun.aggregate = sum, value.var = "AmountCumulative")
注:由于每个(IncurredYear, DevYear)组合唯一,fun.aggregate = sum仅为格式兼容,实际不影响结果。
步骤3:计算发展因子
提取宽表中各发展年对应的列,计算相邻发展年累计赔付总额的比值,最后一个发展因子固定为1:
# 提取发展年对应的列(排除承保年度列) dev_cols <- setdiff(names(IBNRtriang), "IncurredYear") # 计算各发展年的累计赔付总和(忽略NA值) col_sums <- colSums(IBNRtriang[, ..dev_cols], na.rm = TRUE) # 计算发展因子:后一年总和/前一年总和,最后补1 dev_factors <- c(col_sums[-1] / col_sums[-length(col_sums)], 1) # 整理为目标data.table格式 DevelopmentFactor <- data.table(DevYear = as.integer(dev_cols), DevFactor = round(dev_factors, 3))
运行后得到的结果与目标一致:
DevYear DevFactor 1: 0 1.750 2: 1 1.362 3: 2 1.200 4: 3 1.000
内容的提问来源于stack exchange,提问作者highbury
相关产品推荐
相关产品推荐

