|
- /**定义SAS逻辑库mydata,对应于E:\dm目录**/
- libname mydata "E:\dm";
-
- /** 读入数据,生成SAS数据集mydata.Credit **/
- proc import datafile="E:\data\ch2_credit.csv"
- out=mydata.Credit dbms=DLM;
- /*将数据从Credit.csv文件读入,存储在SAS逻辑库mydata下的数据集Credit中;
- dbms指定读入数据的种类,DLM说明数据是带分隔符的*/
- delimiter=',';
- /*说明分隔符是逗号(缺省分隔符为空格)*/
- getnames=yes;
- /*需要从第一行读入变量名*/
- run;
- proc print data=mydata.Credit(obs=5);
- run;
-
- /**为数据集中的某些变量添加标签,说明变量的具体含义**/
- data mydata.Credit;
- set mydata.Credit;
- label age_inferr="inferred age"
- /*推断出的年龄*/
- dob_month="Date of Birth (Month)"
- /*出生月份*/
- dob_year="Date of Birth (Year)"
- /*出生年*/
- buyer_p_="Target: response indicator"
- /*是否响应(因变量)*/
- sex="Gender of the applicant"
- /*性别*/
- married="Marriage status of the applicant"
- /*婚姻状况*/
- children="the indicator for whether having children"
- /*是否有孩子*/
- own_home="the indicator for owning home (vs renting)";
- /*是否拥有(而不是租赁)住房*/
- run;
-
-
- /**对数据集进行基本描述**/
- proc contents data=mydata.Credit out=a0 noprint;
- /*被描述的数据集为mydata.Credit,描述结果存入SAS数据集work.a0,
- noprint选项说明不在屏幕上打印描述结果*/
- run;
-
- /**定义计算各数值变量描述统计量的宏函数**/
- %macro nvardescrip(data=,out=);
- /*"%macro"是SAS中的宏语句,说明下面要定义一个宏函数;
- 宏函数名称为nvardescrip,参数data指定用于描述的输入数据集,
- 参数out指定存储统计描述结果的输出数据集*/
-
- /**得到输入数据集&data(引用参数data的值)的基本描述**/
- proc contents data=&data out=a0 noprint;
- run;
-
- /**创建宏变量记录输入数据集中所有数值变量的名称**/
- proc sql;
- select NAME into :nvars separated by ' ' from a0
- where TYPE=1;
- /*nvars是创建的宏变量的名称,它的取值是一个字符串,由所有数值变量
- (work.a0中TYPE取值为1)的名称(work.a0中的NAME)以空格分隔连接而成*/
- quit;
-
- %let i=1;
- /*"%let"是SAS中的宏语句,此处定义宏变量i并赋予其初始值1*/
- %do %until (%scan(&nvars,&i,' ')=);
- /*"%do %until (条件)"是SAS中的宏语句,说明持续进行循环直到后面的条件为真。
- "scan"是SAS自带的宏函数,SAS中调用宏函数都需要加上"%"。
- 该宏函数的第一个参数指定需要扫描的字符串,第二个参数指定
- 从被扫描的字符串中提取第几段,第三个参数指定被扫描的字符串中
- 各段之间的分隔符。
- 总而言之,这条语句的意思是循环执行下面的操作,直到宏变量nvars所指
- 的字符串中以空格分隔的第i段(也就是第i个数值变量的名称)为空;
- 宏变量i的值在每次循环结束后将递增1,因此这条语句就是说对输入数据集
- 的每个数值变量执行下面的操作*/
-
- %let varname=%scan(&nvars,&i,' ');
- /*定义宏变量varname存储宏变量nvars所指的字符串中以空格分隔的第i段,
- 即第i个数值变量的名称*/
-
- proc univariate data=&data noprint;
- var &varname;
- /*使用UNIVARIATE过程对输入数据集&data的当前数值变量(其名称存储于
- 宏变量varname)进行描述,noprint选项说明描述结果不在屏幕上打印*/
- output out=a1 nmiss=nmiss mean=mean std=std min=min Q1=Q1
- median=median Q3=Q3 max=max;
- /*输出数据集为work.a1,其中只有一行,记录了变量的缺失观测数、
- 均值、标准偏差、最小值、下四分位数、中位数、上四分位数、最大值;
- 例如,mean=mean中,前一个mean是UNIVARIATE过程的关键字,说明要
- 计算变量的均值,后一个mean是work.a1中记录该均值的变量名*/
- run;
-
- data a1;
- retain name nmiss mean std min Q1 median Q3 max;
- /*指定work.a1中各变量的顺序*/
- set a1;
- length name $15.;
- /*在数据集work.a1中产生新变量name,格式是长度为15的字符串*/
- name="&varname";
- /*变量name的取值是当前数值变量的名称(即宏变量varname所存储的值)*/
- label name="变量名"
- nmiss="缺失观测数" mean="均值"
- std="标准偏差" min="最小值"
- Q1="下四分位数" median="中位数"
- Q3="上四分位数" max="最大值" ;
- /*给work.a1中各变量添加标签*/
- run;
-
- %if &i=1 %then %do;
- /*"%if (条件) %then %do"是SAS中的宏语句,说明如果条件为真,
- 执行如下操作。此处条件是宏变量i的值为1,即当前数值变量是
- 输入数据集中第一个数值变量*/
- data &out;
- set a1;
- /*将work.a1拷贝给用于记录所有数值变量的描述统计量的输出数据集&out*/
- run;
- %end;
- /*"%end"与前面"%if &i=1 %then %do"中的"%do"配对,结束这一段操作*/
-
- %else %do;
- /*"%else %do"是SAS中的宏语句,与"%if (条件) %then %do"语句配合,
- 说明如果条件不为真,执行如下操作*/
- proc append base=&out data=a1;
- /*将work.a1的数据添加在输出数据集&out的现有数据之后*/
- run;
- %end;
- /*"%end"与前面"%else %do"中的"%do"配对,结束这一段操作*/
-
- %let i=%eval(&i+1);
- /*在每次循环结束处,让i值递增1,以便对下一个数值变量进行描述。
- 注意:i是宏变量,使用"&i"只会直接引用i的值,而不会进行计算。
- 所以如果i存储的值是1,那么使用"%let i=&i+1"语句只会让i的值
- 变成字符串"1+1",而不会变成2;因此需要使用SAS自带的宏函数eval
- 来进行计算。*/
- %end;
- /*与前面的"%do %until"对应,结束整个循环*/
-
- %mend;
- /*结束宏函数nvardescrip的定义*/
-
- /**调用宏函数nvardescrip计算mydata.Credit中各数值变量的描述统计量**/
- %nvardescrip(data=mydata.Credit,out=mydata.Credit_nvars_description);
-
- /**定义画各数值变量直方图的宏函数**/
- %macro histogram(data=,pdfout="histogram.pdf");
- /*定义宏函数histogram,参数data指定用于画直方图的输入数据集,
- 参数pdfout指定输出的pdf文件的名称,缺省文件名为histogram.pdf。*/
-
- proc contents data=&data out=a0 noprint;
- run;
-
- proc sql;
- select NAME into :nvars separated by ' ' from a0
- where TYPE=1;
- quit;
-
- ods listing exclude all;
- /*ods(Output Delivery System)是SAS的输出传递系统,
- listing是缺省的输出窗口,"exclude all"表明所有输出都不导向listing*/
- ods pdf file=&pdfout;
- /*将输出导向到pdf文件,文件名由宏变量pdfout指定*/
-
- %let i=1;
- %do %until (%scan(&nvars,&i,' ')=);
-
- %let varname=%scan(&nvars,&i,' ');
-
- title1 &varname;
- /*使用当前数值变量的名称作为直方图的标题*/
- proc univariate data=&data noprint;
- histogram &varname / cbarline=grey cfill=ligr;
- /*histogram语句说明要对当前数值变量画直方图;
- "cbarline=grey"指定直方图中各柱用灰色勾勒边线,
- "cfill=ligr"指定直方图中各柱用浅灰色填充。*/
- inset n nmiss mean std min Q1 median Q3 max /
- header='Descriptive Statistics' pos=ne noframe;
- /*在图的右上方(即pos关键字指定的ne,代表northeast即东北方)
- 插入统计量表,表头为"Descriptive Statistics",含有观测数(n)、
- 缺失观测数(nmiss)、均值(mean)、标准偏差(std)、最小值(min)、
- 下四分位数(Q1)、中位数(median)、上四分位数(Q3)、最大值(max)
- 等统计量,noframe指明该表没有边框 */
- run;
-
- %let i=%eval(&i+1);
- %end;
-
- ods pdf close;
- /*关闭pdf输出环境*/
- ods listing exclude none;
- /*将所有输出重新导向到listing*/
-
- %mend;
- /*结束宏函数histogram的定义*/
-
- /**调用宏函数histogram画mydata.Credit中各数值变量的直方图**/
- %histogram(data=mydata.Credit,pdfout="E:\dm\ch2_case2-2_histogram.pdf");
-
- data mydata.CreditNew;
- /*生成新数据集mydata.CreditNew,在其上进行数据的修改*/
- set mydata.Credit;
- drop criteria own_home;
- run;
-
- data mydata.CreditNew;
- set mydata.CreditNew;
- bcbal1=log(bcbal+1);
- /*对数转换*/
- run;
-
- proc rank data=mydata.CreditNew out=mydata.CreditNew groups=100;
- /*秩转换,"group=100"指定以百分位数将数据分隔为组,
- 转换后变量的取值为0至99*/
- var bcbal;
- ranks bcbal2;
- /*对原始变量bcbal进行秩转换,记录转换后数值的变量的名称为bcbal2*/
- run;
-
- proc freq data=mydata.Credit;
- table sex;
- run;
-
- proc ttest data=mydata.Credit;
- class buyer_p_;
- var age_inferr;
- run;
-
- proc freq data=mydata.Credit;
- tables buyer_p_*sex / chisq;
- run;
-
- /**将所有响应者的数据放入work.credit1数据集中**/
- data credit1;
- set mydata.CreditNew;
- where BUYER_P_=1;
- run;
-
- /**将所有非响应者的数据放入work.credit0数据集中**/
- data credit0;
- set mydata.CreditNew;
- where BUYER_P_=0;
- run;
-
- /**创建宏变量n1记录响应者的观测数**/
- proc sql noprint;
- select count(*) into :n1 from credit1;
- quit;
-
- /**创建宏变量n0记录非响应者的观测数,它的值是响应者观测数n1的两倍**/
- %let n0=%eval(2*&n1);
-
- /**从非响应者的数据中随机抽取n0个观测,仍然放入work.credit0数据集中**/
- proc surveyselect data=credit0 method=srs
- /*"method=srs"说明抽样方法是简单随机抽样(simple random sampling)*/
- n=&n0 out=credit0;
- run;
-
- /**将响应者和非响应者的数据都放入mydata.CreditNew1数据集中**/
- data mydata.CreditNew1;
- set credit1 credit0;
- run;
复制代码
|
|