基于expectreg包从期望分位数束估计条件密度的问题
使用expectreg包估计条件分布Y|X的问题排查
我用R的expectreg包,基于Kaggle Allstate Claims Severity数据集,非参数估计给定X(cont4)下Y(loss)的条件分布Y|X,已经用expectreg.ls()拟合出密集期望分位数束,但在估计任意cont4值对应的loss条件密度时遇到两个问题:
- 使用
cdf.qp()函数传入x=0.3时,得到的密度曲线不符合分布逻辑,结果不合理; - 使用
cdf.bundle()函数得到了平滑的密度曲线,但无法指定X值,不清楚该密度对应的cont4取值,且返回的densities$x既不是cont4也不是loss。
问题1:cdf.qp()的使用误区
cdf.qp()的x参数不是指定X(cont4)的取值,而是分位数的概率水平(比如0.1、0.5这类分位数点),直接传入cont4的值完全不符合函数逻辑,这是导致结果异常的核心原因。正确流程是:
- 先针对目标cont4值,用拟合好的模型预测对应的分位数束:
# 假设拟合好的模型对象名为fit target_cont4 <- 0.3 pred_quantiles <- predict(fit, newdata = data.frame(cont4 = target_cont4)) - 定义loss的取值网格,将预测的分位数束传入
cdf.qp()计算条件CDF,再通过差分近似得到密度:# 自定义loss的取值范围 loss_grid <- seq(min(your_data$loss), max(your_data$loss), length.out = 100) # 计算条件CDF cond_cdf <- cdf.qp(q = pred_quantiles, y = loss_grid) # 差分得到密度曲线 cond_density <- diff(cond_cdf) / diff(loss_grid)
问题2:cdf.bundle()的功能定位
cdf.bundle()是基于训练数据中所有X对应的分位数束,生成全局平均意义上的CDF和密度曲线,本身不支持指定单个X值。如果要获取特定cont4下的条件密度,必须用上面predict()+cdf.qp()的流程。
另外,densities$x对应的是loss的取值网格,不是cont4。你可以通过y参数自定义loss的取值范围,比如:
loss_grid <- seq(0, 10000, length.out = 200) bundle_result <- cdf.bundle(fit, y = loss_grid) # 此时bundle_result$densities$x就是你定义的loss_grid
关于包功能的说明
expectreg包的功能是完整的,但函数参数的命名和逻辑容易产生误解:
- 所有针对特定X的条件分布计算,都需要先通过
predict()得到该X对应的分位数束,再用cdf.qp()推导CDF和密度; cdf.bundle()仅用于查看分位数束的整体分布特征,不适合单个X的条件分布估计。
内容的提问来源于stack exchange,提问作者bikeactuary
相关产品推荐
相关产品推荐

