SAS语言与数据管理程序

上传人:wuy****ng 文档编号:146550938 上传时间:2022-08-31 格式:DOC 页数:37 大小:218.52KB
收藏 版权申诉 举报 下载
SAS语言与数据管理程序_第1页
第1页 / 共37页
SAS语言与数据管理程序_第2页
第2页 / 共37页
SAS语言与数据管理程序_第3页
第3页 / 共37页
资源描述:

《SAS语言与数据管理程序》由会员分享,可在线阅读,更多相关《SAS语言与数据管理程序(37页珍藏版)》请在装配图网上搜索。

1、SAS语言与数据管理程序SAS语言与数据管理程序 SAS语言构成 o SAS语句 o SAS表达式 o SAS程序规则 SAS用作一般高级语言 o 赋值语句 o 输出语句 o 分支结构 o 循环结构 o 数组 o 函数 o SAS/IML矩阵功能简介 SAS语言的数据管理功能 o SAS数据步的运行机制 o 用INPUT语句输入数据 o 读入外部数据 o 数据集的复制与修改 o 用SET和OUTPUT语句拆分数据集 o 数据集的纵向合并 o 数据集的横向合并 o 用UPDATE语句更新数据集 o 用PROC SQL管理数据 SAS系统强大的数据管理能力、计算能力、分析能力依赖于作为其基础的SA

2、S语言。SAS语言是一个专用的数据管理与分析语言,它的数据管理功能类似于数据库语言(如FoxPro),但又添加了一般高级程序设计语言的许多成分(如分支、循环、数组),以及专用于数据管理、统计计算的函数。SAS系统的数据管理、报表、图形、统计分析等功能都可以用SAS语言程序来调用,只要指定要完成的任务就可以由SAS系统按照预先设计好的程序去进行,所以SAS 语言和FoxPro等一样是一种第四代语言。本章简单介绍SAS语言的基本成分与规则,SAS语言如何用来管理数据,SAS语言作为一个统计计算语言的用法,以及SAS过程使用的初步知识。SAS语言构成 SAS语句 SAS语言程序由数据步和过程步组成。

3、数据步用来生成数据集、计算、整理数据,过程步用来对数据进行分析、报告。SAS语言的基本单位是语句,每个SAS语句一般由一个关键字(如DATA,PROC,INPUT,CARDS,BY)开头,包含SAS名字、特殊字符、运算符等,以分号结束。SAS关键字是用于SAS语句开头的特殊单词,SAS语句除了赋值、累加、注释、空语句以外都以关键字开头。SAS名字在SAS程序中标识各种SAS成分,如变量、数据集、数据库,等等。SAS 名字由1到8个字母、数字、下划线组成,第一个字符必须是字母或下划线。SAS关键字和SAS 名字都不分大小写。SAS表达式SAS数据步程序中的计算用表达式完成。表达式把常量、变量、函

4、数调用用运算符、括号连接起来得到一个计算结果。SAS常量主要有数值型、字符型两种,并且还提供了用于表达日期、时间的数据类型。例如 数值型:12,7.5,2.5E10 字符型:Beijing,Li Ming,李明 日期型:13JUL1998d 时间型:14:20t 日期时间型:13JUL1998:14:20:32dt 数值型常数可以用整数、定点实数、科学计数法实数表示。字符型常数为两边用单撇号或两边用双撇号包围的若干字符。日期型常数是在表示日期的字符串后加一个字母d(大小写均可),中间没有空格。时间型常数是在表示时间的字符串后加一个字母t。日期时间型常数在表示日期时间的字符串后加字母dt。因为S

5、AS是一种数据处理语言,而实际数据中经常会遇到缺失值,比如没有观测到数值,被访问人不肯回答,等等。SAS中用一个单独的小数点来表示缺失值常量。SAS变量的基本类型有两种:数值型和字符型。日期、时间等变量存为数值型。SAS的数值型变量可以存储任意整数、定点实数、浮点实数,一般不关心其区别。数值型变量在数据集中的存贮一般使用8个字节。SAS的字符型变量缺省的长度是8个字符,但是如果在INPUT 语句中输入字符型变量时指定了长度则不受此限制。可以用LENGTH语句直接指定变量长度,LENGTH 语句一般应出现在变量定义之前,格式为:LENGTH 变量名 $ 长度;例如LENGTH name $ 20

6、;SAS运算符包括算术、比较、逻辑等运算符。 算术运算符为 * / *,运算优先级按通常的优先规则。 比较运算符用于比较常量、变量的值大小、相等,包括 = 1000) AND (salary 2000) 表示工资收入在10002000之间(不含2000)(age = 1000) AND (salary 2000) 表示工资收入 不在10002000之间复杂的逻辑表达式最好用括号表示其运算优先级以免误记优先规则并可利于阅读程序。其它的运算符还有用于连接两个字符串的|(两个连续的|号),用于取两个运算值中较大一个的(比如35结果为5),用于取两个运算值中较小一个的5结果为3)。注意符在有些语言中用

