保险数据集多元加权线性回归(WLS)权重确定方法问询
针对保险重复保单数据集的WLS正确实现方案
核心问题分析
你的数据集存在同一保单多行记录的聚类特性,普通OLS残差计算权重时忽略了保单内的相关性,且异常值会干扰残差-拟合值的拟合结果,这是导致WLS效果差、行被排除的核心原因。以下是分步解决方法:
一、先构建保单层面的权重(解决聚类相关性)
同一保单的多行记录属于同一观测单元,残差具有相关性,因此需给同一保单的所有行分配相同权重,权重基于保单层面的变异计算:
- 计算每个保单的行数,并聚合保单层面的拟合值与残差:
# 新增保单列名假设为policy_id,根据你的实际列名修改 df$policy_count <- ave(rep(1, nrow(df)), df$policy_id, FUN = length) # 按保单聚合,取拟合值和残差的均值 policy_level <- aggregate( list(fitted = reg$fitted.values, residual = reg$residuals), by = list(policy_id = df$policy_id), FUN = mean )
- 稳健拟合残差绝对值与拟合值的关系(避免异常值干扰):
library(MASS) # 用稳健线性回归替代普通lm,减少异常值影响 abs_resid_model <- rlm(abs(residual) ~ fitted, data = policy_level) # 计算保单权重,加小常数避免除以0 policy_level$wt_policy <- 1 / (abs_resid_model$fitted.values + 1e-6)^2
- 将权重映射回原数据集的每一行:
df <- merge(df, policy_level[, c("policy_id", "wt_policy")], by = "policy_id")
二、执行修正后的WLS模型
用保单层面的权重替代原每行权重,避免同一保单内权重不一致的问题:
wls_model <- lm(log(Premium) ~ Limit + Deductible + Peril1 + Peril2 + Peril3 + Peril4 + Peril5 + Peril6 + State1 + State2 + State3 + State4, data = df, weight = wt_policy)
三、解决行被排除的问题
之前行被排除是因为残差拟合值出现0/负数,导致权重无穷大或无效,上述步骤中:
- 加入
1e-6小常数避免除以0 - 用
rlm稳健拟合减少异常值对拟合结果的干扰 - 若仍有问题,可提前过滤异常值:
# 用Cook距离识别并移除极端异常点 cooksd <- cooks.distance(reg) df_clean <- df[cooksd < 4/nrow(df), ]
再基于df_clean重新计算权重和WLS模型。
四、进阶优化:结合混合效应模型
由于保单内记录存在相关性,仅用WLS仍可能忽略聚类误差,可同时引入随机截距模型:
library(lme4) # 加入保单随机截距,同时保留WLS权重 wls_mixed <- lmer(log(Premium) ~ Limit + Deductible + Peril1 + Peril2 + Peril3 + Peril4 + Peril5 + Peril6 + State1 + State2 + State3 + State4 + (1 | policy_id), data = df, weights = wt_policy)
内容的提问来源于stack exchange,提问作者meg
相关产品推荐
相关产品推荐

