如何用R基于利润区间与资产十分位数构建双维度分桶并计算破产率?
实现双维度(利润区间+资产十分位)分桶并计算破产率
核心思路
先通过cut()将利润(LOGPNL)划分为指定区间,再以利润区间为分组维度,在每个组内对总资产(LOGBAL)计算十分位分桶,最后按双维度分桶分组统计破产率及其他指标。
完整实现代码
# 加载依赖包 library(dplyr) # 数据准备(复用你的代码) mydf <- data.frame( Insolve = my_data$FLAG, profit = my_data$LOGPNL, assets = my_data$LOGBAL ) # 1. 定义利润区间(可根据业务需求调整breaks参数) # 示例:将-30到30的利润按每10为间隔划分区间,包含最小值 mydf <- mydf %>% mutate(profit_bin = cut(profit, breaks = seq(-30, 30, 10), include.lowest = TRUE)) # 2. 在每个利润区间内,对资产计算十分位分桶 mydf <- mydf %>% group_by(profit_bin) %>% mutate(asset_decile = ntile(assets, 10)) %>% ungroup() # 取消分组,避免后续操作受影响 # 3. 按双维度分桶分组,计算统计指标(包含破产率) bucket_stats <- mydf %>% group_by(profit_bin, asset_decile) %>% summarise( total_n = n(), insolvency_n = sum(Insolve), insolvency_rate = insolvency_n / total_n, # 破产率 assets_mean = mean(assets, na.rm = TRUE), assets_sd = sd(assets, na.rm = TRUE), profits_mean = mean(profit, na.rm = TRUE), profits_sd = sd(profit, na.rm = TRUE), .groups = "drop" # 自动取消分组 ) # (可选)提取单个双维度分桶的数据,比如利润区间[-30,-20]且资产十分位为1的组 target_bucket <- mydf %>% filter(profit_bin == "[-30,-20]" & asset_decile == 1)
关键细节说明
- 利润区间自定义:
cut()的breaks参数可灵活调整,比如按分位数划分(quantile(mydf$profit, seq(0,1,0.2))),或按业务逻辑划分负利润、零利润、正利润区间。 - 组内十分位计算:通过
group_by(profit_bin)后调用ntile(),确保资产的十分位是在每个利润区间内部计算的,而非全局计算。 - 破产率计算:用
n()获取每个分桶的总样本数,除以破产数得到破产率,更直观反映分桶的破产风险。 - 替代手动filter:无需像原代码那样逐个生成dc1到dc10,直接用
filter()指定双维度条件即可提取目标分桶,或用group_split()将所有分桶拆分为列表。
内容的提问来源于stack exchange,提问作者StMatthias
相关产品推荐
相关产品推荐