7、作“不等于”比较算符,而SAS 中用法则较特殊。SAS程序规则SAS程序由语句构成。每个语句以分号结尾(最常见的SAS编程错误就是丢失分号)。因为分号作为语句结束标志,所以SAS语句不需要单独占一行,一个语句可以写到多行(不需任何续行标志),也可以在一行连续写几个语句。SAS语言中只要允许用一个空格的地方就可以加入任意多个空白(空格、制表符、回车),允许用空格的地方是名字周围、运算符周围。比如,程序proc print data=c9501; by avg;run;和proc print data=c9501;by avg;run;是等效的。另外,SAS关键字和名字大小写不分,但字符型数据值要

8、区分大小写,比如Beijing 和BEIJING被认为是不同的数据值。在SAS程序中可以加入注释,注释使用C语言语法,用/*和*/在两端界定注释,这种注释可以出现在任何允许加入空格的位置,可以占多行。我们一般只把注释单独占一行或若干行,不把注释与程序代码放在同一行。注释的另一个作用是把某些代码暂时屏蔽使其不能运行。下面是一个注释的例子:/* 生成95级1班考试成绩的数据集 */data c9501;SAS程序包括数据步和过程步两种结构,每一个步是一段相对完整的可以单独运行的程序。数据步用来生成、整理数据和自编程计算,过程步调用SAS已编好的处理过程对数据进行处理。自己用SAS编程序进行计算主要

9、在数据步中进行。SAS数据步以DATA语句开头,以RUN语句结尾。DATA步中可以使用INPUT、CARDS、INFILE 、SET、MERGE等语句指定数据来源输入数据,也可以用赋值、分支、循环等编程结构直接生成数据或对输入的数据进行修改。SAS用作一般高级语言SAS是一种专用的数据处理、统计计算语言,但是它也包含一般的高级语言编程能力并扩充了许多数学、统计等方面的函数。我们先介绍SAS语言用来进行一般编程计算的功能,然后再讲解其独特的数据处理功能。SAS数据步的数据输入、整理功能很强,希望进行复杂的数据管理的读者可以根据本节和下节的内容用SAS实现强大的数据管理功能。希望实现自己的统计计算

10、算法的读者可以用SAS数据步编程,但是我们建议使用Splus来编算法程序,因为用Splus 编程更方便。SAS语言的编程计算能力主要由SAS数据步提供(另外SAS还提供了一个SAS/IML模块可以进行向量、矩阵运算,读者有兴趣可以自己学习)。所以,下面给出的例子如果没有写DATA语句实际应该在例子前面加上DATA语句,在后面加上RUN语句才能运行。DATA语句以关键字DATA 开头,后面给出一个数据集名,这是本数据步要生成的数据集的名字,例如:data tmp1;也可以省略数据集名,这时SAS自动生成一个临时数据集名。还可以使用特殊名字_NULL_ ,表示本数据步不生成数据集。赋值语句在SAS

11、中用赋值语句计算一个值并存放到变量中。格式为 变量名 表达式;例如: avg = (math + chinese/120*100)/2;isfem = (sex=女);y=sin(x)*2;newv = .;其中第一个赋值语句用一个公式计算平均分数。第二个生成一个取值为0或1的变量,性别为女时为1,否则为0。第三个使用了正弦函数和乘方运算。第四个给变量赋了缺失值。注意想试验上述语句要把它们放入数据步中,并且等号右边的表达式中的各变量应该是存在的,否则会得到缺失值结果。输出语句SAS数据步的输出一般是数据集,用赋值语句计算的结果会自动写入数据集。SAS也提供了一个PUT语句,可以象其它语言程序的

12、PRINT、WRITE(*,*)、printf等语句一样立即打印输出结果。PUT语句在关键字后面列出要输出的各项,每一项可以是变量名或字符串,不能为数值常量或表达式,各项之间用空格分开。PUT语句的输出结果显示在LOG窗口。例如:data; x=0.5; y=sin(x); put Sine function value of x is y;run;结果将在运行记录窗口显示一行 Sine function value of 0.5 is 0.4794255386另外,在PUT语句中使用“变量名”来指定输出项可以显示带有变量名的输出结果,比如把上程序中的PUT语句改为 put x= y=;则结果

13、在LOG窗口显示为 X=0.5 Y=0.4794255386PUT语句的输出项还可以指定具体列位置,比如,下面的PUT语句指定把X数值显示在第1020列,把Y数值显示在第3040列,并保留6位小数:put x 10-20.6 y 30-40.6;在指定的列位置内,数值型数据靠右对齐,字符型数据靠左对齐。要保留的小数位数写在一个小数点后面,如果变量为整数值或者字符型则不必指定小数位数。PUT语句还可以使用类似C、FORTRAN语言的“域宽.精度”方式指定输出的宽度和精度,例如,put x 20.8 y 20.8;使X占用第120列,8位小数,右对齐;Y占用第2140列,8位小数,右对齐。其中20

