链梯法更新
链梯法的弊端和更新
链梯法是精算常用的方法,但是链梯法的问题也很大,需要重新翻看资料,按照写一篇论文的方式去研究这个问题。
chapter0
在此之前,先试着自动生成一组自动化脚本,记录下链梯法的预测过程,生成前后预实估计偏差。
案例数据:
Y
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 3209 1163 39 17 7 21
[2,] 3367 1292 37 24 10 NA
[3,] 3871 1474 53 22 NA NA
[4,] 4239 1678 103 NA NA NA
[5,] 4929 1865 NA NA NA NA
[6,] 5217 NA NA NA NA NA
import numpy as np
import pandas as pd
from statsmodels.formula.api import glm
from statsmodels.genmod.families import Poisson
# 原始矩阵(NA 用 np.nan)
Y = [
[3209, 1163, 39, 17, 7, 21],
[3367, 1292, 37, 24, 10, np.nan],
[3871, 1474, 53, 22, np.nan, np.nan],
[4239, 1678, 103, np.nan, np.nan, np.nan],
[4929, 1865, np.nan, np.nan, np.nan, np.nan],
[5217, np.nan, np.nan, np.nan, np.nan, np.nan]
]
df_mat = pd.DataFrame(Y, index=range(1, 7), columns=range(1, 7))
# 转为长表:ai = 行索引 (origin year), bj = 列索引 (dev year)
df_long = df_mat.reset_index().melt(id_vars='index', var_name='bj', value_name='y')
df_long = df_long.rename(columns={'index': 'ai'})
# 删除 NA 观测(R 中的 NA 相当于这里的缺失)
df_obs = df_long.dropna(subset=['y']).copy()
# 确保 ai,bj 为类别(可选:statsmodels 的 C(...) 会自动处理)
df_obs['ai'] = df_obs['ai'].astype(int).astype('category')
df_obs['bj'] = df_obs['bj'].astype(int).astype('category')
# 拟合 Poisson GLM,等价 R: y ~ as.factor(ai) + as.factor(bj), family = poisson
model = glm(formula='y ~ C(ai) + C(bj)', data=df_obs, family=Poisson()).fit()
print(model.summary())
# 预测(包含原来缺失的位置也可以做预测)
df_long['ai'] = df_long['ai'].astype(int).astype('category')
df_long['bj'] = df_long['bj'].astype(int).astype('category')
# 为所有格子产生预测值(自动对缺失格也能预测)
df_long['yhat'] = model.predict(df_long)
# 如果只想看原始有观测的预测:
df_obs['yhat'] = model.predict(df_obs)
# 把预测结果 pivot 回矩阵形式(方便查看三角)
pred_mat = df_long.pivot(index='ai', columns='bj', values='yhat').sort_index().sort_index(axis=1)
print(pred_mat)