SAS讲义 第十八课SAS宏功能简介
第10章 SAS宏功能

第10章SAS宏功能10.1 概述SAS系统的MACRO处理器可以让程序更简洁更明了及更容易维护,帮助用户在使用SAS系统时更方便更自动化,具体来说,它具有以下功能:1.获取SAS的系统信息;2.有条件地执行数据步和过程步;3.开发交互式系统;4.在不同的数据步和过程步之间传递数据;5.重复执行SAS代码等等。
.SAS宏语言的管理1.MACRO变量2.MACRO程序语句3.MACRO表达式和函数10.2 SAS宏变量的使用与定义宏变量(有时也称符号变量)属于SAS宏语言的范畴,和数据步中的变量的概念是不一样的。
除了数据行外,你可以在SAS程序的任何地方定义和使用宏变量。
数据步变量是和数据集相联系的,而宏变量是独立于数据集的。
数据集变量的值取决于正在处理的观测,而一个宏变量的值总是不变,直到被明确改变。
宏变量类似于一般变量的命名方法。
程序中以&宏名来引用MACRO变量(有时为了清晰起见,也可以通过&宏名. 来引用MACRO变量)SAS宏变量共有两种:1.系统宏变量2.用户自定义的宏变量。
10.2.1 系统宏变量 一些系统宏变量01 /* Program_10-l-l.sas */02 DA TA _NULL_;03 PUT 'SYSDATE=' "&SYSDA TE"; /* 执行时的日期 */04 PUT 'SYSDAY='"&SYSDAY"; /* 执行时是星期几 */05 PUT 'SYSENV='"&SYSENV"; /* 交互模式或批次模式 */06 PUT 'SYSSCP='"&SYSSCP"; /* 返回正在用的操作系统 */07 PUT 'SYSJOBID = '"&SYSJOBID"; /* 程序的操作执行代码 */08 PUT 'SYSERR='"&SYSERR"; /* 程序执行的错误码 */ 09 PUT 'SYSRC='"&SYSRC";/*程序执行的回复码 */ 10 PUT 'SYSLIBRC='"&SYSLIBRC"; /* 使用LIBNAME 时设置是否正确 */11 PUT 'SYSFILRC='"&SYSFILRC"; /*使用FILENAME 时设置是否正确*/12 RUN;使用宏语句 %put _automatic_; 可以查看所有的系统宏变量,结果显示在LOG窗口。
第讲SAS软件使用简介

35
不需编程的SAS应用 — SAS / INSIGHT
02.08.2021
西南科技大学生命科学与工程学院周海廷制作
第讲SAS软件使用简介
SAS 窗口指南
SAS 系统是被设计成能容易使用的,它为你所要完 成的所有基本 SAS 任务都提供了窗口。一旦熟悉了 你的SAS任务的起点,你就可以迅速地完成 SAS 系 统所能做的任何任务。
启动 SAS 系统后,你将看到五个主要窗口: Explorer, Results, Editor, Log, 和 Output 窗口。
西南科技大学生命科学与工程学院周海廷制作
11
查看文件的详细资料
3.可以通过拖动分隔线来改变列的大小;
02.08.2021
西南科技大学生命科学与工程学院周海廷制作
12
排列文件
默认情况下,Explorer 窗口中的文件是按文件名的字母顺 序排列的。你可以以升序或降序对任何列进行排序。
1. 点击 Type 列,则文件按类型排列;
02.08.2021
西南科技大学生命科学与工程学院周海廷制作
13
排列文件
2.再点击一次 Type 列,则按相反的方向排列;
3.选择 查看 刷新 来回到文件的原始排列。
Байду номын сангаас
02.08.2021
西南科技大学生命科学与工程学院周海廷制作
14
查看文件性质
在 Explorer 窗口中,你可以查看所有SAS文件的一般信息 以及它的 引擎/主机 信息。针对不同的文件类型,你 还可以查看不同的附加性质。
2.当你浏览完数据表中的数据后,选择 文件 关闭 来关闭 VIEWTABLE 窗口;
3.回到 Explorer 窗口的顶部。
SAS软件及部分常用功能简介