14、.8 是多种SAS输出格式中最常见的一种,用于输出数值型数据,小数点前面为输出宽度,小数点后面为输出精度(小数位数)。对于字符型变量,要指定其输出宽度可以用“$宽度.”的格式,如“$10.”指定字符型变量输出宽度为10位。输出占不满指定宽度时,数值型数据向右对齐,字符型数据向左对齐。字符型常量可以用于PUT语句中,但不能规定占用的列位置或者宽度。如果希望PUT语句的输出不产生换行,使下一个PUT的结果可以显示在同一行,只要在PUT 语句结尾处加一个符,如:put i ;PUT语句的输出结果缺省情况下被送到运行记录窗口。在PUT语句之前用FILE语句可以改变PUT语句的输出目的地。比如,在PUT

15、语句之前用file print;可以把PUT语句的输出转向到输出窗口。在FILE语句中指定一个包含文件名的字符串可以把PUT语句的输出转向到此文件中。比如file tmp.out;把后续的PUT语句输出转向到当前工作目录下的文件“tmp.out”中,生成输出文件tmp.out 。注意当前工作目录在SAS状态栏的右方显示,双击可以更改。文件名也可以指定全路径,比如“C:SASTMP.OUT”。分支结构如果需要在某条件满足时执行某一操作,可以用IF 条件 THEN 语句;的结构。比如,如果X为正数则显示“X为正数”,可以用 IF x0 THEN PUT X为正数;有时我们在条件成立时需要进行的操作

16、无法用一个语句完成,这时可以使用SAS提供的 复合语句功能:只要把若干个语句用“DO;”语句和“END;”语句包围起来,就可以把它们看作是一个语句,就可以用在需要指定一个语句的地方。比如,当X为正数时不仅显示X 为正数,而且将其加倍并显示值,可以用如下带有复合语句的IF结构:IF x0 THEN DO; PUT X为正数; x = 2*x; PUT x=; END;以上的IF结构的用法只规定了条件成立时的操作,如果同时需要规定条件不成立时进行什么操作,使用带有ELSE字句的IF结构:IF 条件 THEN 语句;ELSE 语句;其中“语句”均可以是复合语句。例如,当X为非负时将X加倍,为负时将X

17、取绝对值,用如下程序:IF x=0 THEN x=2*x;ELSE x = -x;注意SAS的分支结构的写法与其它语言有些不同,它不用ENDIF结束。 SAS的IF结构允许嵌套,但SAS不提供IFELSEIFELSE的多分支结构。SAS的SELECT 结构提供了更为灵活的多分支结构,可以实现比其它语言的IFELSEIFELSE结构更强的功能。SELECT结构有两种基本用法,第一种为:SELECT (选择表达式);WHEN(值列表) 语句;WHEN(值列表) 语句;OTHERWISE 语句;END;其中“选择表达式”是一个取数值、字符型值的变量或表达式, “值列表”为一项或者若干项,多项之间逗号

18、分开,每项可以是一个与选择表达式相同取值类型的表达式。 “语句”可以是单个语句或复合语句。执行SELECT结构时,先计算出选择表达式和值列表中的所有值,然后把选择表达式值由前向后与值列表中的值相比,发现相等值则执行对应的语句,然后退出SELECT结构(不再查看后面的值列表)。如果选择表达式的值不等于任何值列表中的值则执行OTHERWISE对应的语句,这种情况下没有OTHERWISE语句会出错。例如:SELECT(month); WHEN(Feb, Mar, Apr) put 春天; WHEN(May, Jun, Jul) put 夏天; OTHERWISE put 秋天或冬天;END;根据MO

19、NTH值不同显示不同的季节。 SELECT语句的另一种形式为: SELECT;WHEN(条件) 语句;WHEN(条件) 语句;OTHERWISE 语句;END;这种SELECT语句没有选择表达式,而是在每一个WHEN语句指定一个条件(逻辑表达式),执行第一个满足条件的WHEN后的语句。如果所有条件都不满足则执行OTHERWISE后的语句。例如:SELECT;WHEN(age=12) put 少年;WHEN(age12 and age1000 then LEAVE;在循环体内用CONTINUE语句可以立即结束本轮循环并转入下一轮循环的判断与执行。比如:data; do x=0 to 3.1415

20、926 by 0.01; y = sin(x); if y0 then CONTINUE; z = cos(x); put x 5.2 y 20.7 z 20.7; end;run;这个程序对0到 之间的数每隔0.01计算正弦值,如果正弦值为负则考虑下一个值,正弦值非负时计算余弦值并显示。因为正弦为负时没有任何结果显示,所以我们只能看到 /2为止的结果。当型循环的语法是:DO WHILE(循环继续条件);循环体语句END;程序先判断循环继续条件是否成立,成立时执行循环体语句,再判断循环继续条件,如此重复,直到循环继续条件不再成立。例如,下面的程序判断1333333是不是素数:data; x=1

21、333333; i=3; DO WHILE (mod(x,i) = 0); i=i+2; END; if i=5); n+1; put n=; end;run;可以依次输出n=1,2,3,4,5,当n5时退出条件“n=5”满足,循环结束。上例中语句n+1是一种特殊的写法,叫做累加语句,等价于n=n+1。事实上,SAS的循环语句比上面所述还要灵活得多,它在DO语句中可以指定一个循环列表,比如:data; do i=3,7, 11 to 17 by 3 while (i*2200); j=i*2; put i j; end;run;循环变量i取5,7,11,14循环体被执行,当i取17时i的平方为

