设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1603|回复: 0

SAS程序统计方法剔除无关变量

[复制链接]

22

主题

168

金钱

270

积分

入门用户

发表于 2019-9-19 14:34:20 | 显示全部楼层 |阅读模式

  1. /**定义SAS逻辑库mydata,对应于E:\dm目录**/
  2. libname mydata "E:\dm";

  3. /** 读入数据,生成SAS数据集mydata.Credit **/
  4. proc import datafile="E:\data\ch2_credit.csv"
  5.   out=mydata.Credit dbms=DLM;
  6.   /*将数据从Credit.csv文件读入,存储在SAS逻辑库mydata下的数据集Credit中;
  7.     dbms指定读入数据的种类,DLM说明数据是带分隔符的*/
  8.   delimiter=',';
  9.   /*说明分隔符是逗号(缺省分隔符为空格)*/
  10.   getnames=yes;
  11.   /*需要从第一行读入变量名*/
  12. run;
  13. proc print data=mydata.Credit(obs=5);
  14. run;

  15. /**为数据集中的某些变量添加标签,说明变量的具体含义**/
  16. data mydata.Credit;
  17.   set mydata.Credit;
  18.   label age_inferr="inferred age"
  19.         /*推断出的年龄*/
  20.         dob_month="Date of Birth (Month)"
  21.         /*出生月份*/
  22.         dob_year="Date of Birth (Year)"
  23.         /*出生年*/
  24.         buyer_p_="Target: response indicator"
  25.         /*是否响应(因变量)*/
  26.         sex="Gender of the applicant"
  27.         /*性别*/
  28.         married="Marriage status of the applicant"
  29.         /*婚姻状况*/
  30.         children="the indicator for whether having children"
  31.         /*是否有孩子*/
  32.         own_home="the indicator for owning home (vs renting)";
  33.         /*是否拥有(而不是租赁)住房*/
  34. run;


  35. /**对数据集进行基本描述**/
  36. proc contents data=mydata.Credit out=a0 noprint;
  37.   /*被描述的数据集为mydata.Credit,描述结果存入SAS数据集work.a0,
  38.     noprint选项说明不在屏幕上打印描述结果*/
  39. run;

  40. /**定义计算各数值变量描述统计量的宏函数**/
  41. %macro nvardescrip(data=,out=);
  42. /*"%macro"是SAS中的宏语句,说明下面要定义一个宏函数;
  43.   宏函数名称为nvardescrip,参数data指定用于描述的输入数据集,
  44.   参数out指定存储统计描述结果的输出数据集*/

  45.   /**得到输入数据集&data(引用参数data的值)的基本描述**/
  46.   proc contents data=&data out=a0 noprint;
  47.   run;

  48.   /**创建宏变量记录输入数据集中所有数值变量的名称**/
  49.   proc sql;
  50.     select NAME into :nvars separated by ' ' from a0
  51.     where TYPE=1;
  52.     /*nvars是创建的宏变量的名称,它的取值是一个字符串,由所有数值变量
  53.      (work.a0中TYPE取值为1)的名称(work.a0中的NAME)以空格分隔连接而成*/
  54.   quit;

  55.   %let i=1;
  56.   /*"%let"是SAS中的宏语句,此处定义宏变量i并赋予其初始值1*/
  57.   %do %until (%scan(&nvars,&i,' ')=);
  58.   /*"%do %until (条件)"是SAS中的宏语句,说明持续进行循环直到后面的条件为真。
  59.     "scan"是SAS自带的宏函数,SAS中调用宏函数都需要加上"%"。
  60.       该宏函数的第一个参数指定需要扫描的字符串,第二个参数指定
  61.       从被扫描的字符串中提取第几段,第三个参数指定被扫描的字符串中
  62.       各段之间的分隔符。
  63.     总而言之,这条语句的意思是循环执行下面的操作,直到宏变量nvars所指
  64.       的字符串中以空格分隔的第i段(也就是第i个数值变量的名称)为空;
  65.       宏变量i的值在每次循环结束后将递增1,因此这条语句就是说对输入数据集
  66.       的每个数值变量执行下面的操作*/

  67.     %let varname=%scan(&nvars,&i,' ');
  68.     /*定义宏变量varname存储宏变量nvars所指的字符串中以空格分隔的第i段,
  69.       即第i个数值变量的名称*/

  70.     proc univariate data=&data noprint;
  71.       var &varname;
  72.       /*使用UNIVARIATE过程对输入数据集&data的当前数值变量(其名称存储于
  73.         宏变量varname)进行描述,noprint选项说明描述结果不在屏幕上打印*/
  74.       output out=a1 nmiss=nmiss mean=mean std=std min=min Q1=Q1
  75.              median=median Q3=Q3 max=max;
  76.       /*输出数据集为work.a1,其中只有一行,记录了变量的缺失观测数、
  77.         均值、标准偏差、最小值、下四分位数、中位数、上四分位数、最大值;
  78.         例如,mean=mean中,前一个mean是UNIVARIATE过程的关键字,说明要
  79.         计算变量的均值,后一个mean是work.a1中记录该均值的变量名*/
  80.     run;

  81.     data a1;
  82.       retain name nmiss mean std min Q1 median Q3 max;
  83.       /*指定work.a1中各变量的顺序*/
  84.       set a1;
  85.       length name $15.;
  86.       /*在数据集work.a1中产生新变量name,格式是长度为15的字符串*/
  87.       name="&varname";
  88.       /*变量name的取值是当前数值变量的名称(即宏变量varname所存储的值)*/
  89.       label name="变量名"
  90.             nmiss="缺失观测数" mean="均值"
  91.             std="标准偏差" min="最小值"
  92.             Q1="下四分位数" median="中位数"
  93.             Q3="上四分位数" max="最大值" ;
  94.       /*给work.a1中各变量添加标签*/
  95.     run;

  96.     %if &i=1 %then %do;
  97.     /*"%if (条件) %then %do"是SAS中的宏语句,说明如果条件为真,
  98.       执行如下操作。此处条件是宏变量i的值为1,即当前数值变量是
  99.       输入数据集中第一个数值变量*/
  100.       data &out;
  101.         set a1;
  102.         /*将work.a1拷贝给用于记录所有数值变量的描述统计量的输出数据集&out*/
  103.       run;
  104.     %end;
  105.     /*"%end"与前面"%if &i=1 %then %do"中的"%do"配对,结束这一段操作*/

  106.     %else %do;
  107.     /*"%else %do"是SAS中的宏语句,与"%if (条件) %then %do"语句配合,
  108.       说明如果条件不为真,执行如下操作*/
  109.       proc append base=&out data=a1;
  110.       /*将work.a1的数据添加在输出数据集&out的现有数据之后*/
  111.       run;
  112.     %end;
  113.     /*"%end"与前面"%else %do"中的"%do"配对,结束这一段操作*/

  114.     %let i=%eval(&i+1);
  115.     /*在每次循环结束处,让i值递增1,以便对下一个数值变量进行描述。
  116.       注意:i是宏变量,使用"&i"只会直接引用i的值,而不会进行计算。
  117.       所以如果i存储的值是1,那么使用"%let i=&i+1"语句只会让i的值
  118.       变成字符串"1+1",而不会变成2;因此需要使用SAS自带的宏函数eval
  119.       来进行计算。*/
  120.   %end;
  121.   /*与前面的"%do %until"对应,结束整个循环*/

  122. %mend;
  123. /*结束宏函数nvardescrip的定义*/

  124. /**调用宏函数nvardescrip计算mydata.Credit中各数值变量的描述统计量**/
  125. %nvardescrip(data=mydata.Credit,out=mydata.Credit_nvars_description);

  126. /**定义画各数值变量直方图的宏函数**/
  127. %macro histogram(data=,pdfout="histogram.pdf");
  128. /*定义宏函数histogram,参数data指定用于画直方图的输入数据集,
  129.   参数pdfout指定输出的pdf文件的名称,缺省文件名为histogram.pdf。*/

  130.   proc contents data=&data out=a0 noprint;
  131.   run;

  132.   proc sql;
  133.     select NAME into :nvars separated by ' ' from a0
  134.     where TYPE=1;
  135.   quit;

  136.   ods listing exclude all;
  137.   /*ods(Output Delivery System)是SAS的输出传递系统,
  138.     listing是缺省的输出窗口,"exclude all"表明所有输出都不导向listing*/
  139.   ods pdf file=&pdfout;
  140.   /*将输出导向到pdf文件,文件名由宏变量pdfout指定*/

  141.   %let i=1;
  142.   %do %until (%scan(&nvars,&i,' ')=);

  143.     %let varname=%scan(&nvars,&i,' ');

  144.     title1 &varname;
  145.     /*使用当前数值变量的名称作为直方图的标题*/
  146.     proc univariate data=&data noprint;
  147.       histogram &varname / cbarline=grey cfill=ligr;
  148.       /*histogram语句说明要对当前数值变量画直方图;
  149.         "cbarline=grey"指定直方图中各柱用灰色勾勒边线,
  150.         "cfill=ligr"指定直方图中各柱用浅灰色填充。*/
  151.         inset n nmiss mean std min Q1 median Q3 max /
  152.           header='Descriptive Statistics' pos=ne noframe;
  153.         /*在图的右上方(即pos关键字指定的ne,代表northeast即东北方)
  154.           插入统计量表,表头为"Descriptive Statistics",含有观测数(n)、
  155.           缺失观测数(nmiss)、均值(mean)、标准偏差(std)、最小值(min)、
  156.           下四分位数(Q1)、中位数(median)、上四分位数(Q3)、最大值(max)
  157.           等统计量,noframe指明该表没有边框 */
  158.     run;

  159.     %let i=%eval(&i+1);
  160.   %end;

  161.   ods pdf close;
  162.   /*关闭pdf输出环境*/
  163.   ods listing exclude none;
  164.   /*将所有输出重新导向到listing*/

  165. %mend;
  166. /*结束宏函数histogram的定义*/

  167. /**调用宏函数histogram画mydata.Credit中各数值变量的直方图**/
  168. %histogram(data=mydata.Credit,pdfout="E:\dm\ch2_case2-2_histogram.pdf");

  169. data mydata.CreditNew;
  170.   /*生成新数据集mydata.CreditNew,在其上进行数据的修改*/
  171.   set mydata.Credit;
  172.   drop criteria own_home;
  173. run;

  174. data mydata.CreditNew;
  175.   set mydata.CreditNew;
  176.   bcbal1=log(bcbal+1);
  177.   /*对数转换*/
  178. run;

  179. proc rank data=mydata.CreditNew out=mydata.CreditNew groups=100;
  180. /*秩转换,"group=100"指定以百分位数将数据分隔为组,
  181.   转换后变量的取值为0至99*/
  182.   var bcbal;
  183.   ranks bcbal2;
  184.   /*对原始变量bcbal进行秩转换,记录转换后数值的变量的名称为bcbal2*/
  185. run;

  186. proc freq data=mydata.Credit;
  187.   table sex;
  188. run;

  189. proc ttest data=mydata.Credit;
  190.   class buyer_p_;
  191.   var age_inferr;
  192. run;

  193. proc freq data=mydata.Credit;
  194.   tables buyer_p_*sex / chisq;
  195. run;

  196. /**将所有响应者的数据放入work.credit1数据集中**/
  197. data credit1;
  198.   set mydata.CreditNew;
  199.   where BUYER_P_=1;
  200. run;

  201. /**将所有非响应者的数据放入work.credit0数据集中**/
  202. data credit0;
  203.   set mydata.CreditNew;
  204.   where BUYER_P_=0;
  205. run;

  206. /**创建宏变量n1记录响应者的观测数**/
  207. proc sql noprint;
  208.   select count(*) into :n1 from credit1;
  209. quit;

  210. /**创建宏变量n0记录非响应者的观测数,它的值是响应者观测数n1的两倍**/
  211. %let n0=%eval(2*&n1);

  212. /**从非响应者的数据中随机抽取n0个观测,仍然放入work.credit0数据集中**/
  213. proc surveyselect data=credit0 method=srs
  214.   /*"method=srs"说明抽样方法是简单随机抽样(simple random sampling)*/
  215.   n=&n0 out=credit0;
  216. run;

  217. /**将响应者和非响应者的数据都放入mydata.CreditNew1数据集中**/
  218. data mydata.CreditNew1;
  219.   set credit1 credit0;
  220. run;
复制代码


1.png
2.png
3.png
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表