WEIGHT square; /*指明权系数*/
RUN;
二、方差分析—ANOVA Analysis of Variance
两个主要的用于方差分析的SAS过程 ANOVA(方差分析)、 GLM(一般线性模型)
GLM过程格式 CLASS 变量表;/*在MODEL语句之前*/ MODEL 因变量=效应表/选项; MEANS 效应表/选项 RANDOM 效应表/选项; CONTRAST /*对比说明*/效应 对比向量 OUTPUT OUT=输出数据集
ANOVA过程格式 PROC ANOVA 选项; CLASS 变量表;/*该项一定要设*/ MODEL 因变量=效应表/选项; FREQ 变量;
比较和选择
ANOVA过程用于平衡资料的方差分析(一元,多元, 拉丁方设计,不完全的平衡区组设计和完全嵌套设计)。
ANOVA过程有多种多重比较的方法。 一般的方差 分析皆可使用ANOVA过程 GLM过程的应用范围较广(方差,回归,协方差分 析)。
则该实验的处理结果如下表所示:
时间 1 6h 7h 8h 10h 11h 12h 5.36 5.98 6.636 6.424 9.029 8.028 5.45 5.98 6.963 7.902 8.263 7.582 重复 2 3 5.405 5.80 6.665 7.163 8.646 7.805 滤前蛋白含量 (g/L) 5.405± 0.045 5.920± 0.104 6.755± 0.181 7.163± 0.739 8.646± 0.383 7.805± 0.223
举例1:连续进行3批次发酵,诱导6h、7h、8h、10h、11h、12h 处理相同,测滤前蛋白含量,可将其看作是同一实验的三次重复 (也可进行一批次发酵,多次进行该批次如6h、7h、8h、10h、 11h、12h滤前蛋白测定)。所得3次测定结果如下:
人人都能用sas

华中科技大学同济医学院公共卫生学院
再推广
人人都能用sas
想对分析不同班级(class)体重(weight)差异,你可 以调用方差分析宏程序如下: %glm(shuju,weight,class)
解释:glm宏程序开头为:%macro glm(data,x,class) 这里面定义了“函数”名称:glm,参数:data(数据集)、x(要 分析的变量)和class(分类变量) 其他解释参见上一页
四大基础统计检验sas宏程序及使用方法
By Crazygoing
人人都能用SAS
引 言
人人都能用sas
SAS以其不可思议的强大的统计分析功能 称雄于统计软件世界;同时著名的还有他 那庞大的SAS语言系统,这让很多人望而 生畏。 对于sas入门级或者更低级选手来说,在利 用SAS做统计分析的过程中,经常会遇到 语句遗忘或者错误书写的问题,如果不常 用SAS而且又不想花时间的话,那就是个 令人头疼的问题。
华中科技大学同济医学院公共卫生学院
华中科技大学同济医学院公共卫生学院
华中科技大学同济医学院公共卫生学院
声 明
人人都能用sas
本宏程序为Crazygoing原创 欢迎随意转载使用。 本教程首发在人大经济论坛,欢迎saser们 跟帖补充其他分析方法的宏程序。 本人sas水平有限(不是谦虚),行文表达 如有不妥之处,真诚希望saser指出。 Email:wuyu84@
华中科技大学同济医学院公共卫生学院
再再推广
人人都能用sas
想对分析不同性别(gender)体重(weight)差异,若 weight不是正态分布,你可以调用秩和分析宏程序如下 %npar1way(shuju,gender,class)
第51章 SAS宏简介