22、289故循环体不被执行,循环结束。注意WHILE条件只作用于用逗号隔开的最后一项。数组SAS可以把一组同为数值型或同为字符型的变量合在一起,使用同一个名字称呼,用下标来区分。这与通常的程序设计语言中的数组略有区别,通常的程序设计语言中数组元素没有对应的变量名,而SAS数组每个元素都有自己的变量名。一、数值型数组定义数值型数组的格式为:ARRAY 数组名(维数说明) 数组元素名列表 (初始值表);例如: ARRAY tests(3) math chinese english (0, 0, 0);数组名是一个合法的SAS名字且不能与同一数据步中的变量重名。对一维数组,维数说明只要说明元素个数,这时

23、下标从1开始。数组元素名列表列出这个数组的各个元素实际代表的变量名,各变量名以空格分隔。比如,上例中tests(1)代表数学成绩,tests(2)代表语文成绩,tests(3)代表英语成绩。初始值表给各数组元素赋初值,按顺序对应。数组说明中初始值表可以省略,这时其初始值为相应数组元素的值(如果其数组元素还没有值则初值为缺失值)。数组说明中的数组元素名列表可以省略,这时其元素也有对应的变量名,变量名为数组名后附加序号,比如:ARRAY x(3);中数组x的各元素名为x1,x2,x3。 也可以在说明维数时用“下标下界:下标上界”来说明一个其它的下标下界,如 ARRAY sales(95:97) y

24、r95yr97 ;这时sales(95)为yr95,sales(96)为yr96,sales(97)为yr97。上面的变量名列表是一种特殊的语法,在用到变量名列表时如果连续写几个前面字母相同,后面是连续的序号的变量,只要写出第一个和最后一个,中间用减号连接。一维数组的维数说明还可以是一个星号,这时数组大小由提供的元素列表中的变量个数决定,如上面的数组tests可以等价地说明为:ARRAY tests(*) math chinese english (0, 0, 0);可以用函数DIM(数组名)来获得数组的长度。 可以定义二维数值型数组,只要在维数说明中指定用逗号分开的两个下标界说明,例如:ar

25、ray table(2,2) x11 x12 x21 x22;说明table(1,1)为x11,table(1,2)为x12,table(2,1)为x21,table(2,2)为x22。二维数组元素按行排列。二、字符型数组定义字符型数组的语法略复杂,它需要加一个$符来说明数组元素类型为字符型,并且要说明每一元素所能存储的字符串的最大长度。说明格式如下:ARRAY 数组名(维数说明) $ 元素长度说明 数组元素名列表 (初始值表);例如: ARRAY names(3) $ 10 child father mother;字符型数组其它方面用法与数值型相同。 三、临时数组上面格式说明的数组都是把若干

26、个变量集合在一起使用同一个数组名称呼,每个数组元素是一个独立的变量。SAS也提供了与其它程序设计语言相同的数组,即数组元素只由数组名和序号决定,没有对应的变量名。这种数组叫做临时数组,定义格式为:ARRAY 数组名(维数说明) _TEMPORARY_ (初始值表);可见临时数组就是在数组说明中用_TEMPORARY_代替了数组元素列表。例如: ARRAY x(3) _TEMPORARY_ (0, 0, 0);说明了一个有三个元素的临时数组x。其元素为x(1),x(2),x(3),即使变量x1,x2,x3 存在也与此数组无关。临时数组的特点是它只用于中间计算,最终不被写入数据集。并且临时数组与其

27、它变量不同的是,它在数据步隐含循环(后面会解释此概念)中能自动保留上一步得到的值。临时数组当然也可以有多维数组,或字符型数组。四、使用数组临时数组的使用与其它程序设计语言中的数组作用相同,可以存放性质类似的数据进行处理。SAS以变量为元素的数组可以方便变量的循环处理,比如,读入了comp1-comp10 十个计算机销售额变量,prin1-prin6六个打印机销售额变量,希望计算其总和,可以用如下的数组说明与DO循环配合进行:data sales; input comp1-comp10 prin1-prin6; ARRAY y(*) comp1-comp10 prin1-prin6; tot=0

