楼主: 阿扁V5
2070 1

[程序分享] 单变量分析的sas宏 [推广有奖]

  • 1关注
  • 43粉丝

版主

山野小子

已卖:965份资源

副教授

94%

还不是VIP/贵宾

-

威望
0
论坛币
-28984312 个
通用积分
3823.6007
学术水平
108 点
热心指数
119 点
信用等级
91 点
经验
49334 点
帖子
1168
精华
1
在线时间
651 小时
注册时间
2013-3-22
最后登录
2024-3-17

楼主
阿扁V5 学生认证  发表于 2017-7-6 16:16:41 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
如题所示,下面给出一个单变量分析的sas宏,对建立评分卡的探索分析工作非常有帮助,只需输入一个数据集,数据集的每一个变量的缺失情况,0值情况,排序后按groups个数百分比占比分析等等,简单实用,去掉工作中的重复劳动,其中sasin=是输入数据集,其他为空则分析全部变量,好用请点赞哦!


  1. %MACRO CROSSTAB(SASIN=,VARLIST=,ADDVAR=,DROPLIST=,TARGET=,GROUPS=10,
  2.                 PRTORDER=PVALUE,RISKTITL=1 -- HIGH RISK);

  3.   /*------------------------------------------------------------------
  4.     THIS MACRO DIVIDES EACH VARIABLE IN THE 'VARLIST' INTO
  5.     DECILES, COMPUTE THE 'TARGET' RATES (EG. RESPONSE RATE, BAD RATE,
  6.     ETC.) IN EACH DECILE, AND MEAN OF ALL 'ADDVAR' VARIABLES

  7.     PRTORDER: TAKES VALUE OF 'PVALUE' OR 'VARIABLE', IT DETERMINES THE
  8.               PRINT ORDER: BY P-VALUE OR ALPHABETIC ORDER OF VARIABLE NAMES
  9.     DROPLIST: OVERRIDES VARLIST
  10.   -------------------------------------------------------------------*/

  11. OPTIONS NOCENTER PS=120 PAGENO=1;

  12. * DM 'LOG'    CLEAR;
  13. * DM 'OUTPUT' CLEAR;

  14.   %IF &TARGET= %THEN %DO;
  15.     %LET TARGET=DUMMYZZZ;
  16.   %END;


  17.   DATA SASINZZZ;
  18.     SET &SASIN;
  19.     %IF &TARGET=DUMMYZZZ %THEN %DO;
  20.       &TARGET=1;
  21.     %END;
  22.     %IF &DROPLIST NE %THEN %DO;
  23.       DROP &DROPLIST;
  24.     %END;
  25.     %ELSE %IF &VARLIST NE %THEN %DO;
  26.       KEEP &VARLIST &TARGET &ADDVAR;
  27.     %END;
  28.     RUN;


  29.   PROC CONTENTS DATA=SASINZZZ (DROP=&TARGET &ADDVAR)
  30.     OUT=DTCONTS (KEEP=NAME LABEL TYPE) NOPRINT;
  31.     RUN;

  32.   DATA DTCONTS;
  33.     SET DTCONTS;
  34.     NAME=UPCASE(NAME);
  35.     RUN;

  36.   PROC SORT DATA=DTCONTS;
  37.     BY NAME;
  38.     RUN;

  39.   DATA DTCONTS;
  40.     SET DTCONTS;
  41.     RANK='RK' || LEFT(_N_);
  42.     RUN;


  43.   DATA _NULL_;
  44.     SET DTCONTS END=FINAL;
  45.     I+1;
  46.     CALL SYMPUT('VAR_A'||LEFT(I),TRIM(NAME));
  47.     IF TYPE=1 THEN CALL SYMPUT('RK_A'||LEFT(I),TRIM(RANK));
  48.     ELSE           CALL SYMPUT('RK_A'||LEFT(I),TRIM(NAME));
  49.     CALL SYMPUT('LBL'|| LEFT(I),TRIM(LABEL));
  50.     CALL SYMPUT('TYPE'||LEFT(I),TYPE);
  51.     IF FINAL THEN CALL SYMPUT('N_TZ',LEFT(I));
  52.     RUN;


  53.   %DO I=1 %TO &N_TZ;
  54.     %LET SASMEAN=SASINZZZ;
  55.     %IF &&TYPE&I=1 %THEN %DO;
  56.       %LET SASMEAN=SASINTMP;
  57.       PROC RANK DATA=SASINZZZ (KEEP=&&VAR_A&I &TARGET &ADDVAR)
  58.                 OUT=SASINTMP GROUPS=&GROUPS;
  59.         VAR &&VAR_A&I;
  60.         RANKS RANKTMP;
  61.         RUN;


  62.       DATA SASINTMP;
  63.         SET SASINTMP;
  64.         &&RK_A&I=PUT(RANKTMP,2.);
  65.         DROP RANKTMP;
  66.         RUN;
  67.     %END;


  68.     PROC MEANS DATA=&SASMEAN (KEEP=&&VAR_A&I &TARGET &&RK_A&I &ADDVAR)
  69.                MISSING NOPRINT;
  70.       CLASS &&RK_A&I;
  71.       %IF &&TYPE&I = 1 %THEN %DO;
  72.         VAR &&VAR_A&I &TARGET &ADDVAR;
  73.         OUTPUT OUT=MEANOZZZ MEAN(&TARGET &ADDVAR)=
  74.                             MEAN(&&VAR_A&I)=MEAN_
  75.                             MIN(&&VAR_A&I)=MIN_
  76.                             MAX(&&VAR_A&I)=MAX_;

  77.       %END;
  78.       %ELSE %DO;
  79.         VAR &TARGET &ADDVAR;
  80.         OUTPUT OUT=MEANOZZZ MEAN=;
  81.       %END;
  82.       RUN;


  83.     *** CALCULATE P-VALUE FOR ROW AND COLUMN INDEPENDENCE;

  84.     %LET DOCHISQ=Y;
  85.     DATA _NULL_;
  86.       SET MEANOZZZ END=FINAL;
  87.       IF _TYPE_=0 AND (&TARGET=0 OR &TARGET=1) THEN
  88.         CALL SYMPUT('DOCHISQ','N');
  89.       IF FINAL AND _N_=2 THEN
  90.         CALL SYMPUT('DOCHISQ','N');
  91.       RUN;


  92.     DATA CHISQA;
  93.       SET MEANOZZZ;
  94.       IF _TYPE_>0;
  95.       GROUPZ='A';
  96.       WGT=ROUND(_FREQ_*&TARGET,1);
  97.       RUN;



  98.     DATA CHISQB;
  99.       SET MEANOZZZ;
  100.       IF _TYPE_>0;
  101.       GROUPZ='B';
  102.       WGT=_FREQ_-ROUND(_FREQ_*&TARGET,1);
  103.       RUN;


  104.     DATA CHISQ;
  105.       SET CHISQA CHISQB;
  106.       KEEP &&RK_A&I GROUPZ WGT;
  107.       RUN;

  108.     %IF &DOCHISQ=N %THEN %DO;
  109.       DATA FREQOUT;
  110.         LENGTH VARNAME $15;
  111.         _PCHI_=0;
  112.         P_PCHI=1;
  113.         VARNAME="&&VAR_A&I";
  114.         RUN;

  115.     %END;
  116.     %ELSE %DO;
  117.       PROC FREQ DATA=CHISQ NOPRINT;
  118.         WEIGHT WGT;
  119.         TABLES &&RK_A&I*GROUPZ/CHISQ MISSING;
  120.         OUTPUT OUT=FREQOUT (KEEP=_PCHI_ P_PCHI) PCHI;
  121.         RUN;

  122.       DATA FREQOUT;
  123.         LENGTH VARNAME $15;
  124.         SET FREQOUT;
  125.         VARNAME="&&VAR_A&I";
  126.         RUN;
  127.     %END;


  128.     PROC APPEND BASE=PVALUE DATA=FREQOUT;
  129.     RUN;

  130.     **** CREATE PRINT OUT FILES;

  131.     DATA MEANOZZZ;
  132.       SET MEANOZZZ;
  133.       RETAIN TOTAL AVGODDS;


  134.       IF &TARGET=1 THEN ODDS=0;
  135.       ELSE ODDS=&TARGET/(1 - &TARGET);
  136.       IF _TYPE_=0 THEN DO;
  137.         TOTAL=_FREQ_;
  138.         AVGODDS=ODDS;
  139.       END;
  140.       IF _TYPE_=1 AND &&RK_A&I=' ' THEN &&RK_A&I='-1';


  141.       FREQPCT=_FREQ_/TOTAL*100;
  142.       &TARGET=&TARGET*100;
  143.       IF AVGODDS=0 THEN STDODDS=0; ELSE STDODDS=ODDS/AVGODDS;
  144.       RUN;

  145.     PROC SORT DATA=MEANOZZZ OUT=MEANO&I;
  146.       BY DESCENDING _TYPE_;
  147.       RUN;


  148.     %IF %EVAL(&I/50)*50 = &I %THEN %DO;
  149.       OPTIONS NOTES;
  150.       PROC DATASETS;
  151.         DELETE SASINTMP MEANOZZZ CHISQA CHISQB CHISQ FREQOUT;
  152.         QUIT;
  153.     %END;
  154.     %ELSE %DO;
  155.       OPTIONS NONOTES;
  156.     %END;
  157.   %END;


  158.   DATA PVALUE;
  159.     SET PVALUE;
  160.     ORD_ALPH=_N_;
  161.     CALL SYMPUT('PCHI'|| LEFT(_N_),TRIM(PUT(_PCHI_,8.)));
  162.     RUN;

  163.   PROC SORT DATA=PVALUE; BY DESCENDING _PCHI_; RUN;

  164.   DATA PVALUE;
  165.     SET PVALUE;
  166.     ORD_PCHI=_N_;
  167.     CALL SYMPUT('OALPH'|| LEFT(_N_),TRIM(ORD_ALPH));
  168.     RUN;


  169.   %MACRO PRINTIT(I);
  170.     PROC PRINT DATA=MEANO&I (DROP=_TYPE_) SPLIT='*';
  171.       VAR &&RK_A&I
  172.       %IF &&TYPE&I=1 %THEN %DO;
  173.         MIN_ MAX_ MEAN_
  174.       %END;
  175.       _FREQ_ FREQPCT
  176.       %IF &TARGET NE DUMMYZZZ %THEN %DO;
  177.         &TARGET STDODDS

  178.       %END;
  179.       &ADDVAR;
  180.       LABEL
  181.         MIN_='MIN'
  182.         MAX_='MAX'
  183.         MEAN_='MEAN'
  184.         &&RK_A&I='RANK/VALUE'
  185.         _FREQ_='FREQ'
  186.         FREQPCT='%FREQ'
  187.         &TARGET='%1'
  188.         STDODDS='STANDARDIZED*ODDS RATIO(%1)'
  189.         ;

  190.       FORMAT &&RK_A&I $RANKFT. FREQPCT &TARGET STDODDS
  191.              MEAN_ &ADDVAR 8.4;
  192.       RUN;
  193.   %MEND PRINTIT;

  194.   TITLE3 "TABLE FOR DEPENDENT VARIABLE: &TARGET, &RISKTITL";
  195.   TITLE4 " ";


  196.   %DO J=1 %TO &N_TZ;
  197.     %IF %UPCASE(%SUBSTR(&PRTORDER,1,1))=P %THEN %LET I=&&OALPH&J;
  198.     %ELSE %LET I=&J;
  199.     %IF &J=1 %THEN %DO;
  200.       TITLE5
  201.     %END;
  202.     %ELSE %DO;
  203.       TITLE1 " ";
  204.       TITLE2
  205.     %END;
  206.     "&&VAR_A&I --- &&LBL&I, _PCHI_ --- &&PCHI&I";
  207.     %PRINTIT(&I);
  208.   %END;


  209.   %IF %UPCASE(%SUBSTR(&PRTORDER,1,1))=P %THEN %DO;
  210.     PROC SORT DATA=PVALUE; BY ORD_ALPH; RUN;

  211.     TITLE1 " ";
  212.     TITLE2 "ALPHABETIC ORDER OF VARIABLES";

  213.     DATA _NULL_;
  214.       SET PVALUE;
  215.       FILE PRINT LS=110;
  216.       PUT
  217.       VARNAME $15. +2
  218.       ORD_PCHI 4.  +1
  219.       @@;
  220.       RUN;


  221.     PROC SORT DATA=PVALUE; BY ORD_PCHI; RUN;

  222.     TITLE1 " ";
  223.     TITLE2 "P-VLUE ORDER OF VARIABLES";

  224.     DATA _NULL_;
  225.       SET PVALUE;
  226.       FILE PRINT LS=110;
  227.       PUT
  228.       VARNAME $15. +2
  229.       ORD_PCHI 4.  +1
  230.       @@;
  231.       RUN;
  232.   %END;


  233.   OPTIONS NOTES;

  234.   PROC DATASETS;
  235.     DELETE DTCONTS SASINZZZ MEANO1 - MEANO&N_TZ PVALUE;
  236.     QUIT;
  237.   TITLE;
  238. %MEND CROSSTAB;
复制代码

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:SAS宏 单变量 independence Standardized standardize

憧憬机器学习的世界!

沙发
阿扁V5 学生认证  发表于 2017-7-6 16:24:03
sas code贴上来之后发现格式有点乱了,不过复制到txt文档里阅读无障碍,使用也无障碍!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 13:05