SAS按列分组分析目标变量cus12与四类自变量依赖的循环编写求助
SAS单变量与目标值依赖关系批量分析的循环实现问题
需求说明
- 分析目标变量
cus12与各自变量的依赖关联 - 所用数据集共1000列,自变量按命名规则可划分为
app_x、act_x、agr_x、ags_x四个组别 - 需编写循环逻辑,遍历上述四个分组内的所有自变量,批量探究其与
cus12的依赖关系
现存卡点
- 循环结构的编写逻辑不清晰
- 循环中嵌入适配SAS过程步的实现存在困难
当前已编写的SAS代码
%let src=C:\Users\chlop\Desktop\ProjektSAS; %let out=C:\Users\chlop\Desktop\ProjektSAS\wyj; libname src "&src" compress=yes; libname out "&out" compress=yes; /* 构造建模分析集 */ data out.test; set src.train; drop app_char_job_code app_char_marital_status app_char_city app_char_home_status app_char_cars act: agr: ags: default_cus3 default_cus6 default_cus9; where period<'200405'; run; /* 按变量序号排序变量元数据表 */ proc sort data=names; by varnum; run; %let target = default_cus12; *建模用目标变量; /* 从变量元数据表筛选待分析变量,排除指定无关变量 */ proc sql; select name from names where name ne "app_char_job_code" and name ne "app_char_marital_status" and name ne "app_char_city" and name ne "app_char_home_status" and name ne "app_char_cars" and name ne "cid" and name ne "period" and name ne "&target"; quit; /* 将筛选得到的待分析变量存入宏变量,以空格分隔 */ proc sql; select name into:zmienne separeted by ' ' from names where name ne "app_char_job_code" and name ne "app_char_marital_status" and name ne "app_char_city" and name ne "app_char_home_status" and name ne "app_char_cars" and name ne "cid" and name ne "period" and name ne "&target"; quit; %put &zmienne; /* 测试按空格拆分变量列表的宏逻辑 */ %macro a(lista); %do i=1 %to 3; %put %scan(&lista, &i, ' '); *注意分隔符设置; %end; %mend; %a(&zmienne); /* 批量计算单变量GINI系数的宏 */ %macro gini(in, target, vars); /* 初始化GINI结果存储表 */ data gini_tab; length zmienna $ 50. gini 8.; delete; run; /* 获取待分析变量总个数 */ proc sql noprint; select count(*) into :n from names; quit; /* 循环遍历每个变量计算GINI值 */ %do i=1 %to &n; %let zm = %scan(&vars, &i,' '); *注意分隔符,按顺序选取变量; /* 输出Logistic过程的关联度结果集 */ ods output Association=gini; proc logistic data=∈ model &target = &zm; run; ods output close; /* 提取Somers'D值,换算为GINI系数 */ proc sql; select nValue2 into :g_coef from gini where Label2 contains "Somers"; quit; %put Gini: &zm = &g_coef; /* 存储当前变量的GINI计算结果 */ data tmp; length zmienna $ 50. gini 8.; zmienna = "&zm"; gini = &g_coef; run; /* 将结果追加到总结果表 */ proc append base=gini_tab data=tmp force; run; %end; /* 按GINI值从高到低排序最终结果 */ proc sort data=gini_tab; by descending gini; run; %mend; /* 调用宏执行批量GINI计算 */ %gini(src.train, default_cus12, &zmienne);
内容的提问来源于stack exchange,提问作者Piotr Kowalski
相关产品推荐
相关产品推荐