28、; do i=1 to DIM(y); tot + y(i); end; cards;run;此例中数组说明用了星号说明维数,求总和时用了累加语句。事实上,在数组说明的数组元素列表部分除了列出具体的变量名表外,还可以用特殊名字_NUMERIC_代表所有数值型变量的列表,用_CHARACTER_代表所有字符型变量的列表,用_ALL_代表所有变量的列表(用_ALL_ 时所有变量应该同为数值型或同为字符型,否则出错)。所以上例中的数组y的说明中还可以用_NUMERIC_或_ALL_代替变量名列表。实际上,SAS为变量累加提供了一个专门的函数SUM(OF ),比如上面的tot变量可以用SUM(OF c

29、omp1-comp12 prin1-prin6)计算。这个例子主要为说明如何循环处理多个变量。函数SAS提供了比一般程序设计语言多几倍的标准函数可以直接用在数据步的计算中,其中包括所有语言都有的数学函数、字符串函数,还包括特有的统计分布函数、分位数函数、随机数函数、日期时间函数、财政金融函数,等等。这些函数的调用方法类似其它语言,比如求x1,x2,x3三个自变量的和可以用函数SUM(x1,x2,x3) 。另外,SAS还提供了函数调用的另一种语法以便于把多个数据集变量作为函数自变量,其格式为“函数名(OF 变量名列表)”,其中变量名列表可以是任何合法的变量名列表,比如x1 ,x2,x3的和等价地

30、可以用SUM(OF x1 x2 x3)或SUM(OF x1-x3)表示。注意两种写法不能混在一起,比如SUM(OF x1,x2,x3)和SUM(x1-x3)都是错的。本小节对重要的函数加以介绍,其它详见SAS软件:Base SAS软件使用手册(高惠璇等编译,中国统计出版社出版)。一、数学函数 ABS(x) 求x的绝对值。 MAX(x1,x2,xn) 求所有自变量中的最大一个。 MIN(x1,x2,xn) 求所有自变量中的最小一个。 MOD(x,y) 求x除以y的余数。 SQRT(x) 求x的平方根。 ROUND(x,eps) 求x按照eps指定的精度四舍五入后的结果,比如ROUND(5654.

31、5654,0.01) 结果为5654.57,ROUND(5654.5654,10)结果为5650。 CEIL(x) 求大于等于x的最小整数。当x为整数时就是x本身,否则为x右边最近的整数。 FLOOR(x) 求小于等于x的最大整数。当x为整数时就是x本身,否则为x左边最近的整数。 INT(x) 求x扔掉小数部分后的结果。 FUZZ(x) 当x与其四舍五入整数值相差小于1E-12时取四舍五入。 LOG(x) 求x的自然对数。 LOG10(x) 求x的常用对数。 EXP(x) 指数函数 。 SIN(x), COS(x), TAN(x) 求x的正弦、余弦、正切函数。 ARSIN(y) 计算函数y=s

32、in(x)在 区间的反函数,y取-1,1间值。 ARCOS(y) 计算函数y=cos(x)在 的反函数,y取-1,1间值。 ATAN(y) 计算函数y=tan(x)在 的反函数,y取 间值。 SINH(x), COSH(x), TANH(x) 双曲正弦、余弦、正切 ERF(x) 误差函数 GAMMA(x) 完全 函数 此外还有符号函数SIGN, 函数一阶导数函数DIGAMMA,二阶导数函数TRIGAMMA ,误差函数余函数ERFC, 函数自然对数LGAMMA,ORDINAL函数,AIRY 函数,DAIRY函数,Bessel函数JBESSEL,修正的Bessel函数IBESSEL,等等。二、数组

33、函数 数组函数计算数组的维数、上下界,有利于写出可移植的程序。数组函数包括: DIM(x) 求数组x第一维的元素的个数(注意当下界为1时元素个数与上界相同,否则元素个数不一定与上界相同)。 DIM k(x) 求数组x第k维的元素的个数。 LBOUND(x) 求数组x第一维的下界。 HBOUND(x) 求数组x第一维的上界。 LBOUND k(x) 求数组x第 k维的下界。 HBOUND k(x) 求数组x第 k维的上界。 三、字符函数 较重要的字符函数有: TRIM(s) 返回去掉字符串s的尾随空格的结果。 UPCASE(s) 把字符串s中所有小写字母转换为大写字母后的结果。 LOWCASE(

34、s) 把字符串s中所有大写字母转换为小写字母后的结果。 INDEX(s,s1) 查找s1在s中出现的位置。找不到时返回0。 RANK(s) 字符s的ASCII码值。 BYTE(n) 第n个ASCII码值的对应字符。 REPEAT(s,n) 字符表达式s重复n次。 SUBSTR(s,p,n) 从字符串s中的第p个字符开始抽取n个字符长的子串 TRANWRD(s,s1,s2) 从字符串s中把所有字符串s1替换成字符串s2后的结果。 其它字符函数还有COLLATE,COMPRESS,INDEXC,LEFT,LENGTH,REVERSE,RIGHT,SCAN ,TRANSLATE,VERIFY,COM