%宏名称(参数值 1,参数值 2,…) 每个参数值将代入宏定义中相应位置的参数。
带参数的宏可以把宏变量和宏结合在一起,成为宏功能编程的强有力的方法。如:
%hb(outp1,e11);
%mean(data=zu4,var=stand,label=身高,title=4 组 1 个变量-身高,pair=Y,ci=y,cn=y);
%put &&city&n SAS 解析上述语句时,把&&解析成&,而把 city 作为文本,把&n 解析成 6,这样就返 回了一个宏变量引用&city6,最后%put 语句显示出宏变量 city6 的值。 例SASTJFX51_1.SAS:
%let city1=shanghai;%let city2=beijing; %macro listthem;
文本; %END; 例 SASTJFX51_4.SAS:
%macro aa; %let i=1; %do %while(&i.<=10); %put &i.; %let i=&i.+1; %end;
%mend aa; %aa;
提交这段 SAS 程序后,在 SAS 的 Log 窗口显示如下结果:
在%DO %UNTIL 循环中先提交文本进行处理,然后对表达式赋值,当表达式成立时就 停止重复提交文本。
3. 宏循环语句的进一步讨论 类似于数据步带条件的循环语句 DO WHILE 和 DO UNTIL,宏程序中也有功能类似的 %DO %WHILE 和%DO %UNTIL。它们的一般形式为: %DO %WHILE(表达式);
文本; %END; 例如: 在%DO %WHILE 循环开始对表达式赋值,当表达式成立时就重复提交文本进行处理。 %DO %UNTIL(表达式);
sas宏(1)、系统宏变量、自定义宏变量、输出宏变量值、宏与text结合

