You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

保险数据集多元加权线性回归(WLS)权重确定方法问询

针对保险重复保单数据集的WLS正确实现方案

核心问题分析

你的数据集存在同一保单多行记录的聚类特性,普通OLS残差计算权重时忽略了保单内的相关性,且异常值会干扰残差-拟合值的拟合结果,这是导致WLS效果差、行被排除的核心原因。以下是分步解决方法:


一、先构建保单层面的权重(解决聚类相关性)

同一保单的多行记录属于同一观测单元,残差具有相关性,因此需给同一保单的所有行分配相同权重,权重基于保单层面的变异计算:

  1. 计算每个保单的行数,并聚合保单层面的拟合值与残差:
# 新增保单列名假设为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
)
  1. 稳健拟合残差绝对值与拟合值的关系(避免异常值干扰):
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
  1. 将权重映射回原数据集的每一行:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 04:45:41