35、PBL,DEQUOTE,INDEXW,QUOTE,SOUNDEX,TRIMN,INDEXW。四、日期和时间函数 常用日期和时间函数有: MDY(m,d,yr) 生成yr年m月d日的SAS日期值 YEAR(date) 由SAS日期值date得到年 MONTH(date) 由SAS日期值date得到月 DAY(date) 由SAS日期值date得到日 WEEKDAY(date) 由SAS日期值date得到星期几 QTR(date) 由SAS日期值date得到季度值 HMS(h,m,s) 由小时h、分钟m、秒s生成SAS时间值 DHMS(d,h,m,s) 由SAS日期值d、小时h、分钟m、秒s生成S

36、AS日期时间值 DATEPART(dt) 求SAS日期时间值dt的日期部分 INTNX(interval,from,n) 计算从from开始经过n个in间隔后的SAS日期。其中interval 可以取YEAR、QTR、MONTH、WEEK、DAY等。比如,INTNX(MONTH, 16Dec1997d, 3)结果为1998年3月1日。注意它总是返回一个周期的开始值。 INTCK(interval,from,to) 计算从日期from到日期to中间经过的interval间隔的个数,其中interval取MONTH等。比如,INTCK(YEAR, 31Dec1996d, 1Jan1998d)计算1

37、996年12 月31日到1998年1月1日经过的年间隔的个数,结果得2,尽管这两个日期之间实际只隔1年。 其它日期和时间函数还有DATE、TODAY、DATETIME、DATEJUL、JULDATE、HOUR、MINUTE、SECOND 、TIME、TIMEPART等。详见SAS系统Base SAS软件使用手册、SAS系统SAS/ETS软件使用手册。五、分布密度函数、分布函数 作为一个统计计算语言,SAS提供了多种概率分布的有关函数。分布密度、概率、累积分布函数等可以通过几种统一的格式调用,格式为 分布函数值 = CDF( 分布, x ); 密度值 = PDF( 分布, x ); 概率值 =

38、PMF( 分布, x ); 对数密度值 = LOGPDF( 分布, x ); 对数概率值 = LOGPMF( 分布, x ); CDF计算由分布指定的分布的分布函数, PDF计算分布密度函数值,PMF计算离散分布的分布概率,LOGPDF为PDF的自然对数,LOGPMF为PMF的自然对数。函数在自变量 x处计算,表示可选的参数表。分布类型取值可以为: BERNOULLI, BETA, BINOMIAL, CAUCHY, CHISQUARED, EXPONENTIAL, F, GAMMA, GEOMETRIC, HYPERGEOMETRIC, LAPLACE, LOGISTIC, LOGNORMA

39、L, NEGBINOMIAL, NORMAL 或 GAUSSIAN, PARETO, POISSON, T, UNIFORM, WALD 或 IGAUSS, and WEIBULL。可以只写前四个字母。 例如,PDF(NORMAL, 1.96)计算标准正态分布在1.96处的密度值(0.05844),CDF(NORMAL, 1.96)计算标准正态分布在1.96处的分布函数值(0.975)。PMF对连续型分布即PDF。除了用上述统一的格式调用外,SAS还单独提供了常用的分布的密度、分布函数。 PROBNORM(x) 标准正态分布函数 PROBT(x,df) 自由度为df的t分布函数。可选参数nc为

40、非中心参数。 PROBCHI(x,df) 自由度为df的卡方分布函数。可选参数nc为非中心参数。 PROBF(x,ndf,ddf) F(ndf,ddf)分布的分布函数。可选参数nc为非中心参数。 PROBBNML(p,n,m) 设随机变量Y服从二项分布B(n,p),此函数计算P(Y m)。 POISSON(lambda,n) 参数为lambda的Poisson分布Y n的概率。 PROBNEGB(p,n,m) 参数为(n,p)的负二项分布Y m的概率。 PROBHYPR(N,K,n,x) 超几何分布的分布函数。设N个产品中有K个不合格品,抽取n个样品,其中不合格品数小于等于x的概率为此函数值。

41、可选参数r是不匀率,缺省为1 ,r代表抽到不合格品的概率是抽到合格品概率的多少倍。 PROBBETA(x,a,b) 参数为(a,b)的Beta分布的分布函数。 PROBGAM(x,a) 参数为a的Gamma分布的分布函数。 PROBMC 计算多组均值的多重比较检验的概率值和临界值。 PROBBNRM(x,y,r) 标准二元正态分布的分布函数,r为相关系数。 六、分位数函数 分位数函数是概率分布函数的反函数。其自变量在0到1之间取值。分位数函数计算的是分布的左侧分位数。SAS提供了六种常见连续型分布的分位数函数。 PROBIT(p) 标准正态分布左侧p分位数。结果在5到5之间。 TINV(p,

42、df ) 自由度为df的t分布的左侧p分位数。可选参数nc为非中心参数。 CINV(p,df) 自由度为df的卡方分布的左侧p分位数。可选参数nc为非中心参数。 FINV(p,ndf,ddf) F(ndf,ddf)分布的左侧p分位数。可选参数nc为非中心参数。 GAMINV(p,a) 参数为a的伽马分布的左侧p分位数。 BETAINV(p,a,b) 参数为(a,b)的贝塔分布的左侧p分位数。 七、随机数函数 SAS可以用来进行随机模拟。它提供了常见分布的伪随机数生成函数。 1均匀分布随机数 有两个均匀分布随机数函数:UNIFORM(seed),seed必须是常数,为0,或5位、6位、7位的奇数

