如何在SAS中计算测试组与对照组的Uplift及Uplift_1?
SAS复现Uplift计算方案
针对按risk_level分组,计算测试组/对照组Uplift及Uplift_1的需求,以下是两种可靠的实现方法(假设数据集名为app_data,包含变量:risk_level、group(取值'test'/'control')、loans、approved_apps):
方法一:Proc SQL实现
通过子查询分别计算两组的Uplift,再关联计算Uplift_1,逻辑清晰且易调试:
proc sql; create table uplift_calc as select a.risk_level, a.uplift as test_uplift, b.uplift as control_uplift, -- 处理对照组Uplift为0的情况,避免除以0错误 case when b.uplift = 0 then . else (a.uplift / b.uplift) - 1 end as uplift_1 from -- 计算测试组各risk_level的Uplift (select risk_level, sum(loans)/sum(approved_apps) as uplift from app_data where group = 'test' group by risk_level) as a inner join -- 计算对照组各risk_level的Uplift (select risk_level, sum(loans)/sum(approved_apps) as uplift from app_data where group = 'control' group by risk_level) as b on a.risk_level = b.risk_level; quit;
方法二:Proc Summary + Data步实现
先通过聚合工具生成分组统计值,再用Data步合并计算,适合后续需要对聚合数据做更多扩展处理的场景:
步骤1:生成分组聚合数据
proc summary data=app_data nway; class risk_level group; var loans approved_apps; output out=group_agg sum(loans)=total_loans sum(approved_apps)=total_approved; run;
步骤2:合并并计算Uplift指标
data uplift_calc; merge group_agg(where=(group='test') rename=(total_loans=test_loans total_approved=test_approved)) group_agg(where=(group='control') rename=(total_loans=control_loans total_approved=control_approved)); by risk_level; test_uplift = test_loans / test_approved; control_uplift = control_loans / control_approved; if control_uplift ne 0 then uplift_1 = (test_uplift / control_uplift) - 1; else uplift_1 = .; -- 对照组无有效数据时标记为缺失 keep risk_level test_uplift control_uplift uplift_1; run;
关键说明
- Uplift的计算逻辑为组内总放款数/组内总批准数,符合应用级数据的聚合要求
- 两种方法均处理了
approved_apps总和为0或对照组Uplift为0的异常情况,避免运行错误 - 若你的
loans或approved_apps是比例而非计数变量,只需将sum()改为mean()即可适配
内容的提问来源于stack exchange,提问作者Swati Kanchan
相关产品推荐
相关产品推荐