sas宏(1)、系统宏变量、⾃定义宏变量、输出宏变量值、宏与text结合SAS macro variables 1. enable you to substitute text in your SAS programs(替代作⽤,和c++的 #define 差不多) 2. When you reference a macro variable in a SAS program, SAS replaces the reference with the text value that has been assigned to that macro variable. By substituting text into programs, SAS macro variables make your programs more reusable and dynamic 3. 判断宏变量定义的结束是以分号为分隔符。
为什么要使⽤宏变量?因为,宏能起到⼀处替换,多处替换的效果!宏变量储存在哪?The value of a macro variable is stored in a symbol table。
The values of automatic macro variables are always stored in the global symbol table(意味着你总可以引⽤到这些宏)The values of user-defined macro variables can reside either in a macro symbol table local or in the global symbol table.(⾃定义的宏变量⼤部分也储存到全局符号表中)宏变量的使⽤范围有多⼤?除了datalines步,其他任何地⽅都可以使⽤!如何删除宏?%symdel mvariable;1:宏变量如何使⽤宏变量?使⽤引号符号(&)对宏进⾏引⽤,当sas程序遇到&时,会在symbol table中搜寻同名变量,进⽽得出变量中的值。
SAS宏编程

SAS宏的主要功能
❖ 产生与数据无关的SAS程序,但可展示与数据相关 的结果。宏功能可保持SAS程序的独立性和移植性。 一段程序在多种情况下均可运行,得到期望的结果。
❖ 在不同的SAS数据步和过程步之间传递数据。SAS 宏变量可在SAS的任何地方被引用,具有全局性, 所以成为不同过程间传递数据最方便的手段。
嵌套宏变量引用
❖ 可以使用嵌套的宏变量引用来改变一个长的 宏变量值而不必重新定义这个变量。例如, 为了改变在PROC PLOT步中的两个画图变 量,在PLOT的这个值中使用宏变量引用。
宏的定义
❖ 宏是一个被存贮的文本,用一个名字识别它。最简单的宏就 像一个宏变量一样工作,但复杂的宏可以完成许多宏变量不 能做的事。定义宏的语句格式为:
宏的调用
❖ 为了调用一个宏,放一个百分数符号(%) 在宏名字前面就可以了,个宏之后,可以在SAS程序中调用它, 如:
❖ Title “Display of school %study”; ❖ 宏处理器执行宏STUDY,把宏里面的固定文
宏变量
❖ 宏变量具有唯一确定的值,可以存储字符串, 是全局变量。可以在数据步中被引用,但不 能在数据步中用赋值语句定义。引用时,在 变量名前加“&”号,引用效果是变量值代替 变量名。宏变量在引用时放在单引号之间不 会被解读,只能在双引号之间。
宏变量的产生
❖ SAS系统包含两种类型的宏变量: ❖ 自动宏变量,由SAS系统提供; ❖ 用户定义的宏变量,由用户在程序中定义。
❖ 为了引用一个宏变量的值,放一个&号在宏变量名 字的前面
❖ 模式&name成为宏变量的引用。用户创建宏变量之 后,可以在SAS程序中引用它。
第10章SAS宏功能解析

第10章SAS宏功能10.1 概述SAS系统的MACRO处理器可以让程序更简洁更明了及更容易维护,帮助用户在使用SAS系统时更方便更自动化,具体来说,它具有以下功能:1.获取SAS的系统信息;2.有条件地执行数据步和过程步;3.开发交互式系统;4.在不同的数据步和过程步之间传递数据;5.重复执行SAS代码等等。
.SAS宏语言的管理1.MACRO变量2.MACRO程序语句3.MACRO表达式和函数10.2 SAS宏变量的使用与定义宏变量(有时也称符号变量)属于SAS宏语言的范畴,和数据步中的变量的概念是不一样的。
除了数据行外,你可以在SAS程序的任何地方定义和使用宏变量。
数据步变量是和数据集相联系的,而宏变量是独立于数据集的。
数据集变量的值取决于正在处理的观测,而一个宏变量的值总是不变,直到被明确改变。
宏变量类似于一般变量的命名方法。
程序中以&宏名来引用MACRO变量(有时为了清晰起见,也可以通过&宏名. 来引用MACRO变量)SAS宏变量共有两种:1.系统宏变量2.用户自定义的宏变量。
10.2.1 系统宏变量 一些系统宏变量01 /* Program_10-l-l.sas */02 DA TA _NULL_;03 PUT 'SYSDATE=' "&SYSDA TE"; /* 执行时的日期 */04 PUT 'SYSDAY='"&SYSDAY"; /* 执行时是星期几 */05 PUT 'SYSENV='"&SYSENV"; /* 交互模式或批次模式 */06 PUT 'SYSSCP='"&SYSSCP"; /* 返回正在用的操作系统 */07 PUT 'SYSJOBID = '"&SYSJOBID"; /* 程序的操作执行代码 */08 PUT 'SYSERR='"&SYSERR"; /* 程序执行的错误码 */ 09 PUT 'SYSRC='"&SYSRC";/*程序执行的回复码 */ 10 PUT 'SYSLIBRC='"&SYSLIBRC"; /* 使用LIBNAME 时设置是否正确 */11 PUT 'SYSFILRC='"&SYSFILRC"; /*使用FILENAME 时设置是否正确*/12 RUN;使用宏语句 %put _automatic_; 可以查看所有的系统宏变量,结果显示在LOG窗口。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十八课SAS宏功能简介* SAS系统提供了强大的宏功能(macro facility),通过创建宏变量和宏能方便地完成:●重复分析任务,大大精减了程序量●从系统获取一些如SAS启动时间、日期、版本号等信息●有条件地执行数据步和过程步●保持程序的对立性和移植性,产生与数据无关的程序●用宏变量在不同数据步和过程步之间传递数据一.SAS宏变量宏变量(也称符号变量)属于SAS宏语言的范畴,和数据步中的变量概念是不一样的。
除了数据行外,可以在SAS程序的任何地方定义和使用宏变量。
数据步变量是和数据集相联系的,而宏变量是独立于数据集的。
数据集变量的值取决于正在处理的观测,而一个宏变量的值总是保持不变,直到被明确改变。
1宏变量的定义定义一个宏变量的最简单方法是使用宏语句%LET,它的一般形式如下:%LET宏变量名=值;宏变量的命名遵从一般的SAS命名规则。
宏变量的值不需要加引号,如果值加入引号,则引号被作为宏变量值的一部分。
宏变量的值可以是固定的字符串、其它宏变量的引用、宏函数和宏调用。
2宏变量的引用为了引用一个宏变量的值,在宏变量前加上一个符号&,格式如下:&宏变量名宏变量被引用的效果就是用宏变量的内容直接替代宏变量名。
3宏变量的使用举例例如,我们想要打印、图示和分析几个数据集,但又希望避免重复键入每一个数据集名字以修改相同的程序代码。
解决方法是用%LET语句创建一个宏变量DSNAME,该宏变量赋值了一个数据集名SURVEY。
然后这个宏变量在PROC PRINT等许多过程和TITLE语句中被引用。
程序如下:%Let dsname=survey ;Proc print data=&dsname ;Var name sex bdate income ;Title “Display of Data Set &dsname” ;Run ;要注意标题语句Title平时既可以用单引号又可以用双引号围住标题,但如果有宏变量引用,则必须用双引号,否则用单引号将当作字符串处理。
上面的程序中,我们只要修改宏变量dsname的赋值,就能对多个数据集执行相同的打印输出等操作。
可用几个%LET语句来创建多个宏变量进一步增强过程的通用性。
例如,我们可用WHERE语句来规定用作打印和分析的一个范围。
如用%LET语句把宏变量START和END 分别定义为开始和结束的日期。
程序如下:%Let dsname=survey ;%Let start=’01jan79’d ;%Let end= ‘31dec80’d ;Proc print data=&dsname ;Var name sex bdate income ;Where &start<bdate<&end ;Format bdate date7. ;Title “Display of Data Set &dsname” ;Run ;这样,通过适当的%LET语句来简单改变起始和结束日期,就能替代在WHERE语句中的多处改动。
提请大家注意宏变量赋值日期常数’01jan79’d的这种格式,也可以直接赋日期存储值,如改成%Let start=6940和%Let end=7670。
二.自动宏变量SAS的宏变量共有两种:一是用户定义的宏变量,如我们上面所定义宏变量dsname、start、end。
二是自动宏变量,由SAS系统定义。
自动宏变量是在系统启动时就已经被创建,在SAS系统退出前一直保持有效,能够在SAS 系统的任何地方被引用。
下表列出一些用户常用的自动宏变量:自动宏变量作用值SYSDATE 本次SAS启动的日期如04AUG97SYSDAY 本次SAS启动的星期如MondaySYSTIME 本次SAS启动的时间如11:18SYSLAST 最新创建的数据集名字如STUDY.SURVEYSYSDSN 最新创建的数据集两部分名字如STUDY SURVEYSYSVER 使用SAS软件的版本如6.12SYSSCP 返回用户主机系统的缩写如WIN例如,我们修改上面的程序,增加一个小标题,在小标题中引用自动宏变量,程序如下:%Let dsname=survey ;%Let start=’01jan79’d ;%Let end= ‘31dec80’d ;%Let analyst= Zuxin.Deng ;Proc print data=&dsname ;Var name sex bdate income ;Where &start<bdate<&end ;Format bdate date7. ;Title “Display of Data Set &dsname” ;Title2 “&systime &sysday , &sysdate by &analyst” ;Run ;三.创建一个宏宏是一个被存储的文本,用一个名字识别它。
最简单的宏就像一个宏变量一样工作,但复杂的宏可以包括分支和循环等结构,能实现许多宏变量不能实现的功能。
1宏的定义和调用宏定义的一般形式如下:%MACRO 宏名字(参数宏变量);宏实体;%MEND 宏名字;%MACRO语句是每一个宏的开始,同时必须给出这个宏的名字。
宏实体可为任一个文本,SAS语句或SAS步,宏变量、函数和这些实体的组合。
%MEND语句必须围住每个宏并表示宏结束。
参数宏变量是一些将要传递给宏调用的宏变量,不同参数宏变量之间用逗号隔开。
SAS程序中可以包括任意多个宏,且在程序中可以多次调用一个宏。
在SAS中引用宏调用的形式如下:%宏名字(参数值);例如,我们定义了一个简单通用的宏程序INVOKE,它有两个参数宏变量procname和dsname,用以传递给宏程序所需的过程名和数据集名。
在调用这个宏程序时要将具体的参数宏变量值给出,其值分别为Print和Study.Survey。
程序如下:%MACRO INVOKE(procname,dsname);Proc&procname Data=&dsnmae ;Title“&procname of Data Set &dsname” ;Run ;%MEND INVOKE ;%INVOKE(Print , Study.survey) ;上面这段程序在执行时,将被宏处理器替换成下面这段程序:Proc Print Data=Study.survey ;Title“Print of Data Set Study.survey” ;Run ;2具有分支和循环的宏与SAS系统DATA步和PROC步中可以使用分支和循环语句一样,也能在%MACRO 和%MEND语句间,用条件%IF—%THEN/%ELSE语句和用循环%DO —%END、%DO %UNTIL—%END、%DO %WHILE—%END语句来产生更复杂的宏。
虽然分支和循环的语句格式两者不相同,但两者的使用原理和方法却是相同的。
通常SAS宏程序比一般的SAS语言程序要更难理解,主要的难点是宏程序中宏变量的传递和控制。
例如,假设我们已有两个宏CREATE和PRINT,宏CREATE可以从参数宏变量SETDATA1指定的数据集中创建一个新的数据集STUDY.TEMP,宏PRINT可以打印一个参数宏变量SETDATA2指定的数据集。
现在我们要定义一个控制宏CONTROL,假定有时需要对指定的数据集先运行宏CREATE,创建一个新的数据集STUDY.TEMP后,再调用宏CREATE打印这个新产生的数据集;有时却只要直接打印指定的数据集。
那么,我们可以用一个%IF —%THEN语句来定义宏CONTROL。
程序如下:%Macro create(setname1) ;Data study.temp ;Set&setname1;If sex='M';%Let dsname=study.temp;Run ;%Mend create ;%Macro print(setname2) ;Proc print data=&setname2 ;Title"Display of Data Set &setname2 " ;Run ;%Mend print;%Macro control(getdata,dsname) ;%If %upcase(&getdata)=YES %Then %create(&dsname) ;%print(&dsname) ;%Mend control ;%control(no, study.survey) ;%control(yes,study.survey) ;当规定参数宏变量getdata的值为大写字符串YES或小写字符串yes时,%IF条件成立,宏处理器执行%THEN的分句,即调用宏%create(&dsname)。
宏函数%upcase的作用是转化小写文本为大写,因此当getdata的值为小写字符串yes时,%IF条件也成立。
在调用宏%create 时要给出参数宏变量setname1的值,使用宏变量&dsname中的值,其值为字符串study.survey。
当规定参数宏变量getdata的值为字符串YES或yes以外的任何值时,%IF条件不成立,执行调用宏%print(&dsname)。
提请注意的是,即使%IF条件成立,执行完%THEN分句后,也同样要执行调用宏%print(&dsname),但打印的数据集不同。
因此调用宏%print(setname2) 执行时,参数宏变量setname2中的值有两种可能:当%IF 条件成立,执行完宏%create后,再执行宏%print(setname2) 时,setname2中的值应该为study.temp;当%IF条件不成立,直接执行宏%print(setname2) 时,setname2中的值应该为study.survey。
正因为有如此要求,所以要在宏%create中增加一条%Let dsname=study.temp 语句,只要执行了宏%create就修改宏变量dsname的值为新建数据集名study.temp。
下面我们举一个宏循环语句的使用例子。
假定用户想生成一系列变量名字用于某个SAS 语句,如用在DATA、VAR和TITLE语句中。
可以定义一个宏names来产生具有相同前缀的一系列变量名字。
我们可采用重复%DO循环语句来实现。
程序如下:%MACRO names(varname,number);%Do n=1 %to &number ;&varname &n%Run;%MEND names ;Proc print data=study.class ;Var name%names(Test,3) ;Title“%names(Test,3) generated by macro variable”;Run ;在数据集STUDY.CLASS中,有一组相同前缀TEST不同1、2和3数字组成的字段变量名。