43、。RANUNI(seed),seed为小于2*31-1的任意常数。在同一个数据步中对同一个随机数函数的多次调用将得到不同的结果,但不同数据步中从同一种子出发将得到相同的随机数序列。随机数种子如果取0或者负数则种子采用系统日期时间。2正态分布随机数有两种,NORMAL(seed),seed为0,或5位、6位、7位的奇数。RANNOR(seed),seed为任意数值常数。3指数分布随机数RANEXP(seed),seed为任意数值,产生参数为1的指数分布的随机数。参数为lambda的指数分布可以用RANEXP(seed)/lambda得到。另外若Y=alphabeta*LOG(RANEXP(see

44、d),则Y为位置参数为alpha,尺度参数为beta的极值分布。若Y=FLOOR(-RANEXP(seed)/LOG(p),那么Y是具有参数p的几何分布变量。4伽马分布随机数RANGAM(seed, alpha),seed为任意数值常数,alpha0,得到参数为alpha的伽马分布。设X=RANGAM(seed, alpha),则Y=beta*X是形状参数为alpha,尺度参数为beta的GAMMA分布随机数。如果alpha是整数,则Y=2*X是自由度为2*alpha的卡方分布随机数。如果alpha是正整数,则Y=beta*X是Erlang分布随机数,为alpha个独立的均值为beta的指数分

45、布变量的和。如果Y1=RANGAM(seed,alpha),Y2=RANGAM(seed,beta),在Y=Y1/(Y1+Y2)是参数为(alpha,beta )的贝塔分布随机数。5三角分布随机数RANTRI(seed,h),seed为任意数值常数,0h0的泊松分布随机数,seed为任意数值。 9一般离散分布随机数 RANTBL(seed, p1, , pn)生成取1,2,n的概率分别为p1,pn的离散分布随机数。八、样本统计函数样本统计函数把输入的自变量作为一组样本,计算样本统计量。其调用格式为“函数名(自变量1,自变量2,自变量n)”或者“函数名(OF 变量名列表)”。比如SUM是求和函数

46、,如果要求x1,x2,x3的和,可以用SUM(x1,x2,x3),也可以用SUM(OF x1-x3)。这些样本统计函数只对自变量中的非缺失值进行计算,比如求平均时把缺失值不计入内。各样本统计函数为: MEAN 均值 MAX 最大值 MIN 最小值 N 非缺失数据的个数 NMISS 缺失数值的个数。 SUM 求和 VAR 方差 STD 标准差 STDERR 均值估计的标准误差,用STD/SQRT(N)计算。 CV 变异系数 RANGE 极差 CSS 离差平方和 USS 平方和 SKEWNESS 偏度 KURTOSIS 峰度 注意:数据集的存储一般是每行为一个个体的观测值,每列是个体的一个属性(变

47、量),所以统计一般应该对列进行,而不是象这里对行进行,把各变量作为一个样本的各个观测处理。这里提供的函数主要用于进行一些自编程的计算。SAS/IML矩阵功能简介SAS/IML是SAS提供的一个可以进行矩阵运算编程的工具,详细使用请参见有关资料或系统帮助(Help | Extended Help | SAS System Help: Main Menu | Help for SAS Products | SAS/IML)。它可以用来进行交互的矩阵运算,也可以编好一个程序再一起运行。程序可以使用分支、循环、模块化子程序等控制结构。数据步中的函数大都能在SAS/IML中使用,SAS/IML 也提供了

48、一些特有的函数。SAS/IML的一个方便之处是它可以直接读取SAS的数据集并把结果写成SAS数据集,它也有存取外部文件的功能。要交互运行SAS/IML,只要在程序窗口输入proc iml; reset print;提交此程序,就可以进入交互的SAS/IML运算状态。退出用QUIT语句。SAS/IML中可以使用标量、行向量、列变量和矩阵,可以使用字符型数据。变量取名规则遵循SAS语言的统一规定,变量可以存储标量、向量和矩阵。赋值用等号。例如:sc = 15.25;vh = 1 2;vh1=5:9;vv = 3, 4;mat1 = 1 2 3, 4 5 6;mat2 = Li Ming, Zhan

49、g Chong;我们注意赋值语句是一个SAS语句,它以分号结尾。上面定义了标量sc,行向量vh和vh1,列向量vv,两行两列的矩阵mat1,字符型矩阵mat2。 由上可见,写矩阵常量时,行的元素之间以空格分隔,行之间以逗号分割。可以用“开始:结尾”的写法生成一个等差数列行向量。矩阵之间可以用、等符号进行元素两两间的比较。要得到一个标量的结果,可以用ALL()函数表示自变量的各元素均为真(非零),用ANY()函数表示自变量的元素中至少一个为真。可以用&、|、连接两个逻辑型矩阵(元素间的与、或、非)。用|表示矩阵左右连接,用/表示矩阵上下连接。x表示x的转置。SAS/IML中可以进行通常的矩阵加减

50、乘(、*)运算,也可以进行对应元素之间的乘除(、/)运算。矩阵加减必须两个矩阵大小完全相等,或者其中一个是标量。矩阵乘法要求第一矩阵的列数等于第二矩阵的行数,或其中一个是标量。矩阵元素之间的乘除运算是对应元素进行乘除,当两个矩阵大小完全相同时可以进行运算,其中有一个是标量时可以进行运算,另外,如果其中有一个是行(列)向量而其长度与另一个矩阵的列数(行数)相同也可以进行运算。矩阵逆要用INV()函数运算。为了读入一个数据集,先打开数据集,用如USE sasuser.c9501;然后用READ ALL VAR 变量列表的格式读入数据集的各变量值,例如:READ ALL VAR name math

51、chinese;print name math chinese;这时三个变量都可以作为列向量来使用。SAS语言的数据管理功能 前面说过,SAS语言是一种专用的数据管理、分析语言,它提供了很强的数据操作能力。这些数据操作能力表现在它可以轻易地读入任意复杂格式的输入数据,并可以对输入的数据进行计算、子集选择、更新、合并、拆分等操作。另外,SAS系统还提供了用来访问其它数据库系统如Sybase、Oracle的接口,访问各种微机用数据库文件如FoxPro、Excel的接口及向导,并提供了一个SQL过程来实现数据库查询语言SQL的功能。SAS语言直接、间接用于数据管理的语句很多,这里只能拣最常用的介绍。

52、SAS数据步的运行机制SAS语言的自编程计算功能主要在数据步实现,一个SAS数据步相当于一个单独运行的程序。但是,SAS语言又是一个专用数据处理语言,所以SAS数据步有其它语言所没有的特点。我们以下面的简单例子说明这一点:data a; put x= y= z=; input x y; z=x+y; put x= y= z=; cards;10 20100 200;run;运行后在LOG窗口显示如下记录: X=. Y=. Z=.X=10 Y=20 Z=30X=. Y=. Z=.X=100 Y=200 Z=300X=. Y=. Z=.NOTE: The data set WORK.A has 2

53、 observations and 3 variables.这个程序的运行流程是这样的: o DATA语句标志了数据步开始,并指定了数据步结束时要生成的数据集名字为A(实际是WORK.A)。 o 第一个PUT语句要输出变量X、Y、Z的值但它们还都没有定义,所以LOG窗口的结果显示为三个缺失值。 o 下面是INPUT语句,它从CARDS语句后面的数据行中读取变量X的值10,变量Y的值20。 o 下一个赋值语句计算变量Z的值得到30。因此,LOG 中的第二行输出显示三个变量的值分别为10、20、30。 o 从CARDS语句开始到空分号行的各行是非执行的,程序运行到RUN语句,发现这是本数据步的最后

54、一个语句,按一般的程序语言的规则,程序到这里就应该结束了,但是,SAS是一个专用数据处理语言,如果按一般语言的规则,程序中的第二行数据(100 200)就不能被读入。所以,这个程序运行到RUN语句后,把读入的观测(这是第一号观测)写入输出数据集, o 又返回到DATA语句后的第一个可执行语句开始执行,并先把所有的变量置初值为缺失值。于是,第一个PUT语句的结果显示三个变量均为缺失值,而不是上一步的10、20、30。 o 下一个INPUT语句从数据行中读入下一个观测,把变量X 、Y赋值100、200。读取位置由运行时设置的一个数据指针指示。然后计算变量Z的值得300。于是PUT语句输出的X、Y、

55、Z值分别为100、200、300。 o 然后,运行控制跳过CARDS语句到空语句,到数据步结尾,把第二号观测输出到数据集, o 再返回到数据步开头,把变量值赋初值为缺失值,所以第一个PUT语句输出的三个变量值为缺失值。 o 然后运行到INPUT语句,应该读入下一个观测,但是查询数据指针发现已经读完了所有数据,所以本数据步结束,并把两个观测写入数据集WORK.A中。 提交PROC PRINT;RUN;就可以显示此数据集的内容如下: OBS X Y Z 1 10 20 30 2 100 200 300从这个例子可以看出SAS数据步程序和普通程序的一个重大区别:SAS数据步如果有数据输入,比如用INPUT、SET、MERGE、UPDATE、MODIFY等语句读入数据,则数据步中隐含了一个循环,即数据步程序执行到最后一个语句后,会返回到数据步内的第一个可执行语句开始继续执行,直到读入数据语句(INPUT、SET、MERGE、UPDATE、MODIFY等)读入了数据结束标志为止才停止执行数据步,并把读入的各个观测写入在DATA语句中指定的数据集。如果没有数据输入而只是直接计算,则数据步程序不需要此隐含循环。数据步因为有这样

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!