医用SAS统计分析主讲人 景学安医用SAS统计分析第一讲主讲人 景学安SAS软件简介vSAS发展概述 SAS(Statistical Analysis System)是一个管理数据、分析数据和编写打印各种形式报告的组合软件系统,是国际上非常流行的统计分析软件之一1985年,美国SAS研究所推出了可以在微机上运行的SAS/PC版本,此后,又不断出新的版本,功能不断增强,越来越多的人在用它进行统计分析的同时,也把它用作数据管理软件在英美等国,能熟练使用SAS进行统计分析是许多公司和科研机构选材的条件之一美国FDA新药审批程序中,新药试验结果的统计分析规定只能用SAS进行 ,目前已到SAS9.0版本9/16/20249/16/20242 2视窗管理系统数据步语句基本过程统计过程绘图过程全屏幕数据处理矩阵计算过程时间序列分析运筹学分析质量控制DMSDATABASESTATGRAPHFSPIMLETSORQC图图1 SAS基本组成基本组成vSAS的基本组成 9/16/20249/16/20243 3v SAS的特点 1.语言编程能力强SAS语言具有一般高级语言的一切功能,有100多个函数,有完成各种操作的算符,能读各种类型的数据,可以使用赋值语句、条件语句、数组和循环语句等对变量进行操作。
SAS程序书写自由简洁 2.分析方法丰富由SAS基本组成可见,SAS汇集了大量的统计方法,从简单描述统计量的计算到多因素分析,从时间序列分析到质量控制等仅SAS/STAT就包括了8类方法28个分析过程9/16/20249/16/20244 4 3.对数据的连续处理SAS能同时处理多个输入文件,能从几个数据集中组合变量值、观测值,建立子集,连接、合并和修改数据SAS可存储一个合法的结果或中间结果,以便以后使用 4.可组合性由于SAS是模块式结构,用户可按自己的要求,在SAS/BASE的基础上选择合适的模块,以组成自己需要的系统 9/16/20249/16/20245 5SAS程序和程序和SAS数据集数据集q安装 直接启动SAS安装界面q启动v 由程序栏启动由程序栏启动 v 由由run命令启动命令启动v 由文件名直接启动v 建立桌面快捷方式直接启动9/16/20249/16/20246 6q界面(显示管理系统):三个基本窗口vPROGRAM EDITOR 编辑窗:编辑SAS程序vLOG 记录窗:程序运行过程、时间、错误信息(红色显示)vOUTPUT结果输出窗:当程序运行无误,且有结果输出时显示v其他:var窗(显示指定数据集有关SAS变量信息)、keys窗(功能键窗)、libname窗(显示当前SAS库的名字和路径)等。
以上窗口在command命令行输入相应的命令激活9/16/20249/16/20247 7v “Command= = =>”命令行 位于每个窗口的上方,在options下拉菜单中Preference对话框中激活Command line 即可出现在箭头后输入有关命令后并回车即可执行如: keys: 进入功能键窗口 clear: 清除光标所在的窗口中显示的内容 bye: 退出SAS系统,回到Windows系统 num: 程序编辑窗口出现行号,再键入num行号消失9/16/20249/16/20248 8qSAS运行菜单v“File” 调用、储存、打印文件v “Edit” 用于编辑文件v“Local” 用于运行本机文件 其中:Submit是运行程序,Recall是调回前面用过的程序v“Globals” 可供选择窗口v “Options” 选择SAS的功能v“Help” 可随时提供帮助咨询9/16/20249/16/20249 9q菜单下方的工具条 Submit(运行),New(新文件),Open(打开文件),Save(储存文件),Print(打印),View(预览),Cut(裁剪),Copy(复制),Paste(粘贴),Undo(恢复),DOS Prompt(DOS方式),Browse(连接英特网), Libraries(库), SAS/ Assist(应用SAS/ASSIST模块), Help(提供帮助)9/16/20249/16/20241010q SAS文件系统q*.sd2 SAS数据集(6.12版), 8.0以上版为 *.sas7bdatq*.sas EDITOR视窗输出SAS程序文件 q*.log LOG视窗输出文件 q*.lst OUTPUT视窗口输出文件9/16/20249/16/20241111qSAS中的常用变量 v数值型变量 变量名有1—8个字符组成,以英文字母开头,其余可以是英文字母、数字或下划线,不能有空格。
如AGE, X2, X1_1,等都是合法的, 1X , XY-1,X 1,等都是不合法的 变量值过大或过小的数可用科学记数法,如:1.785E-19 即为1.785×10-19 v字符型变量 字符型变量在变量名后加“$”号表示,如NAME$ , SEX$等一个字符变量是由1-200个字符组成的字符串,如:Zhang Hua , M等都是一个字符变量9/16/20249/16/20241212qSAS运算符与常用函数v算术运算符 ﹡﹡(乘方)﹡(乘) /( 除) +( 加) ﹣(减)v比较运算符 = 或 EQ (等于) ^= 或 NE(不等于) > 或 GT(大于) >= 或 GE(大于等于) < 或 LT(小于) <= 或 LE (小于等于)v逻辑运算符 AND或& (逻辑与) OR或 | (逻辑或) NOT或^ (逻辑非) 如 A>25 & B>30 ; A>25 | B>30 ;NOT(A>3)v 常用函数 ABS(x) —x的绝对值; SQRT(x) —x的平方根; EXP(x) —e(2.71828)的x次方; LOG(x) —x的自然对数(以e为底); LOG2(x) —x的以2为底的对数; LOG10(x) —x的普通对数(以10为底)9/16/20249/16/20241313qSAS程序结构:程序结构:由三部分组成;SAS语句以一个关键词开始, 以分号(;)结束。
v数据步 以data语句开始,用于创建和处理数据集§Data语句的功能:语句的功能:(1)标志数据步的开始;标志数据步的开始;(2)命名将要创建的命名将要创建的SAS数据集 data语句格式:语句格式: data 数据集名;数据集名;§Input语句的功能:语句的功能:(1)读入由语句指定的数据列;读入由语句指定的数据列;(2)为相应数据域定义变量名;为相应数据域定义变量名;(3)确定变量的读入模式确定变量的读入模式Input语句格式:语句格式:input 变量名变量名 [变量类型变量类型];;§Cards语句:语句:标志数据块的开始格式为:标志数据块的开始格式为:cards;9/16/20249/16/20241414data esr ; /*建立临时数据集esr.sd2,自动放在saswork子目录下*/Input x ; /* 指明要输入的变量 */Cards ; /*标志数据区开始*/ 3 9 8 6 5 5 7 3 10 8 10 4 ;9/16/20249/16/20241515v过程步 以PROC语句开始,对数据进行分析和处理时,需要调用SAS过程,SAS过程是一系列应用程序。
语句格式:PROC SAS过程名[选项];常用的[选项]为:data=数据集名 如:proc print ; /*调用现成的SAS过程,进行统计分析*/v提交程序步 Run ; /*在程序最后,指示过程步或数据步结束,可以提交程序*/9/16/20249/16/20241616 Log窗输出9/16/20249/16/20241717 Output窗输出窗输出9/16/20249/16/20241818q程序运行程序运行---在编辑窗输入程序后在编辑窗输入程序后–点击图标–按功能键“F8”–在命令行(窗)键入“submit”–在local下拉菜单中选“submit ”q窗口内容保存窗口内容保存----激活窗口后激活窗口后–在命令行(窗)键入 file ‘路径\文件名’–点击图标–在file下拉菜单中选“save ”或“save as”–只有编辑窗口(edit 窗)才能打开文件9/16/20249/16/20241919q常用的快捷键常用的快捷键–F1 Help命令,进入帮助视窗–F4 recall命令,用于edit窗,将前面提交的程序 调回,可多次使用。
–F5 切换到edit视窗–F6 切换到log视窗–F7 切换到output视窗–F8 submit命令–F9 Keys命令,进入功能键视窗–Ctrl-E 清除当前窗口的内容 edit窗被清除的内容不能用F4调回9/16/20249/16/20242020SAS数据集建立数据集建立---用用input和和cards语句直接输入语句直接输入 data child; /*建立临时数据集child.sd2,自动放在saswork子目录下*/ input id x1 $ x2 x3 x4 x5 x6; /* 指明要输入的变量 , $为字符型变量*/ cards; /*标志数据区开始,数据之间以一个或几个空格分隔*/ 1 m 32 95.5 14.0 53.5 49.64 2 m 35 92.0 13.0 52.0 41.61 3 m 33 89.0 12.5 53.5 35.81 254 m 176 168.0 53.5 82.0 100.14 255 f 30 91.0 11.0 48.0 35.39 256 f 33 91.0 11.5 47.0 44.98 521 f 178 163.0 51.0 79.0 87.42 ; /* 标志数据区结束,分号必须单独一行 */ run;9/16/20249/16/20242121SAS数据集建立数据集建立---数据读入数据读入data a1;input id x1$ x2 x3 x4;cards;1 m 32 95.52 m 35 92.0 13.03 m 33 89.0 12.5;proc print;run;结果:OBS ID X1 X2 X3 X41 1 m 32 95.5 2.02 3 m 33 89.0 12.5data a1;input id x1$ x2 x3;cards;1 m 32 95.52 m 35 92.0 13.03 m 33 89.0 12.5;proc print;run;结果:OBS ID X1 X2 X3 1 1 m 32 95.5 2 2 m 35 92.0 3 3 m 33 89.09/16/20249/16/20242222q不分行符@@的使用 data esr; input x @@; /*每读入一条记录后,数据指针保持原位不换行, 继续读下一条记录*/ cards; 3 9 8 6 5 5 7 3 10 8 10 4 ; proc means; run; 结果: Analysis Variable : X N Mean Std Dev Minimum Maximum ---------------------------------------------------------- 12 6.5000000 2.5405797 3.0000000 10.0000000 ----------------------------------------------------------9/16/20249/16/20242323SAS数据集建立数据集建立q缺失值的输入--- 以 . 表示,缺失值不进入分析 data child; input id x1 $ x2 x3 x4 x5 x6; cards; 1 m 32 95.5 14.0 53.5 49.64 2 m 35 . 13.0 52.0 41.61 3 m 33 89.0 12.5 53.5 35.81 254 m 176 168.0 53.5 82.0 100.14 255 f 30 91.0 11.0 48.0 35.39 256 f 33 91.0 11.5 47.0 44.98 521 f 178 163.0 51.0 79.0 87.42 ;proc means;run;9/16/20249/16/20242424SAS数据集建立数据集建立结果Variable N Mean Std Dev Minimum Maximum -------------------------------------------------------------- ID 7 184.5714286 194.9639771 1.0000000 521.0000000 X2 7 73.8571429 70.4779601 30.0000000 178.0000000 X3 6 116.2500000 38.2410120 89.0000000 168.0000000 X4 7 23.7857143 19.4825930 11.0000000 53.5000000 X5 7 59.2857143 14.7361719 47.0000000 82.0000000 X6 7 56.4271429 26.2540446 35.3900000 100.1400000 --------------------------------------------------------------9/16/20249/16/20242525SAS数据集建立数据集建立---永久数据集和临时数据集永久数据集和临时数据集qSAS数据集名称的表示方式数据集名称的表示方式:两级文件名两级文件名v定义库关联名定义库关联名: libname 命令 libname 库关联名库关联名 ‘ 盘符盘符:\路径路径’; 如: libname dw ‘c:\teach’; 路径必须实际存在路径必须实际存在。
v库关联名库关联名. 数据集名数据集名: 如 dw.esrq临时数据集临时数据集::存放在sas\saswork子目录中的数据集,一旦退出sas,会被自动删除它的库关联名库关联名默认为work,均省略不写前面所生成的数据集都是临时数据集,退出sas后都会被删除q永久数据集永久数据集::通过两级文件名的形式,将生成的数据集存放到saswork以外的路径中(库关联名所指向的路径库关联名所指向的路径),即可以生成永久数据集即使退出SAS也还存在,可供以后调用例: libname dw ‘c:\teach’; data dw.esr; input x1 x2 x3 ; (略) 9/16/20249/16/20242626q从已建立的SAS数据集中读入数据建立新的SAS数据集---set命令libname L ‘c:\teach’;data L.child ;set chlid;proc print;run; data a;set L.child;proc print;run; data b;set a;run;注:Proc 步的操作对象总是最新生成的SAS数据集。
只有proc步时,也可通过在proc语句后加data=指定要分析的数据集如:proc means data=L.chlid;run;9/16/20249/16/20242727SAS数据集建立数据集建立---从其它数据集转入从其它数据集转入q利用file下拉菜单中的import功能 ,直接将其他类型的数据文件,转为SAS数据集可转入:v文本型数据文件(*.txt) 可用Notebook(记事本)输入数据,首行为变量名,制表键(Tab)分隔vdbase II 和 III数据库文件(*.dbf)vexcel数据库 SAS8.0以上可转入Excel 97及2000的数据库,用Excel输入数据,首行为变量名 9/16/20249/16/20242828§有的数据可通过粘贴的方法贴到edit窗后,加入input和cards等语句,生成sas数据集q用infile语句建立SAS数据集 语句格式 infile ‘盘符:\文件夹\文件名.txt (或dat)’ ; 首先用任何文字处理软件来建立一个数据文件,但一定用纯文本格式保存该纯本数据文件是不包含变量名的,必须知道那一列数据是哪一个变量值,调用使用input x1 x2 ┄ 指明。
9/16/20249/16/20242929例 新建纯文本文件“xy”,路径为 e:\sas\xy.txt 数据为: 56 34 57 35 58 36 59 37 60 38 61 39 62 40 63 41 64 43 61 28data Li_1;infile 'e:\sas\xy.txt';input x y @@;proc print;run;OBS X Y 1 56 34 2 57 35 3 58 36 4 59 37 5 60 38 6 61 39 7 62 40 8 63 41 9 64 43 10 61 289/16/20249/16/20243030SAS数据集的整理数据集的整理---变量操作变量操作q变量重命名:变量重命名: rename 旧变量名=新变量名; 如 rename id=x0; q变量赋值或修改变量值:变量赋值或修改变量值: 变量名=表达式;如 y=log10(x);q累加语句 累加变量+表达式 累加语句能把语句中表达式的运算结果或变量值累加到累加变量上,并作为记录送到数据集中。
累加变量必须是数值型,表达式是符合SAS语言规则的表达式累加变量的初始值由系统自动设置为零9/16/20249/16/20243131例data abc;input a b c @@;sum=a+b+c;sumz+sum;cards;21 22 26 5 7 4 12 3 67 16 23 19 2 3;proc print;run; OBS A B C SUM SUMZ 1 21 22 26 69 69 2 5 7 4 16 85 3 12 3 6 21 106 4 7 16 23 46 152 5 19 2 3 24 1769/16/20249/16/20243232q用keep或drop语句整理变量名表 keep <变量名表>;(指定要保留在数据集的变量) drop <变量名表>;(指定要从数据集中删除的变量)q结合if语句进行条件赋值 if <条件表达式> then <表达式>; [else <表达式>];9/16/20249/16/20243333例 data keep; input x1 x2 x3 @@; x4=log10(x1); keep x1 x2 x4; rename x4=lgx1; Cards; 20 34 32 24 50 93 34 43 56 42 56 88 ; proc print; run; 注:keep语句等价于 drop x3 ;OBS X1 X2 LGX1 1 20 34 1.30103 2 24 50 1.38021 3 34 43 1.53148 4 42 56 1.623259/16/20249/16/20243434data drop;set child;if id<200 then group=1; else group=2;drop x3 x4 x5 x6;rename id=x0; proc print;run; 注:drop语句等价于 keep id x1 x2 group;OBS X0 X1 X2 GROUP 1 1 m 32 1 2 2 m 35 1 3 3 m 33 1 4 254 m 176 2 5 255 f 30 2 6 256 f 33 2 7 521 f 178 2例9/16/20249/16/20243535SAS数据集的整理数据集的整理---记录操作记录操作q数据子集化数据子集化 v记录输出记录输出§语句格式:if <表达式> ; “将符合表达式的记录输出到新建的数据集。
§语句格式:if<表达式> then output <数据集名1> ; else output<数据集名2>;Output 的使用:一般SAS在data步语句全部执行完后才将数据送入新数据集但遇到output语句时,会马上将当前的数据送入新数据集;此时,如果output语句后还有其他data步语句,则不再被执行 9/16/20249/16/20243636 例1 data a;input x @@; cards;2 3 5 6 8 9 10;data b;set a;if x>3; /*只将x>3的变量值由数据集a 赋值给数据集b*/proc print;run;v记录删除记录删除 if <表达式> then delete; “ 将符合表达式的变量从数据集中删除 OBS X 1 5 2 6 3 8 4 9 5 109/16/20249/16/20243737data b1; set child; if x1=‘m’; proc print; Run; OBS ID X1 X2 X3 X4 X5 X6 1 1 m 32 95.5 14.0 53.5 49.64 2 2 m 35 92.0 13.0 52.0 41.61 3 3 m 33 89.0 12.5 53.5 35.81 4 254 m 176 168.0 53.5 82.0 100.14data b1 b2;set child; if x1=‘m’ then output b1 ;else output b2;run;例29/16/20249/16/20243838例例3data a;input id x1 x2 x3 ;cards;1 0 12 12 1 55 23 0 15 24 1 14 35 0 42 16 0 25 27 0 35 48 0 27 3; data c1;set a;if x1=1 then delete ;proc print;run;结果:OBS ID X1 X2 X3 1 1 0 12 1 2 3 0 15 2 3 5 0 42 1 4 6 0 25 2 5 7 0 35 4 6 8 0 27 3 9/16/20249/16/20243939例例4data c2;set a;if x1=0 then output ;if x3>=2 then x3=2; (执行了output语句,此语句不再执行。
proc print;run; 结果: OBS ID X1 X2 X3 1 1 0 12 1 2 3 0 15 2 3 5 0 42 1 4 6 0 25 2 5 7 0 35 4 6 8 0 27 3 9/16/20249/16/20244040例例5data c3;set a; if x3>=2 then x3=2;if x1=0 then output ;proc print;run;结果:OBS ID X1 X2 X3 1 1 0 12 1 2 3 0 15 2 3 5 0 42 1 4 6 0 25 2 5 7 0 35 2 6 8 0 27 2 9/16/20249/16/20244141SAS数据集的整理数据集的整理---记录操作记录操作q数据排序数据排序 对数据集数据进行排序。
语句格式:proc sort [选择项]; by [descending] 变量名; sort过程按by变量名的值进行排序 [选择项]:1.如果对非当前数据集排序,须用data指出要排序的数据集名如:proc sort data=L.px1; 2.排序后产生一新数据集,数据集名可用“out=“指出,如:proc sort out=L.px2; 如缺省,则原数据集将被输出的数据集替换 [descending] 选择为降序,不选择为升序如: by descending x1; 9/16/20249/16/20244242例例1. Libname L’d:\sas\sas1’;data L.class1;input name $ kc1 kc2 kc3 kc4;sum=(kc1+kc2+kc3+kc4);cards;zhao 83 76 68 88qian 76 77 80 69sun 75 82 78 78li 80 78 85 81;proc print;proc sort;by descending sum;proc print;Proc sort out=L.class2;by sum;proc print;run;9/16/20249/16/20244343OBS NAME KC1 KC2 KC3 KC4 SUM 1 zhao 83 76 68 88 315 2 qian 76 77 80 69 302 3 sun 75 82 78 78 313 4 li 80 78 85 81 324OBS NAME KC1 KC2 KC3 KC4 SUM 1 li 80 78 85 81 324 2 zhao 83 76 68 88 315 3 sun 75 82 78 78 313 4 qian 76 77 80 69 3029/16/20249/16/20244444OBS NAME KC1 KC2 KC3 KC4 SUM 1 qian 76 77 80 69 302 2 zhao 83 76 68 88 315 3 sun 75 84 78 78 315 4 li 80 78 85 81 3249/16/20249/16/20244545q数据集的纵向合并 将两个或多个数据集的变量值纵向合 并。
语句格式:set <数据集数据集A > < 数据集数据集B> … ; 例如:有两个数据集例如:有两个数据集A和和B,,将两者纵向合并成新数据集将两者纵向合并成新数据集AB的程序如下:的程序如下: data AB; set A b; run;SAS数据集的整理数据集的整理---记录操作记录操作9/16/20249/16/20244646 若A、B两数据集的变量完全相同,则新数据集AB的变量与两个数据集变量一致;若A、B量数据集的变量不完全一致,则新数据集AB除含有两个数据集共同的变量外,还包括各自的变量,对于原数据集中没有的变量,其值为缺失值例如,数据集A、B的变量值分别如下: 数据集 A中的数据 NO AGE SEX HEIGHT 01 16 m 178 02 16 m 170 03 17 m 175 04 18 m 169 数据集B中的数据NO AGE SEX HEIGHT WEIGHT11 16 f 160 5512 17 f 165 6013 17 f 159 509/16/20249/16/20244747新数据集AB的数据OBS NO AGE SEX HEIGHT WEIGHT 1 01 16 M 178 . 2 02 16 M 170 . 3 03 17 M 175 . 4 04 18 M 175 . 5 11 16 F 160 55 6 12 17 F 165 60 7 13 17 F 159 509/16/20249/16/20244848q数据集的横向合并 将两个或多个数据集的变量值横向合 并。
v语句格式 merge <数据集1> <数据集2> ; [by 识别字段;]–使用by 识别字段时,要先按识别字段排序 9/16/20249/16/20244949例data a;input id x1 x2 ;cards;1 11 122 21 224 41 425 51 52;data b;input id x3;cards;1 133 334 43data ab;merge a b ;by id ;proc print;run;OBS ID X1 X2 X3 1 1 11 12 13 2 2 21 22 . 3 3 . . 33 4 4 41 42 43 5 5 51 52 .9/16/20249/16/20245050例data a; input id x1 x2 ;cards;1 11 122 21 224 41 424 411 4225 51 52; data b; input id x3;cards;1 133 334 435 535 533; data c;merge a b;by id;proc print;run;OBS ID X1 X2 X3 1 1 11 12 13 2 2 21 22 . 3 3 . . 33 4 4 41 42 43 5 4 411 422 43 6 5 51 52 53 7 5 51 52 533 9/16/20249/16/20245151q在PROC过程的几个常用语句vWHERE语句 PROC过程步中定义表达式,在分析之前用该表达式选择符合条件的变量值作为分析的对象。
§语句格式 where <表达式>;例 data a; input id x1 x2 ; cards; 1 11 12 2 21 22 3 41 42 4 45 44 5 51 52 ;proc print;where x1>20;run; OBS ID X1 X2 2 2 21 22 3 3 41 42 4 4 45 44 5 5 51 529/16/20249/16/20245252v SUM语句§ 语句格式 SUM 变量表 对SUM语句中的数值变量求合并打印输出例data abc;input a b c @@;cards;21 22 26 5 7 4 12 3 67 16 23 19 2 3;proc print;sum a b c;run; OBS A B C 1 21 22 26 2 5 7 4 3 12 3 6 4 7 16 23 5 19 2 3 == == == 64 50 629/16/20249/16/20245353 v标题title语句 在PROC过程步中指定打印到输出文件上的标题内容。
§语句格式 title [n] ‘标题内容’ n为标题行,n的范围从1到10,缺省值为1标题内容是要打印的标题字符串,字符不超过132个 一旦为一行规定了一个标题,则在后继的输出中都使用该标题,直至取消该标题或为该行定义其它的标题为止若要取消现存的标题,使用下面语句: title n ; 如 title; title2; 等例9/16/20249/16/20245454data a;input x @@;cards;4 5 6 7 8 9 3 4 5;data b;input x @@;cards;45 34 56 33 44 54 32 36;data ab;set a b;proc means data=a;title 'sample a';proc means data=b;title 'sample b';proc means data=ab;title 'sample ab';proc print data=a;title;run;9/16/20249/16/20245555 sample a Analysis Variable : X N Mean Std Dev Minimum Maximum ---------------------------------------------------------------------------- 9 5.6666667 2.0000000 3.0000000 9.0000000 ---------------------------------------------------------------------------- sample b Analysis Variable : X N Mean Std Dev Minimum Maximum ------------------------------------------------------------------------------- 8 41.7500000 9.5131488 32.0000000 56.0000000 -------------------------------------------------------------------------------9/16/20249/16/20245656 sample ab Analysis Variable : X N Mean Std Dev Minimum Maximum --------------------------------------------------------------------------------- 17 22.6470588 19.6530569 3.0000000 56.0000000 -------------------------------------------------------------------------------- OBS X 1 4 2 5 3 6 4 7 5 8 6 9 7 3 8 4 9 59/16/20249/16/20245757。