首页 > 代码库 > sas高级编程(1) 定点抽样、随机抽样、三种索引、管理索引

sas高级编程(1) 定点抽样、随机抽样、三种索引、管理索引

1:抽样

1.1 定点抽样

data sasuser.subset;   do pickit=1 to totobs by 10;      set sasuser.revenue point=pickit nobs=totobs;      output;   end;   stop;run;

总体样本数量未知的情况下,使用set语句的nobs=选项获得总体观测行数,总体观测行数是在编译时确定的,并在创建pdv的时候被写入,存在文件描述部分中。

point=n 表明要抽选第n条观测值,n必须为变量不能为常量。

为什么要使用stop?

默认情况下,sas是顺序读取数据集的观测行,当sas读到最后一条观测值之后的end-of-file marker,data步会结束。而set语句中的POINT= 选项使用 direct-access read 模式,这意味着sas只读那些被指向的观测行,在这种模式下,sas不会检测文件结尾,因此需要手动的加上stop来停止当前data步,并在之后恢复处理语句功能,从而防止进入死循环中。

 

 

1.2:随机抽样

 Using the RANUNI Function

RANUNI (seed) seed为非负整数

seed为0时,以系统时间为seed,每次生成的随机数序列都不一样

seed为非0正常数时,你每打开一次sas程序,所生成的种子序列总是一模一样的。

如果你打开第一个sas应用,再打开第二个,使用同一个种子,生成的随机数序列还是一样。

把所以sas应用关闭,再打开一个,使用同一个种子,生成的随机数序列还是一样的。

暂时表明,只要使用的是正常数种子,生成的随机数序列就一样

 

可重复随机抽样

data work.rsubset (drop=i sampsize);sampsize=10;do i=1 to sampsize;pickit=ceil(ranuni(0)*totobs);set sasuser.revenue point=pickit nobs=totobs;output;end;stop;run;

不可重复随机抽样(没看太懂)

data work.rsubset(drop=obsleft sampsize);sampsize=10;obsleft=totobs;    do while(sampsize>0);        pickit+1;        if ranuni(0)<sampsize/obsleft then do;            set sasuser.revenue point=pickit            nobs=totobs;            output;            sampsize=sampsize-1;        end;        obsleft=obsleft-1;    end;stop;run;proc print data=work.rsubset heading=h label;title A Random Sample without Replacement;run;

 

 

2:index

为什么要用索引?

索引能快速定位到我们想要的观测。

索引在哪些情况下适用?

yield faster access to small subsets of observations for WHERE processing

return observations in sorted order for BY processing

join observations

modify observations.

perform table lookup operations

索引由什么组成?

An index stores values in ascending value order for a specific variable or variables and includes
information about the location of those values within observations in the data file. That is, an index is
composed of value/identifier pairs that enable you to locate an observation by value.

索引由排好序的值和值在观测值中的位置组成,这样就可以快速定位。

索引有哪几类?

简单索引:包含一个key variable的值,can be character or numeric.简单索引的索引名和变量名一致

复杂索引:包含多个key variable的值,can be character or numeric.复杂索引的索引名由多个变量名连接成,但是我们一般自己起别名

索引能给视图建立么?

索引只能给表建立,不可以给视图建立

哪些情况下索引不被使用?

with a subsetting IF statement in a DATA step

with particular WHERE expressions (where flightid ne ‘IA11200‘;索引不被使用)

if SAS determines it is more efficient to read the data sequentially.

 

 

创建索引的三种方式

data步建立索引
DATA SAS-data-file-name (INDEX=(index-specification-1</UNIQUE><...index-specification-n</UNIQUE>>)); SET SAS-data-set-name ;RUN;实例:data sasuser.sale2000(index=(origin FlightDate=(flightid date)/unique)); unique表明key variable的值必须唯一,不可以有重复。如果声明unique的变量有重复,索引不会建立data simple (index=(division));

datasets步建立索引(datasets过程为顺序执行,更改顺序会产生不同的结果)
PROC DATASETS LIBRARY=libref <NOLIST>; MODIFY SAS-data-set-name; INDEX DELETE index-name ; INDEX CREATE index-specification;QUIT;
实例:
proc datasets library=sasuser nolist;modify sale2000;index delete origin;index create flightid;index create Tofrom=(origin dest);quit;sql步建立索引PROC SQL; CREATE <UNIQUE> INDEX index-name ON table-name(column-name-1<...,column-name-n>); DROP INDEX index-name FROM table-name ;QUIT;
实例:
proc sql;create index Tofrom onsasuser.sale2000(origin, dest);drop origin from sasuser.sale2000;quit;

 

OPTIONS MSGLEVEL= N | I; 列出索引的使用情况,N为基本情况,I为详细情况

 

 

3:管理索引

每个文件只有一个索引文件,是独立的,同名且在同一个文件夹下的。

PROC CONTENTS DATA=<libref.>SAS-data-set-name;RUN;
PROC DATASETS <LIBRARY=libref> <NOLIST>;CONTENTS DATA=<libref.>SAS-data-set-name;QUIT;

PROC DATASETS LIBRARY=old-libref <NOLIST>;COPY OUT=new-libref;SELECT SAS-data-set-name;QUIT;
PROC COPY OUT=new-libref IN=old-libref <MOVE>;SELECT SAS-data-set-name(s);RUN;QUIT;

PROC DATASETS LIBRARY=libref <NOLIST>;CHANGE old-data-set-name = new-data-set-name;QUIT;
PROC DATASETS LIBRARY=libref <NOLIST>;MODIFY SAS-data-set-name;RENAME old-var-name-1 = new-var-name-1 ;<...old-var-name-n = new-var-name-n> ;QUIT;

更改data文件对index文件的影响

 

sas高级编程(1) 定点抽样、随机抽样、三种索引、管理索引