sas_180412_哈佛的SAS宏程序讲义
- 格式:pdf
- 大小:100.41 KB
- 文档页数:22
一、SAS介绍1.SAS软件是由SAS公司开发的集数据仓库、大规模数据处理、数据挖掘、统计分析、图表制作、网页连接等为一体的计算机软体系统。
SAS是专业的统计分析软件,它对表格数据进行操作和统计分析比用Matlab更方便更专业。
2.SAS, SPSS, EXCEL 区别都能用于处理数据和统计分析,高级程度:SAS > SPSS > EXCELEXCEL一一侧重表格(办公),只能处理一些简单的数据分析,公式丰富,一般多用于计算(统计分析结果不全面);SPSS——专业统计分析软件,界面菜单式操作,简单易学,缺点是通用性不好(处理同样的数据,也要重复点菜单);SAS一一更专业统计分析软件,代码编程实现(通用性好),大多用于金融、医药等领域,用于大企业的数据分析,缺点是较难学。
3.要学好SAS,也离不开《统计学》。
现在是大数据时代,数据挖掘、数据库维护、做数据分析,在第一时间内获得或者找到最有价值的信息和资源,成为正确决策的依据, 这对金融、保险、医药、政府等企业和部门都至关重要。
SAS学习者的就业方向有:金融,银行、保险,证券、投行、临床研究,医药开发,市场调查,政府监管和教育研究部门。
5.我适合学SAS吗?学习SAS需要懂高等数学和统计学吗?实际情况是,任何专业背景的人,都可以学习并掌握SAS, 一经学会,终生受用。
不少人听说SAS是个统计分析软件,就自认为需要懂得高深数学和统计学的人才能学习,其实这是一个误区。
SAS在创办起,其宗旨是着重于80%工作量的统计分析前的数据处理,至于统计分析一旦数据就绪,通过相应的分析模块,几乎象傻瓜相机一样,谁都可以操作运行。
如果需要的统计方法学上提高或突破,恐怕不是统计分析的日常工作,而是统计方法学的科研了。
可见学习SAS不需要具备高等数学和统计学基础,只是需要有一般逻辑思维训练基础即可。
所以,只要遵循正确的学习道路并且获得有效的指导,就可以掌握扎实的SAS编程技能和技巧,再经过一定的经验积累,您也可以成为SAS行家里手,一直有许多学中(西)医、MBA、计算机、信息管理、经济(金融)、机械自动化,甚至英语专业的朋友成功转行SAS的例子。
sas使用手册SAS(Statistical Analysis System)是一款广泛使用的统计分析软件,其使用手册对于使用者来说是不可或缺的指南。
以下是一个简短的SAS使用手册,以帮助您快速了解其基本功能和操作。
一、概述SAS是一个模块化、集成化的软件系统,主要用于数据管理、统计分析、预测建模和报告生成。
它支持多种编程语言,包括SAS语言、SAS宏语言和SAS SQL语言,使得用户可以根据自己的需求进行定制化操作。
二、安装与启动要使用SAS,您需要先将其安装到您的计算机上。
您可以从SAS官网下载适合您操作系统的安装程序,并按照屏幕提示进行安装。
安装完成后,您可以通过启动SAS Enterprise Guide或SAS Studio来使用SAS。
三、数据管理SAS提供了一系列数据管理工具,可以帮助您导入、清洗、合并和转换数据。
您可以使用DATA步来创建、修改和删除数据集,使用SQL语言进行更高级的数据查询和操作。
四、统计分析SAS提供了广泛的统计分析方法,包括描述性统计、方差分析、回归分析、聚类分析、主成分分析等。
您可以使用PROC步来调用相应的过程,并指定所需的参数和选项。
例如,要执行回归分析,您可以编写以下代码:PROC REG DATA=your_dataset; MODELdependent_variable = independent_variable / VIF; RUN;五、模型构建与预测SAS提供了多种预测模型,包括线性回归模型、逻辑回归模型、决策树模型、神经网络模型等。
您可以使用PROC步来构建和评估模型,例如:PROC SVM DATA=your_dataset; CLASS target_variable; MODEL dependent_variable = independent_variable; CROSSVALIDATE; RUN;六、报告生成SAS支持将分析结果导出为各种格式的报告,包括HTML、PDF、Word等。
第一章 SAS编程操作预备知识一、SAS系统简介SAS是一个庞大的系统,它目前的版本可以在多种操作系统中运行。
当前在国内被广泛使用的最新版本是8.2版,功能很强大,我深有体会。
据说9.0版已在国外面世,已经有一些有关它的抢先报道在网络上广为流传,说它如何如何美妙,令人不禁充满期待。
SAS8.2的完整版本包含以下数十个模块。
BASE,GRAPH,ETS,FSP,AF,OR,IML,SHARE,QC,STAT,INSIGHT,ANALYST,ASSIST, CONNECT,CPE,LAB,EIS,WAREHOUSE,PC File Formats,GIS,SPECTRAVIEW,SHARE*NET, R/3,OnlineTutor: SAS Programming,MDDB Server,IT Service Vision Client, IntrNet Compute Services,Enterprise Reporter,MDDB Server common products,Enterprise Miner,AppDev Studio,Integration Technologies 等。
所谓模块,我的理解是将功能相近的程序、代码等集中起来组成相对独立的部分,就称之为模块,类似于办公软件系统office中包含的word、excel、access 等。
各模块具有相对独立的功能范围,我们常用的模块有base,graph,stat,insight,assist,analyst模块等,分别执行基本数据处理、绘图、统计分析、数据探索、可视化数据处理等功能。
其余模块我用得很少,知道得也很少,所以也就不多说了。
SAS系统的长处,体现于它的编程操作功能的无比强大。
SAS一直以来也是注重于其编程语言的发展,对于可视化方式的菜单操作投入较少,其较早的版本仅有很少的菜单操作功能,使用起来也是非常的别扭。
这很可能就是在windows 人机交互式操作系统占统治地位的今天,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 教程
SAS(Statistical Analysis System)是一种统计分析系统,用于数据分析和应用的程序和工具的集合。
它具有强大的数据处理和分析功能,常被应用于各种数据处理和统计分析的领域。
SAS的语法结构相对严谨,下面介绍一些常用的SAS基础语法和操作:
1. 数据集的创建和导入
使用DATA语句创建SAS数据集,并使用SET、MERGE、UPDATE等语句导入和合并数据集。
2. 数据集的浏览和修改
使用PROC PRINT、PROC CONTENTS等语句来查看数据集的内容和属性,并使用DATA语句和相关函数对数据集进行修改。
3. 数据处理和转换
使用DATA和相关函数来进行数据处理和转换,如变量的重编码、缺失值处理、变量的计算和排序等。
4. 统计分析
使用PROC或DATA步骤中的相关统计函数进行数据分析,如频数分析、描述统计、方差分析、回归分析等。
5. 数据报告
使用PROC REPORT、PROC TABULATE等语句对数据进行
报告和汇总,生成PDF、Excel等报告格式。
6. 图表和可视化
使用PROC SGPLOT、PROC GCHART等语句进行图表和可视化的绘制,如直方图、散点图、饼图等。
7. 宏变量和宏语言
使用%LET语句定义宏变量,使用%MACRO和%MEND定义和调用宏语言,实现在SAS程序中的自动化和批量处理。
以上是SAS的一些基础语法和操作,通过学习和实践,可以进一步掌握SAS在数据分析和统计建模方面的应用。
SAS拥有庞大的社区和资源,可以通过官方文档、在线论坛和培训课程等途径获取更多的学习资料和支持。
在SAS(Statistical Analysis System)中,macro是一种非常重要的功能,可以帮助用户简化重复性的工作、提高代码的重用性、减少代码的维护成本,并且能够增加代码的灵活性和可读性。
在SAS中,我们可以将编写好的macro存储起来,并在需要的时候调用它们,这为SAS编程带来了极大的便利和效率提升。
在本篇文章中,我们将深入探讨SAS中macro的存储与调用的相关内容,以及它们在实际工作中的应用价值。
通过逐步介绍,你将对这一主题有个全面、深刻和灵活的理解。
1. 存储macro:在SAS中,我们可以将编写好的macro存储起来以备后用。
存储macro有两种常见的方式:一种是将macro存储在一个独立的文件中,然后在需要的时候通过%include语句引入;另一种方式是将macro直接存储在SAS数据集中。
将macro存储在独立文件中的好处是可以方便地进行版本管理和共享,而将macro存储在数据集中则可以更好地与数据进行整合和同步。
2. 调用macro:一旦macro被存储起来,我们就可以在需要的时候调用它们。
在SAS 中,我们可以使用%macro和%mend语句来定义一个macro,并在需要的时候使用%macro_name的方式进行调用。
通过调用存储的macro,我们可以大大减少重复编写相似代码的工作量,提高代码的重用性和可维护性。
3. 应用案例:在实际工作中,存储和调用macro能够极大地提高我们的工作效率。
在数据清洗和数据分析过程中,我们经常会遇到一些重复性的操作,比如计算变量、生成报表等。
通过编写和存储相应的macro,我们可以在需要的时候轻松调用它们,从而大大减少重复编写代码的时间,提高工作效率。
4. 个人观点:对于SAS中macro的存储与调用,我个人认为是一个非常实用的功能。
通过将常用的操作存储为macro,并在需要的时候进行调用,不仅能够提高工作效率,还能够减少错误和提高代码的可读性。
SAS编程技术教程SAS(Statistical Analysis System)是一种流行的数据分析工具和编程语言,广泛应用于统计学、商业和医学等领域。
SAS提供了许多强大的功能和技术,帮助用户进行数据处理、数据分析和报表生成等工作。
本教程将介绍一些常用的SAS编程技术,帮助读者快速掌握SAS的使用方法。
1.SAS语言基础SAS语言基础是学习SAS编程的基础。
了解SAS语言的语法和规则非常重要。
SAS语言的基本结构包括数据步(data step)和过程步(procedure step)。
数据步用于数据导入、转换和保存,过程步用于数据分析和报表生成。
学习SAS语言的关键是熟悉SAS语句的使用方法,如DATA语句、SET语句、IF语句等。
2.数据处理技术数据处理是SAS编程的一项核心任务。
SAS提供了丰富的数据处理功能,如数据导入、数据清洗、数据转换和数据合并等。
学习SAS的数据处理技术对于处理大量数据非常有用。
例如,使用INPUT语句将外部文件导入SAS数据集,使用FORMAT语句设置数据格式,使用RENAME语句修改变量名等。
3.数据分析技术数据分析是SAS编程的另一个重要任务。
SAS提供了许多数据分析技术,如描述性统计、回归分析、聚类分析和时间序列分析等。
学习SAS的数据分析技术对于理解数据和发现数据中的规律非常有用。
例如,使用PROCMEANS进行描述性统计分析,使用PROCREG进行线性回归分析,使用PROCCLUSTER进行聚类分析等。
4.报表生成技术报表生成是SAS编程的另一个重要任务。
SAS提供了强大的报表生成功能,可以生成各种类型的报表,如表格、图表和交互式报表等。
学习SAS的报表生成技术对于将分析结果呈现给他人非常有用。
例如,使用PROCREPORT生成表格报表,使用PROCGCHART生成图表报表,使用PROCTABULATE生成交互式报表等。
5.宏编程技术宏编程是SAS编程的高级技术。
SAS Macros WorkshopI.Why use SAS Macros?A SAS macro is way of defining parts of or collections of SAS statements which can be carried out repeatedly or which can substitute names of datasets or variables with symbolic names. SAS macro language also gives you the opportunity to insert programming steps inside a SAS code.SAS Macro Advantages:▪Reduce coding time▪Reduce programming errors by not having to edit so many lines of code ▪In some cases, it could be even more time efficient in executionSAS Macro Disadvantages:▪Harder to understand if multiple people work on it▪Harder to debug▪Some of the macro features (call symput) do not resolve in execution in the log file until the very end of a data step▪Not easily adaptableAll the usual programming elements: if-then-else statements, loops for I=1 to N do, and other similar operators can be used in SAS macros.II.Overview of elements of the macro languageThe three different main elements of the macro language are:▪macro variables;▪macro program statements;▪macro functions.III.Macro variablesMacro variables are tools that enable you to modify text in a SAS program through a symbolic substitution. It assigns a value (either string or integer) to a variable that you can invoke several times in a program after that.To define a macro variable you can use the %let statement.EXAMPLE 1:For example to assign the value 24 to the variable named sto, you do:%let sto=24;SYNTAX:%<Name of MACRO Variable> = Macro variable value;The variable sto will take this value every time it gets invoked until anothermacro variable statement changes it. This code can be placed anywhere in theprogram except within data lines.To invoke a macro variable place a & before its name. The macro processorresolves this reference to the variable by replacing &sto by the value of sto.%let sto=year;proc means data=&sto;So, for example,%let sto=1;Proc means data = temp&sto;Run;Will realy resolve toProc means data = temp1;Run;EXAMPLE 2:Macro variables that contain entire sections of a SAS program can also be created (with the use of the str macro function):%let sto2=%str(proc means data=year;var rainfall;run;);Will resolve to the proc means step running every time the sto2 macro variable is invoked.IV.Macro program statementsA macro program is a text identified by a name. These lines of codes can be invoked several times by using this name. So, in its most simple form, a macro program isequivalent to a macro variable. However, unlike a macro variable, a macro program can include more complex functionalities, such as if-then loops, etc.The next example is one of a simple macro that could also be defined by a macro variable:EXAMPLE 3 (Simple macro template)%macro example;proc means data=year;var rainfall;%mend example;The definition of a macro must begin by a %macro statement followed by thename of the macro. Here, our macro has been named example. The statementmust end by a %mend statement. When it is invoked, the macro processor willrun the lines of text between the %macro and %mend statements.To invoke a macro program, place a % sign before its name. The macroexample will be invoked in the following way:%example;This line of text can be included at any time in the program. For example:EXAMPLE 4:Proc plot data=year;plot rainfall*temperature;%example;Proc print data=year;The processor will execute the following lines:Proc plot data=year;plot rainfall*temperature;Proc means data=year;var rainfall;Proc print data=year;MACROS WITHIN MACROSMacro variables can be invoked inside a macro program. In fact, a macro program can even be invoked inside another macro program:EXAMPLE 5:%let var1=rainfall;%let var2=temperature;%macro design;proc plot data=result;plot &var1*&var2;%mend design;%macro compile;data result;set year;keep &var1 &var2;%design;%mend compile;If elsewhere in the program, compile is invoked by the statement %compile, theprocessor will replace these lines by:data result;set year;keep rainfall temperature;proc plot data=result;plot rainfall*temperature;MACRO WITH PARAMETERSThere is an easier solution than invoking macro variables inside the definition of a macro program: you can use parameters in the definition of your macro.This is perhaps the most widely used form of the macro features.For example, to redefine the macro design with parameters, type the followinglines:EXAMPLE 6:%macro design1(para1,para2);proc plot data=year;plot ¶1*¶2;%mend design1;To invoke it, we will type: %design1(rainfall,temperature);This gives the parameter para1 the value rainfall and para2 the valuetemperature (the processor assigns the values to the parameters in the orderentered). The result of this line of code will be equivalent to the %design usedpreviously, without having to define the macro variables var1 and var2. MACROS WITHIN DATA STEPS%DO StatementIf you want to perform procedures on a range of consecutive integer values for acertain variable or a set of variables, you can use a do loop. The followingexample introduces the use of do-loops with a macro.EXAMPLE 7:%macro year;%do i=75 %to 99;proc means data=year&i;var rainfall;%end;%mend year;A %do statement will always be terminated by a %end statement. The counter isthen referenced by a &i inside the macro.%IF %THEN %DO STATEMENTThis tool is used to insert conditional statements in a macro program. To illustrate this new tool, an extension of the previous example is used.Suppose that it is necessary to obtain the average rainfall for every year, but thatyou need graphs only for the years after 1990, then type the following macro:EXAMPLE 8:%macro analyze;%do i=75 %to 99;proc means data=year&i;var rainfall;%if i>=90 %then %do;proc plot data= year&i;plot rainfall*temperature;%end;%end;%mend analyze;%do %while and %do %until statements exist.LOOPS ON SERIES OF MACRO VARIABLESSuppose a series of macro variables m1, m2, m3…m25 has already been defined.If they represent the rainfall predictions produced by a model, it is interesting to compute the difference between the real value and the prediction. This can bedone using a loop on these macro variables:EXAMPLE 9:%do j=1 %to 25;data compare&j;set year&j;dif=rainfall-&&m&j;%end;You can see that this can be done by placing two & before the name of themacro variable.The processor resolves it in the following way:If for example j=3, it replaces first &&m&j by &m3, and then scans it again to replace &m3 by the value it has been previously assigned.V.Macro functionsMacro functions process macro expressions, called arguments, to produce a new expression. While DATA step functions are applied to values on a vector of variables, macro functions are used to create, modify, and work with text strings. Initially this may seem like a minor difference, but because macro functions deal with text, they can be used to build SAS code. This becomes the powerful advantage of the macro language. Macro functions can be divided into three categories:▪character functions;▪evaluation functions;▪quoting functions.MACRO CHARACTER FUNCTIONSThis type of macro function provides information about the string it takes asargument (see following example: the %length function). For a more extensivelist and more detailed information, see the ‘SAS Guide to Macro Processing’ (on the shelf in my cubicle).Some of the macro character functions that have analogous DATA step functions include:An important distinction between the use of macro functions and data stepequivalents is:▪DATA step functions work on character strings, numeric values, and DATA step variable values.▪Macro functions are applied to text strings that NEVER contain the values of DATA step variables.Several of these functions have two forms, with and without a Q at the start of the function name. Functions with names that start with Q (quoting) remove the meaning from special characters including the ampersand (&), percent sign (%), and mnemonic operators in returned values.%LENGTHThe %length function returns the length of the string it takes as an argument.In the following example the objective is to determine if the length of a variablename is smaller or longer than 8 characters (some softwares don’t accept variable names longer than 8, so it can be necessary to change the names before exporting the data set) and replace the variable by the same one but with a new name.EXAMPLE 10:%macro export (name,newname);%if %length(&name)>8 %then %do;data year;set year;&newname=&name;drop &name;%end;%mend limit;%INDEXSYNTAX%INDEX(argument1,argument2)The %INDEX function searches the first argument (ARGUMENT1) for the firstoccurrence of the text string which is contained in the second argument(ARGUMENT2). If the target string is found, the position of its first character isreturned as the function’s response (0 if not found).EXAMPLE 11This example stores three words in the macro variable &X. The %INDEXfunction is then used to search in &X for the string TALL and the result is then displayed using the %PUT statement.%LET X=LONG TALL SALLY;%LET Y=%INDEX(&X,TALL);%PUT TALL CAN BE FOUND AT POSITION &Y;Notice that the TALL as the second argument is not in quotes. The %PUTresults in the following text being written to the LOG:TALL CAN BE FOUND AT POSITION 6%LENGTHThe %LENGTH function determines the length (number of characters) of it’sargument. The number of detected characters is then returned. When the argument is a null string the value of 0 is returned.SYNTAX%LENGTH (argument)EXAMPLE 12In the macro %LOOK the name of the incoming data set is checked to see if itexceeds 8 characters.%MACRO LOOK(dsn,obs); %put &wscan &wqscan;%if %length(&dsn) gt 8 %then%put Name is too long - &dsn;%else %do;PROC CONTENTS DATA=&dsn;TITLE "DATA SET &dsn";RUN;PROC PRINT DATA=&dsn (OBS=&obs);TITLE2 "FIRST &obs OBSERVATIONS";RUN;%end;%MEND LOOK;The LOG shows that the following data set nameexceeds 8 characters:53 %look(demographics, 5)Name is too long - demographics%SCAN and %QSCANSYNTAX%SCAN(argument1,argument2[,delimiters])%QSCAN(argument1,argument2[,delimiters])The %SCAN and %QSCAN functions both search a text string (ARGUMENT1) for the n th word (ARGUMENT2) and returns its value. If ARGUMENT3 is nototherwise specified the same word delimiters are used as in the DATA stepSCAN function. For an ASCII system these include the following (for EBCDICthe ¬ is substituted for the ^):blank . < ( + | & ! $ * ) ; ^ - / , % > \%QSCAN removes the significance of all special characters in the returned value.EXAMPLE 13The macro variable &X below can be broken up using the %SCAN function.%LET X=XYZ.ABC/XYY;%LET WORD=%SCAN(&X,3);%LET PART=%SCAN(&X,1,Z);%PUT WORD IS &WORD AND PART IS &PART;The %PUT returns the following:WORD IS XYY AND PART IS XYNotice that the word delimiter (third argument) is not enclosed in quotes as itwould be in the DATA step SCAN function.The %QSCAN function is needed when you want to return a value that contains an ampersand or percent sign. This is demonstrated below:%let dsn = clinics;%let string =%nrstr(*&stuff*&dsn*&morestuff);%put &wscan &wqscan;The %PUT writes:clinics &dsnBoth functions return the value &DSN, but since the meaning of the & is notmasked by %SCAN, the &DSN in &WSCAN is resolved to clinics.EXAMPLE 14%macro a;aaaaaa%mend a;%macro b;bbbbbb%mend b;%macro c;cccccc%mend c;%let x=%nrstr(%a*%b*%c);%put X: &x;%put The third word in X, with SCAN: %scan(&x,3,*);%put The third word in X, with QSCAN: %qscan(&x,3,*);The %PUT statement writes this line:X: %a*%b*%cThe third word in X, with SCAN: ccccccThe third word in X, with QSCAN: %c%SUBSTR and %QSUBSTRLike the DATA step SUBSTR function these macro functions return a portion of the string in the first ARGUMENT. The substring starts at the POSITION in the second argument and optionally has a LENGTH of the third argument.SYNTAX%SUBSTR (argument,position[,length])%QSUBSTR (argument,position[,length])As is the case with most other macro functions, each of the three arguments can be a text string, macro variable, expression, or a macro call. If a value forLENGTH is not specified, a string containing the characters from POSITION to the end of the argument is produced.EXAMPLE 14%LET CLINIC=BETHESDA;%IF %SUBSTR(&CLINIC,5,4) = ESDA %THEN%PUT *** MATCH ***;%ELSE %PUT *** NOMATCH ***;The LOG would contain *** MATCH *** since &CLINIC has the value ESDA in characters 5 through 8.As is shown in the following example, the %QSUBSTR function allows you toreturn unresolved references to macros and macro variables.EXAMPLE 15%let dsn = clinics;%let string =%nrstr(*&stuff*&dsn*&morestuff);%let sub = %substr(&string,9,5);%let qsub = %qsubstr(&string,9,5);%put &sub &qsub;The %PUT will write clinics* &dsn* in the LOG.%UPCASEThe %UPCASE macro function converts all characters in the ARGUMENT toupper case. This function is especially useful when comparing text strings thatmay have inconsistent case.Syntax%UPCASE(argument)EXAMPLE 16The following code allows the user to differentially include a KEEP= option in the PROC PRINT statement.The %UPCASE function is used to control for variations in the text that issupplied by the user in the macro call.%macro printit(dsn);* use a KEEP for CLINICS;%if %upcase(&dsn)=CLINICS %then%let keep=(keep=lname fname ssn);%else %let keep=;proc print data=&dsn &keep;title "Listing of %upcase(&dsn)";run;%mend printit;%printit(cLinICs)The macro call to %PRINTIT produces the followingcode.proc print data=cLinICs (keep=lname fnamessn);title "Listing of CLINICS";run;MACRO EVALUATION FUNCTIONSThe macro evaluation functions evaluate arithmetic and logical expressions in the macro language. They only perform integer arithmetic.The evaluation functions are the▪%eval and▪%sysevalf%EVALIn the following example, we assume that a certain procedure produces an integer stored in the macro variable base (for example, a prediction of the number ofyears required for a specific analysis). If 3 is added to this integer, we couldobtain the year up to which proc means have to be run so as to remove thepossible estimation errors in the parameter base.EXAMPLE 17:%macro add(base);%let result=%eval(&base+3);%do i=75 %to &result;proc means data=year&i;var rainfall;%end;%mend add;We see that once the macro expression is evaluated, the result can be stored inanother macro and you can use it immediately.Logical expression can also be evaluated:EXAMPLE 18:%macro biggest(a,b);%let logic=%eval(&a>&b);%mend biggest;%SYSEVALFYou can use this function to perform non-integer arithmetic and the function will even return a non-integer result from an arithmetic operation.SYNTAX%SYSEVALF(expression[,conversion-type])The EXPRESSION is any arithmetic or logical expression which is to beevaluated and it may contain macro references.The second argument, CONVERSION-TYPE, is an optional conversion to apply to the value returned by %SYSEVALF. Since this function can return non-integer values, problems could occur in other macro statements that use this function but expect integers.When you need the result of this function to be an integer, use one of theCONVERSION-TYPEs. A specification of the CONVERSION-TYPE converts a value returned by %SYSEVALF to an integer or Boolean value so it can be used in other expressions that require a value of that type. CONVERSION-TYPE canbe:▪BOOLEAN 0 if the result of the expression is 0 or missing, 1 if the result is any other value.▪CEIL round to next largest whole integer▪FLOOR round to next smallest whole integer▪INTEGER truncate decimal fractionThe CEIL, FLOOR, and INTEGER conversion types act on the expression in the same way as the DATA step functions of the same (or similar) names i.e. CEIL,FLOOR, and INT.EXAMPLE 19The following table shows a few calls to %SYSEVALF and the resulting values:MACRO QUOTING FUNCTIONSQuoting functions allow the user to pass macro arguments while selectivelyremoving the special meaning from characters such as &, %, ;, ‘, and “. Most ofthese functions are not commonly used and are even less commonly understood.Although they are powerful and can even be necessary, programming solutionsare usually available that do not require the use of the quoting functions.All quoting functions are not alike. Consult the documentation to get the gorydetails, however the following three functions should solve most of your quotingproblems.%STRThe most commonly used macro quoting function is %STR. Often it is used along with the %LET statement to mask semicolons that would otherwise terminate the %LET.In the following example we want to create a macro variable &P that contains two SAS statements;%LET P=PROC PRINT DATA=DSN; RUN;Because the semicolon following DSN terminates the %LET statement, the macro variable &P contains PROC PRINT DATA=DSN which will almost certainlyresult in a syntax error due to the missing semicolon.The %STR function masks the semicolon by quoting it.%LET P=%STR(PROC PRINT DATA=DSN; RUN;);This results in the macro variable &P being correctly assigned the two statements.PROC PRINT DATA=DSN; RUN;%BQUOTEThe %BQUOTE function is probably the best choice as an overall quotingfunction. It eliminates many of the limitations of the %STR function, and it willalso remove the meaning from unmatched symbols that are normally found inpairs such as quotes and parentheses. The following %LET will cause all sorts of problems because the apostrophe will be interpreted as an unmatched quote.Example 20:%let a = Sue's new truck;The %STR function will not help because %STR does not mask quote marks,however %BQUOTE does.%let a = %bquote(Sue's new truck);%put &a;This will correctly resolve to assigning “Sue’s new truck” to the macro variablea.%UNQUOTEOnce a quoting function has been used, the text remains quoted. Since these"quotes" are hard to see, even in the LOG, this can cause problems for theprogrammer that does not anticipate that quoting functions may have been used.If you need to remove or change the effects of any of the other quotingfunctions, the %UNQUOTE is used.Three macro variables are defined below, but the second, &OTH, is defined using the %NRSTR function.This means that &CITY can not be resolved when &OTH is resolved. When the%UNQUOTE function is applied to &OTH its value (&CITY) is seen as a macro variable which is also resolved.Example 21:%let city = miami;%let oth = %nrstr(&city);%let unq = %unquote(&oth);%put &city &oth &unq;The LOG shows:miami &city miamiAlthough &OTH looks like any other macro variable in the %PUT statement, itwill not be fully resolved because it is quoted, thus preventing &CITY from being resolved.ING DATA STEP FUNCTIONS IN THE MACRO LANGUAGETwo macro tools allow the user to execute virtually all of the functions androutines available in the DATA step as part of the macro language. The%SYSCALL macro statement calls DATA step routines and the %SYSFUNCmacro function executes DATA step functions.SYNTAX%SYSFUNC(function-name(functionarguments)[,format])%QSYSFUNC(function-name(functionarguments)[,format])EXAMPLE 22The following example shows three ways to add the current date to a TITLE.The automatic macro variable &SYSDATE is easy to use but cannot beformatted.Prior to Release 6.12 most users created a DATA _NULL_ step with anassignment statement and a CALL SYMPUT to create a formatted macrovariable. The DATA step can now be avoided by using the %SYSFUNC macro function.data _null_;today = put(date(),worddate18.);call symput('dtnull',today);run;title1 "Automatic Macro Variable SYSDATE&sysdate";title2 "From a DATA _NULL_ &dtnull";title3 "Using SYSFUNC%sysfunc(date(),worddate18.)";The following three titles are produced:Automatic Macro Variable SYSDATE 10APR00From a DATA _NULL_ April 10, 2000Using SYSFUNC April 10, 2000The leading spaces before the date in the second two titles is caused by the date string being right justified. The LEFT and TRIM functions can be used to remove the space, however care must be exercised or a couple of problems can beencountered.The first is that function calls cannot be nested within a %SYSFUNC. Fortunately this is rather easily handled because %SYSFUNC requests can be nested.Secondly the resolved values of interior calls to %SYSFUNC are used asarguments to the outer calls. When the resolved value contains special characters (especially commas), they can be misinterpreted. The following revised TITLE3 will not work because the interior %SYSFUNC uses a formatted value whichcontains a comma.EXAMPLE 23:title3 "Using SYSFUNC%sysfunc(left(%sysfunc(date(),worddate18.)))";After the inner %SYSFUNC is executed the result is:title3 "Using SYSFUNC %sysfunc(left(April 10, 2000))";Because of the comma, the LEFT function will see two arguments (it isexpecting exactly one), and the message 'too many arguments' is generated.The %QSYSFUNC function can be used to mask special characters in the text string that is passed to the next function. Rewriting the TITLE statement using %QSYSFUNC as is shown below eliminates the problem with the comma.title3 "Using SYSFUNC%sysfunc(left(%qsysfunc(date(),worddate18.)))";TITLE3 from above becomes:Using SYSFUNC April 10, 2000VII.AUTOCALL MACROS THAT MIMIC FUNCTIONS The AUTOCALL facility allows the user to call macros that have been definedoutside of the execution of the current program. A number of these macros areprovided with the base macro language and are described in the Macro Language Elements section of the SAS® Macro Language: Reference, First Editionreference manual. Although these are, strictly speaking, macros, they act likefunctions.Commonly used Autocall macros include:%CMPRES%LEFT%LOWCASE%TRIM%VERIFY%LEFTThis macro can be used to left justify a macro argument.In the earlier example for %QSYSFUNC the DATA stepLEFT function was used, this title can be furthersimplified by using %LEFT.EXAMPLE 25:title3 "Using SYSFUNC%left(%qsysfunc(date(),worddate18.))";%VERIFYWhile %INDEX and its variations search for specific strings, %VERIFYdetermines the position of the first character that is NOT in a text string.The following example subsets a string starting at the first character that is not a number.EXAMPLE 26:%let code = 2000SUGI25;%let part =%substr(&code,%verify(&code,1234567890));&PART will contain:SUGI25%CMPRESThe %CMPRES macro removes multiple blanks (as well as leading andtrailing blanks) from a text string. This macro is similar to the COMPBLDATA step function. In the following example a numeric value is placedinto a macro variable using the SYMPUT routine. In the conversionprocess a series of leading blanks are added to &FIVE.EXAMPLE 27:data _null_;x=5;call symput('five',x);run;%put *&five*;%let five = *%cmpres(&five)*;%put &five;The resulting LOG shows:138139 %put *&five*;* 5*140 %let five = *%cmpres(&five)*;141 %put &five;*5*VIII.FROM DATA STEPS TO A MACRO VARIABLE: CALL SYMPUTCALL SYMPUT is a SAS language routine that assigns a value produced in a DATA step to a macro variable. It is one of the DATA step interface tools that provides a dynamic link for communication between the SAS language and the macro facility.SyntaxCALL SYMPUT(argument-1,argument-2);argument-1: specifies a character expression that identifies the macrovariable that is assigned a value. If the macro variable does not exist,the routine creates it.argument-2: specifies a character expression that contains the valuethat is assigned.Call symput takes a value from a data step and assigns it to a macro variable.You can then use this macro variable in later steps.EXAMPLE 28:If AGE >=21 THEN CALL SYMPUT (“status”, “adult”);Else call symput (“status”, “minor”);These statements create a macro variable named &status and assign it a value of either Adult or Minor depending on the variable age.EXAMPLE 29:When performing logistic regression, we often need to create dummyvariables based on all possible values of another variable. For instance,we want to create dummy variables for the variable CON which has over400 different integer values from 1 to 506. Basically we need to do thefollowing:IF CON = 1 THEN CON1 = 1; ELSE CON1 = 0;IF CON = 2 THEN CON2 = 1; ELSE CON2 = 0;. . . . . .IF CON = 506 THEN CON506 = 1; ELSE CON506 = 0;It is not practical to write this many statements. Our goal is to use the SYMPUT routine to obtain this code automatically.In the following program, a sample data set TESTDATA with 12 observations and 1 variable is first created in step (1). Then in step (2), a data set UNIQUE is created containing 8 unique CON values. In step (3), the SYMPUT routine assigns the largest value of CON to the macro variable N. CALL SYMPUT is executed once when the DATA step reaches the end of the data set. In step (4), the macro variable N’s value is retrieved and CALL SYMPUT is executed 506 times to create 506 macro variables M1-M506 with the initial value 0. The PUT function is used to eliminate a note that numeric values have been converted to character values. The LEFT function is used to left-align the value of the index variable, I, to avoid creating macro variable names with blanks. In step (5), CALL SYMPUT is executed 8 times and the values of the 8 macro variables created in step (4) are updated with the values of the corresponding CON. The 498 macro variables without the corresponding CON values will remain the initial value 0. Step (6) is a macro that generates all dummy variables for all possible values of CON. By using the %GOTO statement and statement label, the dummy variables without the corresponding CON values will not be created. Note that the double ampersand is necessary to cause the macro processor to scan the text twice first to generate the reference and then to resolve it. Step (7) invokes the macro GETCON to create the dummy variables for every observation in the data set TESTDATA. The last step prints the output data set with dummy variables shown in Table 1./* (1) Create a sample data set TESTDATA. */DATA TESTDATA;INPUT CON;CARDS;1734115714873450657743。