SAS是一款统计分析软件 。它于1960年由SAS软件研究所创建。从1960年1月1日,SAS用于数据管理,商业智能,预测分析,描述性和规范性分析等。从那时起,许多新的统计程序和组件在软件中进行了介绍。
通过引入JMP(跳转)的统计SAS利用了这是由Macintosh推出的图形用户界面的优势。跳转基本上是用于像六西格玛,设计,质量控制,工程和科学分析的应用程序。
SAS是跨平台的,这意味着你可以在任何操作系统Linux或Windows上运行SAS。 SAS是SAS程序员使用了SAS数据集的操作的若干序列进行的数据分析报告。
多年来,SAS公司增加了大量的解决方案和产品组合。它拥有数据治理,数据质量,大数据分析,文本挖掘,欺诈管理,健康科学等解决方案,我们可以放心地假设情景运用SAS解决方案服务每一个业务领域。
如果有需要,您可以访问SAS组件产品清单。
主要运用于大型数据集。随着SAS软件的帮助下,你可以对类似数据的各种操作:
SAS拥有200多个组件。
SN | SAS组件和它们的用法 |
---|---|
1 | SAS基地 这是一个核心组成部分,其中包含的数据管理设施和编程语言进行数据分析。它也是最广泛使用的。 |
2 | SAS / GRAPH 创建图表,演示更好地了解和展示结果以适当的格式。 |
3 | SAS / STAT 与方差分析,回归,多变量分析,生存分析和心理分析,混合模型分析进行统计分析。 |
4 | SAS / OR 行动调查。 |
五 | SAS / ETS 计量经济学和时间序列分析。 |
6 | SAS / IML CInteractive矩阵语言。 |
7 | SAS / AF 应用设施。 |
8 | SAS / QC 质量控制。 |
9 | SAS / INSIGHT 数据挖掘。 |
10 | SAS / PH 临床试验分析。 |
11 | SAS / Enterprise Miner中 数据挖掘。 |
通常组织及培训机构使用Window SAS。一些组织使用Linux,但没有图形用户界面,所以你必须为每个查询编写代码。但在Window SAS也有很多可用的实用工具,它可以对程序员起到非常多的帮助,这也减少了编写代码以及时间。
Window SAS由5个部分组成。
SN | Windows SAS和它们的用法 |
---|---|
1 | 日志窗口 日志窗口就像是一个执行窗口,我们可以检查SAS程序的执行。在这个窗口中,我们可以检查错误也。运行该程序后,检查每次日志窗口是非常重要的。这样我们就可以了解程序执行结果是否正确。 |
2 | 编辑器窗口 编辑器窗口是SAS的一部分,我们写的所有代码。它像一个记事本。 。 |
3 | 输出窗口 输出窗口是结果窗口,在这里我们可以看到我们的节目的输出。 |
4 | 结果窗口 它像一个索引到所有输出。我们在SAS的一次会议已经运行的所有程序都列在那里,你可以通过点击输出结果打开输出。但是,这些都在SAS的一次会议只提到。如果我们关闭软件,然后打开它,然后在结果窗口将是空的。 |
五 | 浏览窗口 这里列出的所有库。您还可以浏览您的系统SAS从这里支持的文件。 |
SAS存储于库中。你可以创建一个库并将所有类似的计划保存在库中的。 SAS为您提供的设施,以创建多个库。 SAS逻辑库只有8个字符。
SAS有两种类型的库:
SN | Windows SAS和它们的用法 |
---|---|
1 | 临时库 这是SAS的默认库。所有这一切,如果我们创建的程序不选择其他库将默认存储于临时库。您可以检查在浏览窗口这部作品库。如果您创建一个SAS程序和任何永久性的图书馆,如果你在关闭或者重启SAS前没有将该程序存储于一个永久库,程序将会丢失。因为程序只能在库中被运行。 |
2 | 永久库 这是SAS的永久库。我们可以通过使用SAS实用程序或通过在编辑器窗口编写代码创建一个新的SAS库。这些库被命名为永久性的,如果我们创建一个SAS永久库,存储在库中的程序将可以被永久的使用。 |
将SAS编程首先需要创建/读取数据集到存储器,然后做该数据的分析。我们需要了解在其中一个程序被写入实现这一目标的流程。
下图显示了按给定顺序写入以创建SAS程序的步骤。
每个SAS程序必须具有所有这些步骤才能完成读取输入数据,分析数据和给出分析输出。 此外,每个步骤结束时的RUN语句都需要完成该步骤的执行。
此步骤涉及将所需数据集加载到SAS存储器中并识别数据集的变量(也称为列)。 它还捕获记录(也称为观察或主体)。 DATA语句的语法如下。
DATA data_set_name; #Name the data set.INPUT var1,var2,var3; #Define the variables in this data set.NEW_VAR; #Create new variables.LABEL; #Assign labels to variables.DATALINES; #Enter the data.RUN;
以下示例显示了命名数据集,定义变量,创建新变量和输入数据的简单情况。 这里字符串变量在结尾有一个$,数字值没有它。
DATA TEMP;INPUT ID $ NAME $ SALARY DEPARTMENT $;comm = SALARY*0.25;LABEL ID = 'Employee ID' comm = 'COMMISION';DATALINES;1 Rick 623.3 IT2 Dan 515.2 Operations3 Michelle 611 IT4 Ryan 729 HR5 Gary 843.25 Finance6 Nina 578 IT7 Simon 632.8 Operations8 Guru 722.5 Finance;RUN;
该步骤包括调用的SAS内置程序来分析数据。
PROC procedure_name options; #The name of the proc.RUN;
以下示例显示使用MEANS过程打印数据集中数值变量的平均值。
PROC MEANS;RUN;
可以使用条件输出语句显示数据集中的数据。
PROC PRINT DATA = data_set;OPTIONS;RUN;
下面的示例显示在输出中使用where子句从数据集中只产生少数记录。
PROC PRINT DATA=TEMP;WHERE SALARY > 700;RUN;
下面是每个上述步骤的完整代码。
像任何其他编程语言中,SAS语言都有其自己的语法规则来创建SAS程序。任何SAS方案的三个组成部分 - 声明,变量和和数据集遵循以下语法规则。
SAS中的变量表示SAS数据集中的一列。 变量名遵循以下规则。
# Valid Variable NamesREVENUE_YEARMaxVal_Length# Invalid variable NamesMiles Per Liter #contains Space.RainfFall% # contains special character other than underscore.90_high # Starts with a number.
DATA语句标记创建新的SAS数据集。 创建DATA集的规则如下。
# Temporary data sets.DATA TempData;DATA abc;DATA newdat;# Permanent data sets.DATA LIBRARY1.DATA1DATA MYLIB.newdat;
SAS程序,数据文件和程序的结果在Windows中以各种扩展名保存。
SAS代码中的注释以两种方式指定。 以下是这两种格式。
*消息形式的注释; 不能在其中包含分号或不匹配的引号。 此外,不应该有任何参考任何宏语句在这样的注释。 它可以跨越多行并且可以是任何长度..以下是单行注释示例:
* This is comment ;
以下是一个多行注释的例子:
* This is first line of the comment* This is second line of the comment;
/ * message * /形式的注释更频繁地使用,并且不能嵌套。 但它可以跨越多个线并且可以是任何长度。 以下是单行评论示例:
/* This is comment */
以下是一个多行注释的例子:
/* This is first line of the comment* This is second line of the comment */
SAS程序可用于分析的数据称为SAS数据集。 它是使用DATA步骤创建的。 SAS可以读取各种文件作为其数据源,如CSV,Excel,Access,SPSS和原始数据。 它还有许多内置的数据源可供使用。 如果SAS程序使用数据集,则数据集称为临时数据集,然后在会话运行后丢弃。 但是如果它永久存储以备将来使用,那么它被称为永久数据集。 所有永久数据集都存储在特定库下。 SAS数据集以行和列的形式存储,也称为SAS数据表。 下面我们看到内置的永久数据集的示例,以及外部源的红色。
这些数据集已在已安装的SAS软件中提供。 它们可以被探索并用于形成用于数据分析的样本表达式。 要探索这些数据集,请转到库 - >我的库 - > SASHELP。 在展开时,我们可以看到所有内置数据集的名称列表。
让我们向下滚动以找到名为CARS的数据集。 双击此数据集将在右侧窗格中打开它,我们可以进一步探索它。 我们也可以通过使用右窗格下的最大化视图按钮来最小化左窗格。
我们可以使用底部的滚动条向右滚动,以浏览表中的所有列及其值。
我们可以使用SAS Studio中提供的导入功能将我们自己的文件导出为数据集。 但是这些文件必须在SAS服务器文件夹中可用。 因此,我们必须使用服务器文件和文件夹下的上传选项将源数据文件上传到SAS文件夹。
接下来,我们通过导入它在SAS程序中使用上述文件。 为此,我们使用选项Tasks - > Utilities - > Import data,如下所示。 双击导入数据按钮,打开右侧的窗口,选择数据集的文件。
下一步单击右窗格中导入数据程序下的选择文件按钮。 以下是可以导入的文件类型的列表。
我们选择存储在本地系统中的“employee.txt”文件,并获取导入的文件,如下所示。
我们可以通过运行使用“运行”选项生成的默认导入代码来查看导入的数据
我们可以使用与上述相同的方法导入任何其他文件类型,并在各种SAS程序中使用它。
一般来说,SAS中的变量表示它正在分析的数据表的列名。 但它也可以用于其他目的,如在编程循环中将其用作计数器。 在本章中,我们将看到使用SAS变量作为SAS数据集的列名。
SAS有如下三种变量类型:
这是默认变量类型。 这些变量用于数学表达式。
INPUT VAR1 VAR2 VAR3; #Define numeric variables in the data set.
在上面的语法中,INPUT语句显示数字变量的声明。
INPUT ID SALARY COMM_PERCENT;
字符变量用于不在数学表达式中使用的值。 它们被视为文本或字符串。 变量通过在变量名称的末尾添加一个带有空格的$ sing来变为字符变量。
INPUT VAR1 $ VAR2 $ VAR3 $; #Define character variables in the data set.
在上面的语法中,INPUT语句显示字符变量的声明。
INPUT FNAME $ LNAME $ ADDRESS $;
这些变量仅作为日期处理,它们需要采用有效的日期格式。 变量通过添加在变量名称末尾带有空格的日期格式变为日期变量。
INPUT VAR1 DATE11. VAR2 MMDDYY10. ; #Define date variables in the data set.
在上面的语法中,INPUT语句显示日期变量的声明。
INPUT DOB DATE11. START_DATE MMDDYY10. ;
上述变量用于SAS程序,如下面的示例所示。
以下代码显示了如何在SAS程序中声明和使用三种类型的变量
DATA TEMP;INPUT ID NAME $ SALARY DEPT $ DOJ DATE9. ;FORMAT DOJ DATE9. ;DATALINES;1 Rick 623.3 IT 02APR20012 Dan 515.2 OPS 11JUL20123 Michelle 611 IT 21OCT20004 Ryan 729 HR 30JUL20125 Gary 843.25 FIN 06AUG20006 Tusar 578 IT 01MAR20097 Pranab 632.8 OPS 16AUG19988 Rasmi 722.5 FIN 13SEP2014;PROC PRINT DATA=TEMP;RUN;
在上面的例子中,所有的字符变量都声明后跟一个$符号,日期变量声明后跟日期格式。 上述程序的输出如下。
这些变量在分析数据时非常有用。 它们用于应用统计分析的表达式中。 让我们看一个分析名为CARS的内置数据集的示例,它位于Libraries - > My Libraries - > SASHELP下。 双击它来探索变量及其数据类型。
接下来,我们可以使用SAS studio中的任务选项生成其中一些变量的汇总统计。 转到任务 - >统计 - >摘要统计,并双击它打开窗口如下所示。 选择数据集SASHELP.CARS并选择分析变量下的三个变量 - MPG_CITY,MPG_Highway和Weight。 按住Ctrl键,同时单击选择变量。 单击运行。
在上述步骤后单击结果选项卡。 它显示了所选择的三个变量的统计摘要。 最后一列表示在分析中使用的观察(记录)的数量。
SAS中的字符串是用一对单引号括起来的值。 还通过在变量声明的末尾添加一个空格和$ sign来声明字符串变量。 SAS具有许多强大的功能来分析和操作字符串。
我们可以声明字符串变量及其值,如下所示。 在下面的代码中,我们声明长度为6和5的两个字符变量。LENGTH关键字用于声明变量而不创建多个观察。
data string_examples; LENGTH string1 $ 6 String2 $ 5; /*String variables of length 6 and 5 */ String1 = 'Hello'; String2 = 'World'; Joined_strings = String1 ||String2 ; run;proc print data = string_examples noobs;run;
运行上面的代码,我们得到显示变量名称及其值的输出。
以下是经常使用的一些SAS函数的示例。
此函数使用开始和结束位置提取子字符串。 如果没有提到结束位置,它提取所有字符直到字符串结束。
SUBSTRN('stringval',p1,p2)
以下是所使用的参数的描述:
data string_examples; LENGTH string1 $ 6 ; String1 = 'Hello'; sub_string1 = substrn(String1,2,4) ; /*Extract from position 2 to 4 */ sub_string2 = substrn(String1,3) ; /*Extract from position 3 onwards */run;proc print data = string_examples noobs;run;
在运行上面的代码,我们得到显示substrn函数的结果的输出。
此函数从字符串中删除尾部空格。
TRIMN('stringval')
以下是所使用的参数的描述:
data string_examples; LENGTH string1 $ 7 ; String1='Hello '; length_string1 = lengthc(String1); length_trimmed_string = lengthc(TRIMN(String1));run;proc print data = string_examples noobs;run;
运行上面的代码,我们得到显示TRIMN函数结果的输出。
SAS中的数组用于使用索引值存储和检索一系列值。 索引表示保留存储区中的位置。
在SAS中,使用以下语法声明数组:
ARRAY ARRAY-NAME(SUBSCRIPT) ($) VARIABLE-LIST ARRAY-VALUES
在上面的语法中:
数组可以使用上述语法以多种方式声明。 下面是示例。
# Declare an array of length 5 named AGE with values.ARRAY AGE[5] (12 18 5 62 44);# Declare an array of length 8 named COUNTRIES with values starting at index 0.ARRAY COUNTRIES(0:8) A B C D E F G H I;# Declare an array of length 5 named QUESTS which contain character values.ARRAY QUESTS(1:5) $ Q1-Q5;# Declare an array of required length as per the number of values supplied.ARRAY ANSWER(*) A1-A100;
存储在数组中的值可以通过使用如下所示的打印过程访问。 在使用上述方法之一声明之后,使用DATALINES语句提供数据。
DATA array_example;INPUT a1 $ a2 $ a3 $ a4 $ a5 $;ARRAY colours(5) $ a1-a5;mix = a1||'+'||a2;DATALINES;yello pink orange green blue;RUN;PROC PRINT DATA=array_example;RUN;
当我们执行上面的代码,它会产生以下结果:
当分析数组形式的数组以对数组的整个行执行计算时,使用OF运算符。 在下面的示例中,我们应用每行中的值的和和均值。
DATA array_example_OF; INPUT A1 A2 A3 A4; ARRAY A(4) A1-A4; A_SUM=SUM(OF A(*)); A_MEAN=MEAN(OF A(*)); A_MIN=MIN(OF A(*)); DATALINES; 21 4 52 11 96 25 42 6 ; RUN; PROC PRINT DATA=array_example_OF; RUN;
当我们执行上面的代码,它会产生以下结果:
也可以使用IN运算符访问数组中的值,该运算符检查数组行中是否存在值。 在下面的例子中,我们检查数据中颜色“黄色”的可用性。 此值区分大小写。
DATA array_in_example; INPUT A1 $ A2 $ A3 $ A4 $; ARRAY COLOURS(4) A1-A4; IF 'yellow' IN COLOURS THEN available='Yes';ELSE available='No'; DATALINES; Orange pink violet yellow ; RUN; PROC PRINT DATA=array_in_example; RUN;
当我们执行上面的代码,它会产生以下结果:
SAS可以处理各种数字数据格式。 它在变量名的末尾使用这些格式,以向数据应用特定的数字格式。 SAS使用两种数字格式。 一个用于读取数字数据的特定格式,称为informat,另一个用于显示称为输出格式的特定格式的数字数据。
数字信息的语法是:
Varname Formatnamew.d
以下是使用的参数的描述:
下面是用于将数据读入SAS的格式列表。
格式 | 使用 |
---|---|
n. | 最大“n”个没有小数点的列数。 |
n.p | 最多“n”个带“p”小数点的列数。 |
COMMAn.p | COMMAn.p最大“n”个具有“p”小数位的列,删除任何逗号或美元符号。 |
类似于在读取数据时应用格式,以下是用于在SAS程序的输出中显示数据的格式的列表。
n. | 写入最大“n”位数,不带小数点。 |
n.p | 写入最大“n.p”个带“p”小数点的列数。 |
DOLLARn.p | 使用p个小数位数写入最大“n”列,前面带有美元符号,在第千个位置使用逗号。 |
请注意:
下面的例子说明了上述情况。
DATA MYDATA1;input x 6.; /*数据的最大宽度*/format x 6.3;datalines;872293.2.112215.116PROC PRINT DATA = MYDATA1;RUN;DATA MYDATA2;input x 6.; /*数据的最大宽度*/format x 5.2;datalines;872293.2.112215.116PROC PRINT DATA=MYDATA2;RUN;DATA MYDATA3;input x 6.; /*数据的最大宽度*/format x DOLLAR10.2;datalines;872293.2.112215.116PROC PRINT DATA=MYDATA3;RUN;
当我们执行上面的代码,它会产生以下结果:
# MYDATA1.Obs x1 8722.0 # 显示6个十进制后附加零的列。2 93.200 # 显示6个小数后附加零的列。3 0.112 # 十进制之前没有整数,因此在十进制后显示3个可用数字。4 15.116 # 显示6个十进制后有3位可用数字的列。# MYDATA2Obs x1 8722 # 显示5列。 只有4个可用。2 93.20 # 显示5个十进制后附加零的列。3 0.11 # 显示5个小数点后2位的列。4 15.12 # 显示5个小数点后2位的列。# MYDATA3Obs x1 $8,722.00 # 显示10列带有$符号,逗号在第千个位置,零在十进制后附加。2 $93.20 # 只有两个整数在十进制之前可用,一个可用在十进制之后。3 $0.11 # 十进制之前没有整数,十进制后有两个可用。4 $15.12 # 只有两个整数在十进制之前可用,两个可用在十进制之后。
SAS中的运算符是在数学,逻辑或比较表达式中使用的符号。 这些符号内置到SAS语言中,并且许多运算符可以组合在单个表达式中以给出最终输出。
以下是SAS运算符类别的列表。
我们逐一观察。 运算符总是与作为由SAS程序分析的数据的一部分的变量一起使用。
下表介绍了算术运算符的详细信息。 让我们假设V1和V2的值分别为8和4。
操作者 | 描述 | 例 |
---|---|---|
+ | 加成 | V1 + V2 = 12 |
- | 减法 | V1-V2 = 4 |
* | 乘法 | V1 *V2 =32 |
/ | 除 | V1 / V2 = 2 |
** | 幂 | V1 **V2 = 4096 |
DATA MYDATA1;input @1 COL1 4.2 @7 COL2 3.1; Add_result = COL1+COL2;Sub_result = COL1-COL2;Mult_result = COL1*COL2;Div_result = COL1/COL2;Expo_result = COL1**COL2;datalines;11.21 5.33.11 11;PROC PRINT DATA=MYDATA1;RUN;
在运行上面的代码,我们可以得到下面的输出。
下表描述了逻辑运算符的详细信息。 这些运算符可以计算表达式的真值。 因此,逻辑运算符的结果总是1或0.我们假设两个数据变量V1和V2的值分别为8和4。
操作者 | 描述 | 例 |
---|---|---|
& | AND运算符。 如果两个数据值都为真,则结果为1,否则为0。 | (V1< 2 & V2> 3)的真值为0 (V1< 2 & V2< 3)的真值为0 (V1> 2 & V2< 3)的真值为0 (V1 > 2 & V2> 3)的真值为1 |
| | OR运算符。 如果任何一个数据值求值为真,则结果为1,否则为0。 | (V1> 9 | V2> 3)的真值为1 (V1> 9 | V2< 3)的真值为0 (V1< 9 | V2> 3)的真值为1 (V1< 9 | V2< 3)的真值为1 |
〜 | NOT运算符。 NOT运算符以值为FALSE或缺少值的表达式形式的结果为1,否则为0。 | (V1> 3)的真值为1。 ~(V1> 3)的真值为0。 |
DATA MYDATA1;input @1 COL1 5.2 @7 COL2 4.1; and_=(COL1 > 10 & COL2 > 5 );or_ = (COL1 > 12 | COL2 > 15 );not_ = ~( COL2 > 7 );datalines;11.21 5.33.11 11.4;PROC PRINT DATA=MYDATA1;RUN;
在运行上面的代码,我们可以得到下面的输出。
下表描述了比较运算符的详细信息。 这些运算符比较变量的值,结果是真值,1表示TRUE,0表示False。 让我们假设分别具有值8和4的两个数据变量V1和V2。
操作者 | 描述 | 例 |
---|---|---|
= | EQUAL运算符。 如果两个数据值相等,则结果为1,否则为0。 | (V1 = 8)给出1。 |
^ = | NOT EQUAL运算符。 如果两个数据值不相等,则结果为1,否则为0。 | (V1 ^ = V2)给出1。 |
< | LESS THAN运算符。 | (V2 <V2)提供1。 |
<= | 小于或等于运算符。 | (V2 <= 4)给出1。 |
> | 大于运算符。 | (V2> V1)给出1。 |
> = | 大于或等于运算符。 | (V2> = V1)给出0。 |
在 | IN运算符。 如果变量的值等于给定值列表中的任何一个值,则返回1 else否则返回0。 | V1在(5,7,9,8)给出1。 |
DATA MYDATA1;input @1 COL1 5.2 @7 COL2 4.1; EQ_ = (COL1 = 11.21);NEQ_= (COL1 ^= 11.21);GT_ = (COL2 => 8);LT_ = (COL2 <= 12);IN_ = COL2 in( 6.2,5.3,12 );datalines;11.21 5.33.11 11.4;PROC PRINT DATA=MYDATA1;RUN;
在运行上面的代码,我们可以得到下面的输出。
下表描述了最小/最大运算符的详细信息。 这些运算符比较一行中变量的值,并返回行中的值列表中的最小值或最大值。
操作者 | 描述 | 例 |
---|---|---|
MIN | MIN运算符。 它从行中的值列表返回最小值。 | MIN(45.2,11.6,15.41)给出了11.6 |
MAX | MAX操作符。 它从行中的值列表返回最大值。 | MAX(45.2,11.6,15.41)给出了45.2 |
DATA MYDATA1;input @1 COL1 5.2 @7 COL2 4.1 @12 COL3 6.3; min_ = MIN(COL1 , COL2 , COL3);max_ = MAX( COL1, COl2 , COL3);datalines;11.21 5.3 29.0123.11 11.4 18.512;PROC PRINT DATA=MYDATA1;RUN;
在运行上面的代码,我们可以得到下面的输出。
下表描述了Concatenation运算符的详细信息。 此运算符连接两个或多个字符串值。 返回单个字符值。
操作者 | 描述 | 例 |
---|---|---|
|| | 连接运算符。 它返回两个或多个值的连接。 | 'Hello'||'World' 输出 HelloWorld |
DATA MYDATA1;input COL1 $ COL2 $ COL3 $; concat_ = (COL1 || COL2 || COL3);datalines;Tutorial s pointsimple easy learning;PROC PRINT DATA=MYDATA1;RUN;
在运行上面的代码,我们可以得到下面的输出。
运算符优先级表示复杂表达式中存在的多个运算符的求值顺序。 下表描述了一组运算符中的优先顺序。
组 | 顺序 | 符号 |
---|---|---|
第一组 | 右到左 | ** + - NOT MIN MAX |
第二组 | 左到右 | * / |
第三组 | 左到右 | + - |
第四组 | 左到右 | || |
第五组 | 左到右 | <<= => => |
决策结构要求程序员指定要由程序评估或测试的一个或多个条件,以及如果条件被确定为真则要执行的一个或多个语句,相反如果条件为假则不执行。
以下是大多数编程语言中典型的决策结构的一般形式:
SAS提供以下类型的决策语句。 单击以下链接以检查其详细信息。
SN | 声明类型和说明 |
---|---|
1. | if语句。 if语句由条件组成。 如果条件为真,则提取特定数据。 |
2. | IF-THEN-ELSE语句。 if语句后跟随else语句,当布尔条件为假时执行。 |
3. | IF-THEN-ELSE-IF语句。 if语句后跟随else语句,后面再跟一对IF-THEN语句。 |
4. | IF-THEN-DELETE语句。 if语句包括acondition,当真正从观察值中删除特定数据时。 |
SAS具有多种内置函数,有助于分析和处理数据。 这些函数用作DATA语句的一部分。 它们将数据变量作为参数,并将结果存储到另一个变量中。 根据函数的类型,所需的参数数量可能会有所不同。 一些函数接受零参数,而另一些函数接受固定数量的变量。 以下是SAS提供的功能类型列表。
在SAS中使用函数的一般语法如下。
FUNCTIONNAME(argument1, argument2...argument)
这里的参数可以是常量,变量,表达式或另一个函数。
根据它们的使用情况,在SAS中的功能被分类为如下。
这些是用于对变量值应用一些数学计算的函数。
下面的SAS程序显示了一些重要的数学函数的使用。
data Math_functions;v1=21; v2=42; v3=13; v4=10; v5=29;/* Get Maximum value */max_val = MAX(v1,v2,v3,v4,v5);/* Get Minimum value */min_val = MIN (v1,v2,v3,v4,v5);/* Get Median value */med_val = MEDIAN (v1,v2,v3,v4,v5);/* Get a random number */rand_val = RANUNI(0);/* Get Square root of sum of the values */SR_val= SQRT(sum(v1,v2,v3,v4,v5));proc print data = Math_functions noobs;run;
当上面的代码运行时,我们得到以下输出:
这些是用于处理日期和时间值的函数。
下面的SAS程序显示了使用日期和时间的函数。
data date_functions;INPUT @1 date1 date9. @11 date2 date9.;format date1 date9. date2 date9.;/* Get the interval between the dates in years*/Years_ = INTCK('YEAR',date1,date2);/* Get the interval between the dates in months*/months_ = INTCK('MONTH',date1,date2);/* Get the week day from the date*/weekday_ = WEEKDAY(date1);/* Get Today's date in SAS date format */today_ = TODAY();/* Get current time in SAS time format */time_ = time();DATALINES;21OCT2000 16AUG199801MAR2009 11JUL2012;proc print data = date_functions noobs;run;
当运行上面的代码,我们得到以下的输出:
这些都是用于处理字符或文本值的功能。
下面的SAS程序显示了使用的字符函数。
data character_functions;/* Convert the string into lower case */lowcse_ = LOWCASE('HELLO'); /* Convert the string into upper case */upcase_ = UPCASE('hello'); /* Reverse the string */reverse_ = REVERSE('Hello'); /* Return the nth word */nth_letter_ = SCAN('Learn SAS Now',2);run;proc print data = character_functions noobs;run;
当运行上面的代码,我们得到以下的输出:
这些是用于截断数字值的功能。
下面的SAS程序说明了如何使用截断功能。
data trunc_functions;/* Nearest greatest integer */ceil_ = CEIL(11.85); /* Nearest greatest integer */floor_ = FLOOR(11.85); /* Integer portion of a number */int_ = INT(32.41); /* Round off to nearest value */round_ = ROUND(5621.78);run;proc print data = trunc_functions noobs;run;
当运行上面的代码,我们得到以下的输出:
下面的SAS程序显示了使用的辅助功能。
data misc_functions;/* Nearest greatest integer */state2=zipstate('01040'); /* Amortization calculation */payment=mort(50000, . , .10/12,30*12);proc print data = misc_functions noobs;run;
当运行上面的代码,我们得到以下的输出:
输入方法用于读取原始数据。 原始数据可以来自外部源或来自流数据。 输入语句创建一个变量,其名称将分配给每个字段。 所以你必须在输入语句中创建一个变量。 相同的变量将显示在 SAS 数据集的输出中。 以下是 SAS 中可用的不同输入方法。
每个输入方法的细节描述如下。
在此方法中,变量与数据类型一起列出。 仔细分析原始数据,以便声明的变量的顺序与数据匹配。 分隔符(通常为空格)在任何一对相邻列之间应该是一致的。 任何丢失的数据将导致输出中的问题,因为结果将是错误的。
下面的代码和输出显示了使用列表输入法。
DATA TEMP;INPUT EMPID ENAME $ DEPT $ ;DATALINES;1 Rick IT2 Dan OPS3 Tusar IT4 Pranab OPS5 Rasmi FIN;PROC PRINT DATA=TEMP;RUN;
在运行 bove 代码,我们得到以下输出。
SAS有一个强大的编程功能叫宏,它允许我们避免重复的代码段,并在需要时一次又一次地使用它们。 它还有助于在代码中创建动态变量,可以为同一代码的不同运行实例使用不同的值。 宏还可以声明为代码块,它将以类似于宏变量的方式被重复使用多次。 我们将在下面的例子中看到这两个。
这些是保存由SAS程序一次又一次使用的值的变量。 它们在SAS程序开始时声明,并在程序体中稍后调用。 它们可以是全局或局部范围。
它们称为全局宏变量,因为它们可以由SAS环境中可用的任何SAS程序访问。 通常它们是由多个程序访问的系统分配的变量。 一般的例子是系统日期。
下面是一个名为SYSDATE的SAS变量的示例,它表示系统日期。 考虑一种方案,以便在生成报告的每天的SAS报告的标题中打印系统日期。 标题将显示当前日期和日期,而不为它们编码任何值。 我们使用SASHELP库中提供的名为CARS的内置SAS数据集。
proc print data = sashelp.cars;where make = 'Audi' and type = 'Sports' ; TITLE "Sales as of &SYSDAY &SYSDATE";run;
当运行上面的代码,我们得到以下输出。
这些变量可以被SAS程序访问,在这些程序中它们被声明为程序的一部分。 它们通常用于向相同的SAS语句SL提供不同的变量,使得它们可以处理数据集的不同观察值。
局部变量使用下面的语法声明。
% LET (Macro Variable Name) = Value;
这里的值字段可以采取程序所需的任何数字,文本或日期值。 宏变量名是任何有效的SAS变量。
这些变量由SAS语句使用,并在变量名的开头附加&字符。 下面的程序得到我们所有的观察的'奥迪'和类型'体育'。 如果我们想要不同make的结果,我们需要更改变量make_name的值,而不改变程序的任何其他部分。 在带来程序的情况下,这个变量可以在任何SAS语句中被再次引用。
%LET make_name = 'Audi';%LET type_name = 'Sports';proc print data = sashelp.cars;where make = &make_name and type = &type_name ; TITLE "Sales as of &SYSDAY &SYSDATE";run;
当上面的代码运行时,我们得到与上一个程序相同的输出。 但是让我们将type_name改为'Wagon',并运行相同的程序。 我们将得到以下结果。
宏是一组SAS语句,由名称引用,并在程序中使用该名称在任何地方使用它。 它以%MACRO语句开始,以%MEND语句结束。
局部变量使用下面的语法声明。
# Creating a Macro program.%MACRO (Param1, Param2,….Paramn);Macro Statements;%MEND;# Calling a Macro program.%MacroName (Value1, Value2,…..Valuen);
以下程序在名为“show_result”的宏下对一组SAT staemnets进行解密; 此宏正由其他SAS语句调用。
%MACRO show_result(make_ , type_);proc print data = sashelp.cars;where make = "&make_" and type = "&type_" ;TITLE "Sales as of &SYSDAY &SYSDATE";run;%MEND;%show_result(BMW,SUV);
当运行上面的代码,我们得到以下输出。
SAS有许多MACRO语句,它们内置在SAS编程语言中。 它们被其他SAS程序使用,而没有明确声明它们。 常见的例子是 - 当满足一些条件时终止程序或捕获程序日志中变量的运行时值。 下面是一些例子。
此宏语句将文本或宏变量信息写入SAS日志。 在下面的例子中,变量“today”的值被写入程序日志。
data _null_;CALL SYMPUT ('today',TRIM(PUT("&sysdate"d,worddate22.)));run;%put &today;
当某个条件的计算结果为真时,执行该宏将导致当前执行的宏正常终止。 在下面的示例中,当变量“val”的值变为10时,宏终止其它连接。
%macro check_condition(val); %if &val = 10 %then %return; data p; x=34.2; run; %mend check_condition; %check_condition(11) ;
此宏定义包含一个%DO%WHILE循环,根据需要以%END语句结束。 在下面的示例中,名为test的宏采用用户输入,并使用此输入值运行DO循环。 DO循环的结束通过%end语句实现,而宏的结束通过%mend语句实现。
%macro test(finish); %let i=1; %do %while (&i <&finish); %put the value of i is &i; %let i=%eval(&i+1); %end;%mend test;%test(5)
在SAS中日期有一种特殊的计算方式,以1960年1月1日为中心点进行计算,该日期为0,下一个日期的日期为1,以此类推。该日期之前的日期则为负数-1,-2等表示。使用这种方法,SAS可以表示未来的任何日期和过去的任何日期。
当SAS从源读取数据时,它将读取的数据转换为指定日期格式的特定日期格式。 用于存储日期值的变量使用所需的正确informat来声明。 输出日期通过使用输出数据格式显示。
可以使用特定的日期信息正确读取源数据,如下所示。 信息末尾的数字表示使用信息完全读取的日期字符串的最小宽度。 较小的宽度将给出不正确的结果。 使用SAS V9,有一个通用的日期格式anydtdte15。 它可以处理任何日期输入。
输入日期 | 日期宽度 | INFORMAT |
---|---|---|
03/11/2014 | 10 | mmddyy10。 |
03/11/14 | 8 | mmddyy8。 |
December 11, 2012 | 20 | worddate20。 |
14mar2011 | 9 | date9。 |
14-mar-2011 | 11 | date11。 |
14-mar-2011 | 15 | anydtdte15。 |
下面的代码显示了不同日期格式的读取。 请注意,所有的输出值只是数字,因为我们没有对输出值应用任何格式语句。
DATA TEMP;INPUT @1 Date1 date11. @12 Date2 anydtdte15. @23 Date3 mmddyy10. ;DATALINES;02-mar-2012 3/02/2012 3/02/2012;PROC PRINT DATA=TEMP;RUN;
当执行上面的代码,我们可以得到下面的输出。
读取后的日期可以根据显示器的要求转换为其他格式。 这是使用日期类型的格式语句实现的。 它们采用与informats相同的格式。
在下面的示例中,日期以一种格式读取,但以另一种格式显示。
DATA TEMP;INPUT @1 DOJ1 mmddyy10. @12 DOJ2 mmddyy10. ;format DOJ1 date11. DOJ2 worddate20. ;DATALINES;01/12/2012 02/11/1998 ;PROC PRINT DATA=TEMP;RUN;
当执行上面的代码,我们可以得到下面的输出。
与读取数据集类似,SAS可以以不同的格式写入数据集。 它可以将数据从SAS文件写入正常文本文件。 这些文件可以由其他软件程序读取。 SAS使用PROC EXPORT写入数据集。
它是一个SAS内置过程,用于导出SAS数据集,以将数据写入不同格式的文件。
在SAS中编写过程的基本语法是:
PROC EXPORT DATA=libref.SAS data-set (SAS data-set-options)OUTFILE="filename" DBMS=identifier LABEL(REPLACE);
以下是所使用的参数的说明:
我们将使用SASHELP库中提供的名为cars的SAS数据集。 我们将其作为以空格分隔的文本文件导出,其代码如下所示。
proc export data=sashelp.cars outfile= '/folders/myfolders/sasuser.v94/TutorialsPoint/car_data.txt' dbms=dlm; delimiter=' '; run;
在执行上面的代码中我们可以看到输出为文本文件并右键单击它,看它的内容。
为了写逗号分隔的文件,我们可以使用带有值“csv”的dlm选项。 以下代码写入文件car_data.csv。
proc export data=sashelp.cars outfile= '/folders/myfolders/sasuser.v94/TutorialsPoint/car_data.csv' dbms=csv; run;
执行上面的代码,我们得到下面的输出。
为了写一个制表符分隔文件,我们可以使用带有值“tab”的dlm选项。 以下代码写入文件car_tab.txt。
proc export data=sashelp.cars outfile= '/folders/myfolders/sasuser.v94/TutorialsPoint/car_tab.txt' dbms=csv; run;
数据也可以写成HTML文件,我们将在输出交付系统章节下看到。
可以使用SET语句连接多个SAS数据集以提供单个数据集。 在连接的数据集中的观察的总数是原始数据集中的观察的数量的总和。 观察的顺序是连续的。 来自第一数据集的所有观察结果后面是来自第二数据集的所有观察结果,并依此类推。
所有组合数据集具有相同的变量,但是如果它们具有不同数量的变量,则在结果中出现所有变量,对于较小数据集具有缺失值。
SAS中SET语句的基本语法是:
SET data-set 1 data-set 2 data-set 3.....;
以下是所使用的参数的说明:
考虑在两个不同数据集中可用的组织的员工数据,一个用于IT部门,另一个用于非IT部门。 要获得所有员工的完整详细信息,我们使用如下所示的SET语句连接两个数据集。
DATA ITDEPT; INPUT empid name $ salary ; DATALINES; 1 Rick 623.3 3 Mike 611.5 6 Tusar 578.6 ; RUN; DATA NON_ITDEPT; INPUT empid name $ salary ; DATALINES; 2 Dan 515.2 4 Ryan 729.1 5 Gary 843.25 7 Pranab 632.8 8 Rasmi 722.5 RUN; DATA All_Dept; SET ITDEPT NON_ITDEPT; RUN; PROC PRINT DATA=All_Dept; RUN;
当执行上面的代码,我们可以得到下面的输出。
当我们在用于级联的数据集中有许多变化时,变量的结果可以不同,但是级联数据集中的观测值的总数总是每个数据集中的观测值的总和。 我们将在下面考虑这种变化的许多情况。
如果原始数据集中的一个具有更多数量的变量而另一个数据集,则数据集仍然被组合,但是在较小的数据集中,这些变量显示为缺失。
在下面的例子中,第一个数据集有一个名为DOJ的额外变量。 在结果中,第二个数据集的DOJ值将显示为缺失。
DATA ITDEPT; INPUT empid name $ salary DOJ date9. ; DATALINES; 1 Rick 623.3 02APR20013 Mike 611.5 21OCT20006 Tusar 578.6 01MAR2009 ; RUN; DATA NON_ITDEPT; INPUT empid name $ salary ; DATALINES; 2 Dan 515.2 4 Ryan 729.1 5 Gary 843.25 7 Pranab 632.8 8 Rasmi 722.5 RUN; DATA All_Dept; SET ITDEPT NON_ITDEPT; RUN; PROC PRINT DATA=All_Dept; RUN;
当执行上面的代码,我们可以得到下面的输出。
在这种情况下,数据集具有相同数量的变量,但变量名在它们之间不同。 在这种情况下,正态连接将产生结果集中的所有变量,并给出不同的两个变量的缺失结果。 虽然我们不能更改原始数据集中的变量名称,但我们可以在我们创建的连接数据集中应用RENAME函数。 这将产生与正常连接相同的结果,但是当然使用一个新的变量名称代替原始数据集中存在的两个不同的变量名称。
在下面的示例中,数据集ITDEPT具有变量名ename,而数据集NON_ITDEPT具有变量名empame。 但这两个变量代表相同的类型(字符)。 我们在SET语句中应用RENAME函数,如下所示。
DATA ITDEPT; INPUT empid ename $ salary ; DATALINES; 1 Rick 623.3 3 Mike 611.5 6 Tusar 578.6 ; RUN; DATA NON_ITDEPT; INPUT empid empname $ salary ; DATALINES; 2 Dan 515.2 4 Ryan 729.1 5 Gary 843.25 7 Pranab 632.8 8 Rasmi 722.5 RUN; DATA All_Dept; SET ITDEPT(RENAME =(ename=Employee) ) NON_ITDEPT(RENAME =(empname=Employee) ); RUN; PROC PRINT DATA=All_Dept; RUN;
当执行上面的代码,我们可以得到下面的输出。
如果两个数据集中的变量长度不同,则连接的数据集将具有其中一些数据对于具有较小长度的变量被截断的值。 如果第一个数据集的长度较小,就会发生这种情况。 为了解决这个问题,我们对数据集应用更高的长度,如下所示。
在下面的示例中,变量ename在第一个数据集中的长度为5,在第二个数据集中为7。 当连接时,我们应用连接数据集中的LENGTH语句将枚举长度设置为7。
DATA ITDEPT; INPUT empid 1-2 ename $ 3-7 salary 8-14 ; DATALINES; 1 Rick 623.3 3 Mike 611.5 6 Tusar 578.6 ; RUN;DATA NON_ITDEPT; INPUT empid 1-2 ename $ 3-9 salary 10-16 ; DATALINES; 2 Dan 515.2 4 Ryan 729.1 5 Gary 843.257 Pranab 632.8 8 Rasmi 722.5 RUN; DATA All_Dept; LENGTH ename $ 7 ; SET ITDEPT NON_ITDEPT ; RUN; PROC PRINT DATA=All_Dept; RUN;
当执行上面的代码,我们可以得到下面的输出。
可以基于特定的公共变量合并多个SAS数据集以给出单个数据集。 这是使用MERGE语句和BY语句完成的。 合并数据集中的观察的总数通常小于原始数据集中的观察的数量的总和。 这是因为当公共变量的值存在匹配时,变量形成两个数据集合被合并为一个记录。
下面给出了合并数据集的两个先决条件:
SAS中的MERGE和BY语句的基本语法是:
MERGE Data-Set 1 Data-Set 2BY Common Variable
以下是所使用的参数的说明:
考虑两个SAS数据集,一个包含具有名称和工资的雇员ID,另一个包含具有雇员ID和部门的雇员ID。 在这种情况下,为了获得每个员工的完整信息,我们可以合并这两个数据集。 最终数据集仍将对每个员工有一个观察值,但它将包含薪水和部门变量。
# Data set 1 ID NAME SALARY 1 Rick 623.3 2 Dan 515.2 3 Mike 611.5 4 Ryan 729.1 5 Gary 843.25 6 Tusar 578.6 7 Pranab 632.8 8 Rasmi 722.5 # Data set 2ID DEPT1 IT 2 OPS3 IT 4 HR 5 FIN 6 IT 7 OPS8 FIN # Merged data setID NAME SALARY DEPT 1 Rick 623.3 IT 2 Dan 515.2 OPS 3 Mike 611.5 IT 4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 IT 7 Pranab 632.8 OPS8 Rasmi 722.5 FIN
上述结果通过使用以下代码实现,其中在BY语句中使用公共变量(ID)。 请注意,两个数据集中的观测值已在ID列中排序。
DATA SALARY; INPUT empid name $ salary ; DATALINES; 1 Rick 623.3 2 Dan 515.2 3 Mike 611.5 4 Ryan 729.1 5 Gary 843.25 6 Tusar 578.6 7 Pranab 632.8 8 Rasmi 722.5 ;RUN; DATA DEPT; INPUT empid dEPT $ ; DATALINES; 1 IT 2 OPS3 IT 4 HR 5 FIN 6 IT 7 OPS8 FIN ;RUN; DATA All_details;MERGE SALARY DEPT;BY (empid);RUN;PROC PRINT DATA=All_details; RUN;
可能存在公共变量的一些值在数据集之间不匹配的情况。 在这种情况下,数据集仍然会合并,但在结果中给出缺失值。
ID NAME SALARY DEPT 1 Rick 623.3 IT 2 Dan 515.2 OPS 3 . . IT4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 .7 Pranab 632.8 OPS8 Rasmi 722.5 FIN
为了避免结果中的缺失值,我们可以考虑仅保留具有公共变量的匹配值的观察值。 这是通过使用IN语句实现的。 SAS程序的merge语句需要更改。
在下面的示例中,IN =值仅保留来自数据集SALARY和DEPT的值匹配的观察值。
DATA All_details;MERGE SALARY(IN=a) DEPT(IN=b);BY (empid);IF a=1 and b=1;RUN;PROC PRINT DATA=All_details; RUN;
在执行具有上述改变的部分的SAS程序时,我们得到以下输出。
1 Rick 623.3 IT 2 Dan 515.2 OPS 4 Ryan 729.1 HR 5 Gary 843.25 FIN 7 Pranab 632.8 OPS8 Rasmi 722.5 FIN
设置SAS数据集的子设置意味着通过选择较少数量的变量或较少数量的观测值或同时选择较少数量的观测值来提取数据集的一部分。 通过使用KEEP和DROP语句完成变量的子设置,使用DELETE语句完成观察的子设置。 此外,来自子设置操作的结果数据保存在可用于进一步分析的新数据集中。 子设置主要用于分析数据集的一部分而不使用那些可能与分析不相关的变量或观察的目的。
在这种方法中,我们只从整个数据集中提取很少的变量。
SAS中子设置变量的基本语法是:
KEEP var1 var2 ... ;DROP var1 var2 ... ;
以下是所使用的参数的说明:
考虑包含组织的员工详细信息的以下SAS数据集。 如果我们只想从数据集中获取Name和Department值,那么我们可以使用下面的代码。
DATA Employee; INPUT empid ename $ salary DEPT $ ; DATALINES; 1 Rick 623.3 IT 2 Dan 515.2 OPS 3 Mike 611.5 IT 4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 IT 7 Pranab 632.8 OPS8 Rasmi 722.5 FIN ;RUN;DATA OnlyDept; SET Employee; KEEP ename DEPT; RUN; PROC PRINT DATA=OnlyDept; RUN;
当上面的代码执行时,我们得到以下输出。
通过删除不需要的变量可以获得相同的结果。 下面的代码说明了这一点。
DATA Employee; INPUT empid ename $ salary DEPT $ ; DATALINES; 1 Rick 623.3 IT 2 Dan 515.2 OPS 3 Mike 611.5 IT 4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 IT 7 Pranab 632.8 OPS8 Rasmi 722.5 FIN ;RUN;DATA OnlyDept; SET Employee; DROP empid salary; RUN; PROC PRINT DATA=OnlyDept; RUN;
在这种方法中,我们只从整个数据集中提取少数观测值。
我们使用PROC FREQ来跟踪为新数据集选择的观测值。
子设置观测的语法是:
IF Var Condition THEN DELETE ;
以下是所使用的参数的说明:
考虑包含组织的员工详细信息的以下SAS数据集。 如果我们只想获得薪水超过700的员工的数据,那么我们使用以下代码。
DATA Employee; INPUT empid name $ salary DEPT $ ; DATALINES; 1 Rick 623.3 IT 2 Dan 515.2 OPS 3 Mike 611.5 IT 4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 IT 7 Pranab 632.8 OPS8 Rasmi 722.5 FIN ;RUN;DATA OnlyDept; SET Employee; IF salary < 700 THEN DELETE; RUN; PROC PRINT DATA=OnlyDept; RUN;
当执行上面的代码,我们可以得到下面的输出。
SAS中的数据集可以对其中存在的任何变量进行排序。 这有助于在数据分析和执行其他选项,如合并等。排序可以发生在任何单个变量以及多个变量。 用于在SAS数据集中执行排序的SAS过程被称为PROC SORT。 排序后的结果存储在新数据集中,原始数据集保持不变。
SAS中数据集中排序操作的基本语法是:
PROC SORT DATA=original dataset OUT=Sorted dataset; BY variable name;
以下是使用的参数的描述:
让我们考虑包含组织的员工详细信息的以下SAS数据集。 我们可以使用以下代码对工资数据集进行排序。
DATA Employee; INPUT empid name $ salary DEPT $ ; DATALINES; 1 Rick 623.3 IT 2 Dan 515.2 OPS 3 Mike 611.5 IT 4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 IT 7 Pranab 632.8 OPS8 Rasmi 722.5 FIN ;RUN;PROC SORT DATA=Employee OUT=Sorted_sal ; BY salary;RUN ; PROC PRINT DATA=Sorted_sal;RUN ;
当执行上面的代码,我们可以得到下面的输出。
默认排序选项按升序排列,这意味着观察值按排序变量的较低值到较高值排列。 但我们也可能希望排序以升序发生。
在下面的代码中,通过使用DESCENDING语句实现反向排序。
DATA Employee; INPUT empid name $ salary DEPT $ ; DATALINES; 1 Rick 623.3 IT 2 Dan 515.2 OPS 3 Mike 611.5 IT 4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 IT 7 Pranab 632.8 OPS8 Rasmi 722.5 FIN ;RUN;PROC SORT DATA=Employee OUT=Sorted_sal_reverse ; BY DESCENDING salary;RUN ; PROC PRINT DATA=Sorted_sal_reverse;RUN ;
当执行上面的代码,我们可以得到下面的输出。
通过在BY语句中使用它们,可以对多个变量应用排序。 变量以从左到右的优先级排序。
在下面的代码中,数据集首先在变量名称上排序,然后在变量名称salary上排序。
DATA Employee; INPUT empid name $ salary DEPT $ ; DATALINES; 1 Rick 623.3 IT 2 Dan 515.2 OPS 3 Mike 611.5 IT 4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 IT 7 Pranab 632.8 OPS8 Rasmi 722.5 FIN ;RUN;PROC SORT DATA=Employee OUT=Sorted_dept_sal ; BY salary DEPT;RUN ; PROC PRINT DATA=Sorted_dept_sal;RUN ;
当执行上面的代码,我们可以得到下面的输出。
有时,我们更喜欢以不同于其已经存在于数据集中的格式来显示分析的数据。 例如,我们想要向有价格信息的变量添加美元符号和两个小数位。 或者我们可能想要显示一个文本变量,全部为大写。 我们可以使用FORMAT来应用内置的SAS格式,PROC FORMAT是应用用户定义的格式。此外,单个格式可以应用于多个变量。
应用内置SAS格式的基本语法是:
format variable name format name
以下是使用的参数的描述:
让我们考虑包含组织的员工详细信息的以下SAS数据集。 我们希望以大写显示所有的名称。 格式化语句用于实现这一点。
DATA Employee; INPUT empid name $ salary DEPT $ ; format name $upcase9. ;DATALINES; 1 Rick 623.3 IT 2 Dan 515.2 OPS 3 Mike 611.5 IT 4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 IT 7 Pranab 632.8 OPS8 Rasmi 722.5 FIN ;RUN; PROC PRINT DATA=Employee; RUN;
当执行上面的代码,我们可以得到下面的输出。
我们还可以使用PROC FORMAT来格式化数据。 在下面的示例中,我们将新值分配给部门名称的变量DEPT。
DATA Employee; INPUT empid name $ salary DEPT $ ; DATALINES; 1 Rick 623.3 IT 2 Dan 515.2 OPS3 Mike 611.5 IT 4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 IT 7 Pranab 632.8 OPS8 Rasmi 722.5 FIN ;proc format;value $DEP 'IT' = 'Information Technology' 'OPS'= 'Operations' ;RUN; PROC PRINT DATA=Employee; format name $upcase9. DEPT $DEP.; RUN;
当执行上面的代码,我们可以得到下面的输出。
SAS通过在SAS程序中使用SQL查询,为大多数流行的关系数据库提供广泛的支持。 支持大多数ANSI SQL语法。 过程PROC SQL用于处理SQL语句。 此过程不仅可以返回SQL查询的结果,还可以创建SAS表和变量。 所有这些情况的示例如下所述。
在SAS中使用PROC SQL的基本语法是:
PROC SQL;SELECT ColumnsFROM TABLEWHERE ColumnsGROUP BY Columns;QUIT;
以下是使用的参数的描述:
下面我们将看到这个SAS过程如何用于SQL中的CRUD(创建,读取,更新和删除)操作。
使用SQL,我们可以创建新的数据集形式原始数据。 在下面的示例中,首先声明一个名为TEMP的数据集,其中包含原始数据。 然后我们写一个SQL查询,从这个数据集的变量创建一个表。
DATA TEMP;INPUT ID $ NAME $ SALARY DEPARTMENT $;DATALINES;1 Rick 623.3 IT2 Dan 515.2 Operations3 Michelle 611 IT4 Ryan 729 HR5 Gary 843.25 Finance6 Nina 578 IT7 Simon 632.8 Operations8 Guru 722.5 Finance;RUN;PROC SQL;CREATE TABLE EMPLOYEES ASSELECT * FROM TEMP;QUIT;PROC PRINT data = EMPLOYEES;RUN;
当执行上面的代码中,我们得到以下结果:
SQL中的读取操作涉及编写SQL SELECT查询以从表中读取数据。 In以下程序查询库SASHELP中可用的名为CARS的SAS数据集。 查询获取数据集的某些列。
PROC SQL;SELECT make,model,type,invoice,horsepower FROM SASHELP.CARS;QUIT;
当执行上面的代码中,我们得到以下结果:
以下程序使用where子句查询CARS数据集。 在结果中,我们只得到了作为“Audi”和类型为“Sports”的观察。
PROC SQL;SELECT make,model,type,invoice,horsepower FROM SASHELP.CARSWhere make = 'Audi'and Type = 'Sports';QUIT;
当执行上面的代码中,我们得到以下结果:
我们可以使用SQL Update语句更新SAS表。 下面我们首先创建一个名为EMPLOYEES2的新表,然后使用SQL UPDATE语句更新它。
DATA TEMP;INPUT ID $ NAME $ SALARY DEPARTMENT $;DATALINES;1 Rick 623.3 IT2 Dan 515.2 Operations3 Michelle 611 IT4 Ryan 729 HR5 Gary 843.25 Finance6 Nina 578 IT7 Simon 632.8 Operations8 Guru 722.5 Finance;RUN;PROC SQL;CREATE TABLE EMPLOYEES2 ASSELECT ID as EMPID,Name as EMPNAME ,SALARY as SALARY,DEPARTMENT as DEPT,SALARY*0.23 as COMMISIONFROM TEMP;QUIT;PROC SQL;UPDATE EMPLOYEES2 SET SALARY=SALARY*1.25; QUIT; PROC PRINT data = EMPLOYEES2;RUN;
SQL中的删除操作涉及使用SQL DELETE语句从表中删除某些值。 我们继续使用上面示例中的数据,并从表中删除雇员的工资大于900的行。
PROC SQL;DELETE FROM EMPLOYEES2 WHERE SALARY > 900;QUIT; PROC PRINT data = EMPLOYEES2;RUN;
SAS程序的输出可以转换为更加用户友好的形式,如.html或PDF。 这是通过使用SAS中提供的ODS语句来完成的。 ODS代表输出传递系统。 它主要用于格式化SAS程序的输出数据到好的报告,这是很好看的和理解。 这也有助于与其他平台和软件共享输出。 它还可以将多个PROC语句的结果合并在一个文件中。
在SAS中使用ODS语句的基本语法是:
ODS outputtypePATH path nameFILE = Filename and PathSTYLE = StyleName;PROC some proc;ODS outputtype CLOSE;
以下是使用的参数的描述:
我们使用ODS HTML语句创建HTML输出。在下面的示例中,我们在所需的路径中创建一个html文件。 我们应用样式库中提供的样式。 我们可以看到提到的路径中的输出文件,我们可以下载它以保存在不同于SAS环境的环境中。 请注意,我们有两个proc SQL语句,它们的输出都捕获到一个文件中。
ODS HTML PATH='/folders/myfolders/sasuser.v94/TutorialsPoint/' FILE='CARS2.html' STYLE=EGDefault;proc SQL;select make, model, invoice from sashelp.carswhere make in ('Audi','BMW')and type = 'Sports';quit;proc SQL;select make,mean(horsepower)as meanhpfrom sashelp.carswhere make in ('Audi','BMW')group by make;quit;ODS HTML CLOSE;
当执行上面的代码中,我们得到以下结果:
在下面的示例中,我们在所需的路径中创建一个PDF文件。 我们应用样式库中提供的样式。 我们可以看到提到的路径中的输出文件,我们可以下载它以保存在不同于SAS环境的环境中。 请注意,我们有两个proc SQL语句,它们的输出都捕获到一个文件中。
ODS PDF FILE='/folders/myfolders/sasuser.v94/TutorialsPoint/CARS2.pdf' STYLE=EGDefault;proc SQL;select make, model, invoice from sashelp.carswhere make in ('Audi','BMW')and type = 'Sports';quit;proc SQL;select make,mean(horsepower)as meanhpfrom sashelp.carswhere make in ('Audi','BMW')group by make;quit;ODS PDF CLOSE;
当执行上面的代码中,我们得到以下结果:
在下面的示例中,我们在所需的路径中创建一个RTF文件。 我们应用样式库中提供的样式。 我们可以看到提到的路径中的输出文件,我们可以下载它以保存在不同于SAS环境的环境中。 请注意,我们有两个proc SQL语句,它们的输出都捕获到一个文件中。
ODS RTF FILE='/folders/myfolders/sasuser.v94/TutorialsPoint/CARS.rtf'STYLE=EGDefault;proc SQL;select make, model, invoice from sashelp.carswhere make in ('Audi','BMW')and type = 'Sports';quit;proc SQL;select make,mean(horsepower)as meanhpfrom sashelp.carswhere make in ('Audi','BMW')group by make;quit;ODS rtf CLOSE;
当执行上面的代码中,我们得到以下结果:
模拟是一种计算技术,其对许多不同的随机样本使用重复计算以便估计统计量。 使用SAS,我们可以模拟在现实系统中指定统计属性的复杂数据。 我们使用软件构建系统模型,并数字化生成数据,您可以用它来更好地了解真实世界系统的行为。 设计计算机仿真模型的一部分是决定现实生活系统的哪些方面需要包括在模型中,使得由模型产生的数据可以用于做出有效的决定。 由于这种复杂性,SAS有一个用于模拟的专用软件组件。
用于创建SAS仿真的SAS软件组件称为SAS Simulation Studio。 其图形用户界面提供了一整套工具,用于构建,执行和分析离散事件仿真模型的结果。
下面列出了可应用SAS模拟的不同类型的统计分布。
SAS可以从包括许多文件格式的各种源读取数据。 SAS环境中使用的文件格式如下所述。
这些是包含文本格式数据的文件。 数据通常由空格分隔,但也可以有不同类型的分隔符,SAS也可以处理它们。 让我们考虑一个包含员工数据的ASCII文件。 我们使用SAS中提供的Infile语句读取此文件。
在下面的示例中,我们从本地环境读取名为emp_data.txt的数据文件。
data TEMP; infile '/folders/myfolders/sasuser.v94/TutorialsPoint/emp_data.txt'; input empID empName $ Salary Dept $ DOJ date9. ; format DOJ date9.; run; PROC PRINT DATA=TEMP;RUN;
当执行上面的代码,我们可以得到下面的输出。
这些是数据文件,其中列值由定界字符(如逗号或管道等)分隔。在这种情况下,我们使用infile语句中的dlm选项。
在下面的示例中,我们从本地环境读取名为emp.csv的数据文件。
data TEMP; infile '/folders/myfolders/sasuser.v94/TutorialsPoint/emp.csv' dlm=","; input empID empName $ Salary Dept $ DOJ date9. ; format DOJ date9.; run; PROC PRINT DATA=TEMP;RUN;
当执行上面的代码,我们可以得到下面的输出。
SAS可以使用导入工具直接读取excel文件。 如章节SAS数据集中所示,它可以处理各种各样的文件类型,包括MS excel。 假定文件emp.xls在SAS环境中本地可用。
FILENAME REFFILE"/folders/myfolders/TutorialsPoint/emp.xls"TERMSTR=CR;PROC IMPORT DATAFILE=REFFILEDBMS=XLSOUT=WORK.IMPORT;GETNAMES=YES;RUN;PROC PRINT DATA=WORK.IMPORT RUN;
上面的代码从excel文件读取数据,并给出与上述两种文件类型相同的输出。
DEPT:IT DTLS:1:Rick:623 DTLS:3:Mike:611 DTLS:6:Tusar:578 DEPT:OPSDTLS:7:Pranab:632DTLS:2:Dan:452DEPT:HRDTLS:4:Ryan:487DTLS:2:Siyona:452
要读取分层文件,我们使用下面的代码,其中我们使用IF子句标识头记录,并使用do循环来处理详细信息记录。
data employees(drop=Type); length Type $ 3 Department empID $ 3 empName $ 10 Empsal 3 ; retain Department; infile '/folders/myfolders/TutorialsPoint/empdtls.txt' dlm=':'; input Type $ @; if Type='DEP' then input Department $; else do; input empID empName $ Empsal ; output; end;run; PROC PRINT DATA=employees;RUN;
当执行上面的代码,我们可以得到下面的输出。
直方图是使用不同高度的条的数据的图形显示。 它将数据集中的各种数字分成许多范围。 它还表示连续变量的分布概率的估计。 在SAS中,PROC UNIVARIATE用于创建具有以下选项的直方图。
在SAS中创建直方图的基本语法是:
PROC UNIVARAITE DATA = DATASET;HISTOGRAM variables;RUN;以下是使用的参数的描述:
通过指定变量的名称和要考虑的对值进行分组的范围来创建简单的直方图。
在下面的例子中,我们考虑变量马力的最小值和最大值,取范围为50.因此,这些值形成一个以50为步长的组。
proc univariate data=sashelp.cars; histogram horsepower / midpoints = 176 to 350 by 50;run;
当我们执行上面的代码,我们得到以下的输出:
我们可以使用附加选项将一些分布曲线拟合到直方图中。
在下面的例子中,我们拟合一个分布曲线,其平均值和标准偏差值被称为EST。 此选项使用和估计参数。
proc univariate data=sashelp.cars noprint; histogram horsepower / normal ( mu = est sigma = est color = blue w = 2.5 )barlabel=percent midpoints = 70 to 550 by 50;run;
当我们执行上面的代码,我们得到以下的输出:
条形图表示矩形条中的数据,条的长度与变量的值成比例。 SAS使用过程PROC SGPLOT来创建条形图。 我们可以在条形图中绘制简单和堆叠的条形。 在条形图中,每个条可以给予不同的颜色。
在SAS中创建条形图的基本语法是:
PROC SGPLOT DATA = DATASET;VBAR variables;RUN;以下是使用的参数的描述:
简单的条形图是条形图,其中数据集中的变量表示为条形。
以下脚本将创建一个条形图,表示汽车的长度为条形。
PROC SQL;create table CARS1 asSELECT make,model,type,invoice,horsepower,length,weight FROM SASHELP.CARSWHERE make in ('Audi','BMW');RUN;proc SGPLOT data=work.cars1;vbar length ;title 'Lengths of cars';run;quit;
当我们执行上面的代码,我们得到以下的输出:
堆叠条形图是一个条形图,其中相对于另一个变量计算数据集中的变量。
以下脚本将创建一个堆叠条形图,其中计算每种车型的车辆长度。 我们使用group选项指定第二个变量。
proc SGPLOT data=work.cars1;vbar length /group = type ;title 'Lengths of Cars by Types';run;quit;
当我们执行上面的代码,我们得到以下的输出:
创建群集的条形图显示变量的值是如何跨文化传播。
下面的脚本将创建一个集群的条形图,其中汽车的长度是围绕汽车类型聚类。所以我们看到在长度191两个相邻的条形图,一为车型'轿车',而另一个用于汽车类型“旅行车”。
proc SGPLOT data=work.cars1;vbar length /group = type GROUPDISPLAY = CLUSTER;title 'Cluster of Cars by Types';run;quit;
当我们执行上面的代码,我们得到以下的输出:
基本的语法来创建一个饼图的SAS是:
PROC TEMPLATE; DEFINE STATGRAPH pie; BEGINGRAPH; LAYOUT REGION; PIECHART CATEGORY = variable / DATALABELLOCATION = OUTSIDE CATEGORYDIRECTION = CLOCKWISE START = 180 NAME = 'pie'; DISCRETELEGEND 'pie' / TITLE = ' '; ENDLAYOUT; ENDGRAPH; END;RUN;以下是使用的参数的描述:
在这个饼图中,我们从数据集中获取单个变量。 创建饼图时,使用表示变量计数相对于变量总值的分数的切片值。
在下面的例子中,每个切片代表汽车类型与汽车总数的比例。
PROC SQL;create table CARS1 asSELECT make,model,type,invoice,horsepower,length,weight FROM SASHELP.CARSWHERE make in ('Audi','BMW');RUN;PROC TEMPLATE; DEFINE STATGRAPH pie; BEGINGRAPH; LAYOUT REGION; PIECHART CATEGORY = type / DATALABELLOCATION = OUTSIDE CATEGORYDIRECTION = CLOCKWISE START = 180 NAME = 'pie'; DISCRETELEGEND 'pie' / TITLE = 'Car Types'; ENDLAYOUT; ENDGRAPH; END;RUN;PROC SGRENDER DATA = cars1 TEMPLATE = pie;RUN;
当我们执行上面的代码,我们得到以下输出:
在此饼图中,我们表示每个切片的分数值以及百分比值。 我们还将标签的位置更改为图表内。 使用DATASKIN选项修改图表的外观样式。 它使用SAS环境中提供的内置样式之一。
PROC TEMPLATE; DEFINE STATGRAPH pie; BEGINGRAPH; LAYOUT REGION; PIECHART CATEGORY = type / DATALABELLOCATION = INSIDE DATALABELCONTENT=ALL CATEGORYDIRECTION = CLOCKWISE DATASKIN= SHEEN START = 180 NAME = 'pie'; DISCRETELEGEND 'pie' / TITLE = 'Car Types'; ENDLAYOUT; ENDGRAPH; END;RUN;PROC SGRENDER DATA = cars1 TEMPLATE = pie;RUN;
当我们执行上面的代码,我们得到以下输出:
在该饼图中,图中呈现的变量的值相对于相同数据集的另一变量分组。 每个组变为一个圆,并且该图具有与可用组的数量一样多的同心圆。
在下面的示例中,我们将图表相对于名为“Make”的变量分组。 由于有两个可用的值(“Audi”和“BMW”),所以我们得到两个同心圆,每个代表自己的车类型的切片。
PROC TEMPLATE; DEFINE STATGRAPH pie; BEGINGRAPH; LAYOUT REGION; PIECHART CATEGORY = type / Group = make DATALABELLOCATION = INSIDE DATALABELCONTENT=ALL CATEGORYDIRECTION = CLOCKWISE DATASKIN= SHEEN START = 180 NAME = 'pie'; DISCRETELEGEND 'pie' / TITLE = 'Car Types'; ENDLAYOUT; ENDGRAPH; END;RUN;PROC SGRENDER DATA = cars1 TEMPLATE = pie;RUN;
当我们执行上面的代码,我们得到以下的输出:
在SAS中创建散点图的基本语法是:
PROC sgscatter DATA=DATASET; PLOT VARIABLE_1 * VARIABLE_2 / datalabel = VARIABLE group = VARIABLE;RUN;
以下是使用的参数的描述:
在一个简单的散点图中,我们从数据集中选择两个变量,并根据第三个变量对它们进行分组。 我们还可以标记数据。 结果显示两个变量如何分散在笛卡尔平面中。
PROC SQL;create table CARS1 asSELECT make,model,type,invoice,horsepower,length,weight FROM SASHELP.CARSWHERE make in ('Audi','BMW');RUN;TITLE 'Scatterplot - Two Variables';PROC sgscatter DATA=CARS1; PLOT horsepower*Invoice / datalabel = make group = type grid; title 'Horsepower vs. Invoice for car makers by types';RUN;
当我们执行上面的代码,我们得到以下的输出:
我们可以使用估计参数通过围绕值绘制椭圆来预测相关性的强度。 我们使用过程中的附加选项来绘制椭圆,如下所示。
proc sgscatter data =cars1; compare y = Invoice x =(horsepower length) / group=type ellipse =(alpha =0.05 type=predicted); title'Average Invoice vs. horsepower for cars by length'; title2'-- with 95% prediction ellipse --'; formatInvoice dollar6.0;run;
当我们执行上面的代码,我们得到以下的输出:
我们还可以有一个散点图,通过将它们分组成对,涉及多于两个变量。 在下面的示例中,我们考虑三个变量并绘制散点图矩阵。 我们得到3对结果矩阵。
PROC sgscatter DATA=CARS1; matrix horsepower invoice length / group = type; title 'Horsepower vs. Invoice vs. Length for car makers by types';RUN;
基本的语法来创建一个箱线图在SAS是:
PROC SGPLOT DATA=DATASET; VBOX VARIABLE / category = VARIABLE;RUN; PROC SGPANEL DATA=DATASET;;PANELBY VARIABLE; VBOX VARIABLE> / category = VARIABLE;RUN;以下是使用的参数的描述:
在一个简单的箱线图中,我们从数据集中选择一个变量,另一个变量形成一个类别。 第一变量的值被分类为与第二变量中的不同值的数量一样多的组数。
在下面的示例中,我们选择变量马力作为第一个变量,并键入类别变量。 因此,我们得到每种类型的汽车的马力值分布的箱线图。
PROC SQL;create table CARS1 asSELECT make,model,type,invoice,horsepower,length,weight FROM SASHELP.CARSWHERE make in ('Audi','BMW');RUN;PROC SGPLOT DATA=CARS1; VBOX horsepower / category = type; title 'Horsepower of cars by types';RUN;
我们可以将一个变量的Boxplots分成许多垂直面板(列)。 每个面板包含所有分类变量的箱线图。 但是盒图使用另一个第三个变量进一步分组,该图将该图分成多个面板。
在下面的例子中,我们使用变量'make'来绘制图形。 因为'make'有两个不同的值,所以我们得到两个垂直面板。
PROC SGPANEL DATA=CARS1;PANELBY MAKE; VBOX horsepower / category = type; title 'Horsepower of cars by types';RUN;
当我们执行上面的代码,我们得到以下的输出:
我们可以将一个变量的Boxplots分成许多水平面板(行)。 每个面板包含所有分类变量的箱线图。 但是盒图使用另一个第三个变量进一步分组,该图将该图分成多个面板。 在下面的例子中,我们使用变量'make'来绘制图形。 因为'make'有两个不同的值,所以我们得到两个水平面板。
PROC SGPANEL DATA=CARS1;PANELBY MAKE / columns = 1 novarname; VBOX horsepower / category = type; title 'Horsepower of cars by types';RUN;
线性回归用于识别因变量和一个或多个独立变量之间的关系。 提出了关系的模型,并且使用参数值的估计来形成估计的回归方程。
然后使用各种测试来确定模型是否令人满意。 如果是,则可以使用估计的回归方程来预测自变量的因变量给定值的值。 在SAS中,程序PROC REG用于找到两个变量之间的线性回归模型。
在SAS中应用PROC REG的基本语法是:
PROC REG DATA = dataset;MODEL variable_1 = variable_2;
以下是使用的参数的描述:
下面的例子显示了使用PROC REG查找汽车的两个变量马力和重量之间的相关性的过程。 在结果中,我们看到可以用于形成回归方程的截距值。
PROC SQL;create table CARS1 asSELECT invoice,horsepower,length,weight FROM SASHELP.CARSWHERE make in ('Audi','BMW');RUN;proc reg data=cars1;model horsepower= weight ;run;
当执行上面的代码中,我们得到以下结果:
上面的代码还给出了模型的各种估计的图形视图,如下所示。 作为一个高级SAS程序,它不会停止给予截距值作为输出。
Bland-Altman分析是验证设计用于测量相同参数的两种方法之间的一致性或不一致程度的过程。 方法之间的高相关性表明在数据分析中选择了足够好的样品。 在SAS中,我们通过计算变量值的平均值,上限和下限来创建一个Bland-Altman图。 然后我们使用PROC SGPLOT创建Bland-Altman图。
在SAS中应用PROC SGPLOT的基本语法是:
PROC SGPLOT DATA = dataset;SCATTER X=variable Y=Variable;REFLINE value;
以下是使用的参数的描述:
在下面的例子中,我们取两个名为new和old的方法生成的两个实验的结果。 我们计算变量值的差异以及相同观察值的变量的平均值。 我们还计算要在计算的上限和下限中使用的标准偏差值。
结果显示Bland-Altman图为散点图。
data mydata;input new old;datalines;31 4527 1211 3736 2514 827 153 1162 4238 3520 935 5462 6748 2577 6445 5332 4216 1915 2722 98 3824 1659 25;data diffs ;set mydata ;/* calculate the difference */diff=new-old ;/* calculate the average */mean=(new+old)/2 ;run ;proc print data=diffs;run;proc sql noprint ;select mean(diff)-2*std(diff), mean(diff)+2*std(diff)into :lower, :upper from diffs ;quit;proc sgplot data=diffs ;scatter x=mean y=diff;refline 0 &upper &lower / LABEL = ("zero bias line" "95% upper limit" "95%lower limit") ;TITLE 'Bland-Altman Plot';footnote 'Accurate prediction with 10% homogeneous error'; run ;quit ;
当执行上面的代码中,我们得到以下结果:
在上述程序的增强模型中,我们得到95%的置信水平曲线拟合。
proc sgplot data=diffs ;reg x = new y = diff/clm clmtransparency= .5;needle x= new y=diff/baseline=0;refline 0 / LABEL = ('No diff line');TITLE 'Enhanced Bland-Altman Plot';footnote 'Accurate prediction with 10% homogeneous error'; run ;quit ;
当执行上面的代码中,我们得到以下结果:
卡方检验用于检验两个分类变量之间的关联。 它可以用于测试变量的依赖程度和独立性程度。 SAS使用PROC FREQ和chisq选项来确定卡方检验的结果。
在SAS中对卡方检验应用PROC FREQ的基本语法是:
PROC FREQ DATA = dataset;TABLES variables /CHISQ TESTP=(percentage values);
以下是使用的参数的描述:
在下面的示例中,我们考虑对数据集SASHELP.CARS中的变量named类型进行卡方检验。 该变量有六个级别,我们根据测试的设计为每个级别分配百分比。
proc freq data = sashelp.cars;tables type /chisq testp=(0.20 0.12 0.18 0.10 0.25 0.15);run;
当执行上面的代码中,我们得到以下结果:
我们还得到显示变量类型的偏差的条形图,如下所示。
当我们将测试应用于数据集的两个变量时,使用双向卡方检验。
在下面的例子中,我们对名为type和origin的两个变量应用卡方检验。 结果显示这两个变量的所有组合的表格形式。
proc freq data = sashelp.cars;tables type*origin /chisq ;run;
当执行上面的代码中,我们得到以下结果:
Fisher精确检验是用于确定两个分类变量之间是否存在非随机关联的统计检验。 在SAS中,这是使用PROC FREQ执行的。 我们使用Tables选项来使用经过Fisher Exact测试的两个变量。
在SAS中应用Fisher Exact测试的基本语法是:
PROC FREQ DATA = dataset ;TABLES Variable_1*Variable_2 / fisher;
以下是所使用的参数的说明:
为了应用Fisher精确检验,我们选择两个名为Test1和Test2的分类变量及其结果。我们使用PROC FREQ应用如下所示的检验。
data temp;input Test1 Test2 Result @@;datalines;1 1 3 1 2 1 2 1 1 2 2 3;proc freq; tables Test1*Test2 / fisher;run;
当执行上面的代码中,我们得到以下结果:
算术平均值是通过对数值变量的值进行求和,然后将和值与变量的数量相除而获得的值。 它也称为平均值。 在SAS算术平均值使用PROC MEANS计算。 使用这个SAS程序,我们可以找到所有变量的平均值或数据集的一些变量。 我们还可以形成组并找到特定于该组的值的变量的均值。
SAS中计算算术平均值的基本语法是:
PROC MEANS DATA = DATASET;CLASS Variables ;VAR Variables;以下是使用的参数的描述:
数据集中每个数字变量的平均值通过使用PROC仅提供数据集名称而不使用任何变量来计算。
在下面的示例中,我们找到名为CARS的SAS数据集中所有数字变量的平均值。 我们将小数位后的最大位数指定为2,并找出这些变量的总和。
PROC MEANS DATA = sashelp.CARS Mean SUM MAXDEC=2;RUN;
我们可以通过在var选项中提供它们的名字来得到一些变量的平均值。
在下面,我们计算三个变量的平均值。
PROC MEANS DATA = sashelp.CARS mean SUM MAXDEC=2 ;var horsepower invoice EngineSize;RUN;
当执行上面的代码,我们得到以下的输出:
我们可以通过使用一些其他变量将它们聚集到组来找到数字变量的平均值。
在下面的例子中,我们找到每个车型下的每种类型的可变马力的平均值。
PROC MEANS DATA = sashelp.CARS mean SUM MAXDEC=2;class make type;var horsepower;RUN;
当执行上面的代码,我们得到以下的输出:
当在多个不同条件下测量随机样品的所有成员时使用重复测量分析。 当样品存在多种不同条件时必须依次进行测量。 在这种情况下使用标准ANOVA是不合适的,因为它不能建模重复测量不同条件之间的相关性。 应该清楚重复测量多个不同条件之间的差异。 对样本进行重复测量试验,每个试验测试了在不同条件下相同样品的特点。
在SAS PROC GLM用于进行重复测量分析。
为PROC GLM在SAS的基本语法是:
PROC GLM DATA=dataset; CLASS variable; MODEL variables = group / NOUNI ; REPEATED TRIAL n;
以下是使用的参数的描述:
考虑下面的例子,其中我们有两组人进行药物效应测试。 对于所测试的四种药物类型中的每一种记录每个人的反应时间。 这里对每组人进行5次试验,以观察四种药物类型的作用之间的相关性的强度。
DATA temp; INPUT person group $ r1 r2 r3 r4;CARDS;1 A 2 1 6 52 A 5 4 11 93 A 6 14 12 104 A 2 4 5 85 A 0 5 10 96 B 9 11 16 137 B 12 4 13 148 B 15 9 13 89 B 6 8 12 510 B 5 7 11 9;RUN;PROC PRINT DATA=temp ;RUN; PROC GLM DATA=temp; CLASS group; MODEL r1-r4 = group / NOUNI ; REPEATED trial 5;RUN;
当执行上面的代码中,我们得到以下结果:
标准偏差(SD)是数据集中的数据如何变化的量度。 在数学上,它测量每个值与数据集的平均值的距离或接近程度。 接近0的标准偏差值表示数据点趋向于非常接近数据集的平均值,并且高标准偏差表示数据点在更宽的值范围上展开。
在SAS中,使用PROC MEAN以及PROC SURVEYMEANS测量SD值。
要使用proc测量SD,我们在PROC步骤中选择STD选项。 它为数据集中存在的每个数字变量输出SD值。
在SAS计算标准偏差的基本语法是:
PROC means DATA = dataset STD;
以下是所使用的参数的说明:
在下面的示例中,我们从SASHELP库中的CARS数据集创建数据集CARS1。 我们选择带有PROC平均值步骤的STD选项。
PROC SQL;create table CARS1 asSELECT make,type,invoice,horsepower,length,weight FROM SASHELP.CARSWHERE make in ('Audi','BMW');RUN;proc means data=CARS1 STD;run;
当我们执行上面的代码它提供了以下的输出:
该程序还用于测量SD以及一些先进的特征,例如测量分类变量的SD以及提供方差的估计。
使用PROC SURVEYMEANS的语法是:
PROC SURVEYMEANS options statistic-keywords ;BY variables ;CLASS variables ;VAR variables ;
以下是使用的参数的描述:
下面的示例描述了使用class选项为类变量中的每个值创建统计信息。
proc surveymeans data=CARS1 STD;class type;var type horsepower;ods output statistics=rectangle;run;proc print data=rectangle;run;
当我们执行上面的代码它提供了以下的输出:
下面的代码给出了BY选项的示例。 在其中,结果按BY选项的每个值分组。
proc surveymeans data=CARS1 STD;var horsepower;BY make;ods output statistics=rectangle;run;proc print data=rectangle;run;
当我们执行上面的代码它提供了以下的输出:
ANOVA代表方差分析。 在SAS中,它使用PROC ANOVA完成。 它执行从各种各样的实验设计的数据的分析。 在这个过程中,在被称为独立变量的分类变量识别的实验条件下测量被称为因变量的连续响应变量。 响应的变化被认为是归因于分类中的影响,其中随机误差考虑了剩余变化。
在SAS中应用PROC ANOVA的基本语法是:
PROC ANOVA dataset ;CLASS Variable;MODEL Variable1=variable2 ;MEANS ;
以下是使用的参数的描述:
让我们考虑数据集SASHELP.CARS。 在这里我们研究变量汽车类型和他们的马力之间的依赖。 因为car类型是一个带有分类值的变量,我们把它作为类变量,并在MODEL中使用这两个变量。
PROC ANOVA DATA = SASHELPS.CARS;CLASS type;MODEL horsepower = type;RUN;
当执行上面的代码中,我们得到以下结果:
我们还可以通过应用MEANS语句来扩展模型,其中我们使用土耳其的Studentized方法来比较各种类型的汽车的平均值。 汽车类型的类别列出了每个类别中马力的平均值以及一些附加值,如误差均方等。
PROC ANOVA DATA = SASHELPS.CARS;CLASS type;MODEL horsepower = type;MEANS type / tukey lines;RUN;
当执行上面的代码中,我们得到以下结果:
频率分布是示出数据集中的数据点的频率的表。 表中的每个条目包含特定组或间隔内的值的出现频率或计数,并且以这种方式,表概括了样本中的值的分布。
SAS提供了一个称为PROC FREQ的过程来计算数据集中数据点的频率分布。
SAS中计算频率分布的基本语法是:
PROC FREQ DATA = Dataset ;TABLES Variable_1 ;BY Variable_2 ;
以下是使用的参数的描述:
我们可以使用PROC FREQ确定单个变量的频率分布。 在这种情况下,结果将显示变量的每个值的频率。 结果还显示百分比分布,累积频率和累积百分比。
在下面的例子中,我们找到名为CARS1的数据集的变量马力的频率分布,该数据集是从库SASHELP.CARS创建的。 我们可以看到结果分为两类结果。 一个为汽车的每一个。
PROC SQL;create table CARS1 asSELECT make,model,type,invoice,horsepower,length,weight FROM SASHELP.CARSWHERE make in ('Audi','BMW');RUN;proc FREQ data=CARS1 ;tables horsepower; by make;run;
当执行上面的代码中,我们得到以下结果:
我们可以找到多个变量的频率分布,将它们分组成所有可能的组合。
在下面的例子中,我们计算按汽车类型分组的汽车制造的频率分布,以及按每种制造分组的每种类型汽车的频率分布。
proc FREQ data=CARS1 ;tables make type; run;
当执行上面的代码中,我们得到以下结果:
使用权重选项,我们可以计算用变量的权重偏置的频率分布。 这里,变量的值被取为观察值的数量,而不是值的计数。
在下面的例子中,我们计算变量make和type的频率分布,分配给马力的权重。
proc FREQ data=CARS1 ;tables make type; weight horsepower;run;
当执行上面的代码中,我们得到以下结果:
假设检验是使用统计学来确定给定假设为真的概率。 假设检验的通常过程包括如下所示的四个步骤。
制定零假设H0(通常,观察是纯偶然的结果)和替代假设H1(通常,观察显示真实效应与机会变化的分量组合)。
识别可用于评估零假设的真实性的检验统计量。
计算P值,其是假设当无效假设为真时测试统计量至少与所观察到的统计量一样有效的概率。 P值越小,证据相对于零假设越强。
将p值与可接受的显着性值α(有时称为α值)进行比较。 如果p <=α,观察到的效果是统计学显着的,则排除零假设,并且替代假设是有效的。
SAS编程语言具有执行各种类型的假设测试的特征,如下所示。
测试 | 描述 | SAS PROC |
---|---|---|
T-Test | 使用t检验来测试一个变量的平均值是否显着不同于假设值。 我们还确定两个独立组的平均值是否显着不同,以及对于依赖或配对组的平均值是否显着不同。 | PROC TTEST |
ANOVA | 当有一个独立的分类变量时,它也用于比较均值。 当测试时,我们想要使用单因素方差分析以查看区间因变量的均值是否根据独立的分类变量而不同。 | PROC ANOVA |
Chi-Square | 我们使用卡方拟合优度来评估分类变量的频率是否可能由于偶然发生。 如果分类变量的比例是假设值,则需要使用卡方检验。 | PROC FREQ |
Linear Regression | 当想要测试变量预测另一个变量有效性时,使用简单的线性回归。 多元线性回归允许测试多个变量如何预测感兴趣的变量。 当使用多元线性回归时,我们另外假设预测变量是独立的。 | PROC REG |
交叉制表涉及使用两个或更多变量的所有可能组合来产生也称为偶然表的交叉表。 在SAS中,它使用PROC FREQ以及TABLES选项创建。 例如 - 如果我们需要每个车型类别中每个车型的每个车型的频率,那么我们需要使用PROC FREQ的TABLES选项。
在SAS中应用交叉表的基本语法是:
PROC FREQ DATA = dataset;TABLES variable_1*Variable_2;
以下是使用的参数的描述:
考虑到如下所示的从SASHELP.CARS创建的数据集car1中查找每种汽车品牌下可用的汽车类型的情况。 在这种情况下,我们需要单个频率值以及跨越类型的频率值的和。 我们可以观察到结果显示跨行和列的值。
PROC SQL;create table CARS1 asSELECT make,type,invoice,horsepower,length,weight FROM SASHELP.CARSWHERE make in ('Audi','BMW');RUN;proc FREQ data=CARS1 ;tables make*type; run;
当执行上面的代码中,我们得到以下结果:
当我们有三个变量时,我们可以对其中的两个进行分组,并用第三个变量交叉列表这两个变量。 所以在结果中我们有两个交叉表。
在下面的例子中,我们找到每种类型的汽车和每种车型的车型相对于汽车的频率。 另外,我们使用nocol和norow选项来避免和和百分比值。
proc FREQ data=CARS2 ;tables make * (type model) / nocol norow nopercent; run;
当执行上面的代码中,我们得到以下结果:
对于4个变量,配对组合的数量增加到4.来自组1的每个变量与组2的每个变量配对。
在下面的例子中,我们找到每个车型和每个车型的汽车长度的频率。 类似地,每个制造和每个模型的马力频率。
proc FREQ data=CARS2 ;tables (make model) * (length horsepower) / nocol norow nopercent; run;
当执行上面的代码中,我们得到以下结果:
进行T检验以通过比较它们的均值和平均差异来计算一个样本或两个独立样本的置信限度。 名为PROC TTEST的SAS过程用于对单个变量和一对变量执行t个测试。
在SAS应用PROC TTEST的基本语法是:
PROC TTEST DATA = dataset;VAR variable;CLASS Variable;PAIRED Variable_1 * Variable_2;
以下是使用的参数的描述:
下面我们看到一个样本t检验,其中找到具有95%置信限的可变马力的t检验估计。
PROC SQL;create table CARS1 asSELECT make,type,invoice,horsepower,length,weight FROM SASHELP.CARSWHERE make in ('Audi','BMW');RUN;proc ttest data=cars1 alpha=0.05 h0=0; var horsepower; run;
当执行上面的代码中,我们得到以下结果:
进行配对T检验以测试两个因变量是否在统计学上彼此不同。
由于汽车的长度和重量将取决于彼此,我们应用配对T测试如下所示。
proc ttest data=cars1 ; paired weight*length; run;
当执行上面的代码中,我们得到以下结果:
该t检验设计用于比较两组之间相同变量的平均值。
在我们的例子中,我们比较了两种不同车型(“Audi”和“BMW”)之间的可变马力的平均值。
proc ttest data=cars1 sides=2 alpha=0.05 h0=0; title "Two sample t-test example"; class make; var horsepower; run;
当执行上面的代码中,我们得到以下结果:
相关性分析处理变量之间的关系。 相关系数是两个变量之间的线性关联的度量。相关系数的值总是在-1和+1之间。 SAS提供过程PROC CORR以找到数据集中的一对变量之间的相关系数。
在SAS中应用PROC CORR的基本语法是:
PROC CORR DATA = dataset options;VAR variable;
以下是使用的参数的描述:
数据集中可用的一对变量之间的相关系数可以通过在VAR语句中使用它们的名称来获得。 在下面的例子中,我们使用数据集CARS1并得到显示马力和重量之间的相关系数的结果。
PROC SQL;create table CARS1 asSELECT invoice,horsepower,length,weight FROM SASHELP.CARSWHERE make in ('Audi','BMW');RUN;proc corr data=cars1 ;VAR horsepower weight ;BY make;run;
当执行上面的代码中,我们得到以下结果:
通过简单地应用具有数据集名称的过程,可以获得数据集中可用的所有变量之间的相关系数。
在下面的例子中,我们使用数据集CARS1并获得显示每对变量之间的相关系数的结果。
proc corr data=cars1 ;run;
当执行上面的代码中,我们得到以下结果:
我们可以通过在PROC语句中选择绘制矩阵的选项来获得变量之间的散点图矩阵。
在下面的例子中,我们得到马力和重量之间的矩阵。
proc corr data=cars1 plots=matrix ;VAR horsepower weight ;run;
当执行上面的代码中,我们得到以下结果:
SAS是业务分析领域的领导者。 通过创新的分析,它迎合商业智能和数据管理软件和服务。 SAS将数据转换为洞察力,可以为业务提供一个全新的视角。
亲爱的读者,以下是关于SAS使用与设计时的相关问题,你在平时的编程操作过程中可能会遇到以下的问题。通过广大用户的经验反馈,对以下的常见问题进行了对应的解答,
更多的问题欢迎广大用户的反馈,我们将后继进一步的进行解答。
DO WHILE表达式在DO循环的顶部评估。 如果表达式是第一次被评估,那么DO循环永远不会执行。 而DO UNTIL至少执行一次。
字符,数字
通过使用MAXDEC =选项
两个过程之间的区别是默认情况下PROC MEANS生成报告。 相反,要在PROC SUMMARY中生成报表,必须在PROC SUMMARY语句中包含一个PRINT选项。
如何指定要由FREQ过程处理的变量?
通过使用TABLES语句。
在输入语句中双尾@@的目的?
双尾标记(@@)指示SAS而不是前进到新记录,保存当前输入记录以执行下一个INPUT语句。
使用DROP,KEEP语句和数据集选项。
它产生MIN,MAX,MEAN和STD DEV的默认统计。
PDV是存储器中的逻辑区域。创建PDV之后创建输入缓冲器。 SAS在内存的PDV区域中构建数据集
它也可以用于写入输出而不创建数据集。
通过使用带有NODUPKEY和NODUP选项的PROC SORT。
NODUPKEY选项删除重复的观察,其中重复在BY语句中列出的变量的值,而NODUP选项删除重复的观察,其中所有变量中的值重复(相同的观察)
在PROC SORT代码中使用DESCENDING关键字。
通过使用PUT函数创建不同命名的变量。
通过使用INPUT函数创建不同命名的变量。
SET连接数据集,其中MERGE与数据集的观测值匹配
SYMPUT将数据集中的值放入宏变量中,SYMGET从宏变量获取值到数据集。
INTNX函数按给定的间隔提前一个日期,时间或日期时间值,并返回日期,时间或日期时间值
RETAIN语句告诉SAS在从DATA步骤的当前迭代到下一步时,不要将变量设置为缺失。 相反,SAS保留这些值。
%EVAL不能使用具有浮点值的操作数执行算术计算。 它是%SYSEVALF函数出现的时候。
它执行简单和多重回归,方差分析(ANOVAL),协方差分析,多变量方差分析和重复测量方差分析。
SAS INFORMATS用于从称为平面文件ASCII文件,文本文件或顺序文件的外部文件读取或输入数据。 信息将告诉SAS如何将数据读入SAS变量。
扫描(参数,n,分隔符)
扫描,Substr,修剪,Catx,索引,tranwrd,查找,总和。
TRANWRD函数替换或删除字符串中所有出现的字符模式。
INFILE语句用于标识外部文件,而INPUT语句用于描述变量。
当在INFILE语句上使用MISSOVER选项时,INPUT语句在读取短行时不会跳转到下一行。 相反,MISSOVER将变量设置为missing
使用FIRSTOBS =和OBS =声明。
SUM函数返回非缺失参数的总和,而“+”运算符在缺少任何参数时返回缺失值。
SUBSTR函数用于从字符变量中提取子字符串。
ceil函数返回大于/等于参数的最小整数,而floor返回小于/等于参数的最大整数。
SCAN提取由定界符标记的值内的字。 SUBSTR通过说明特定位置来提取值的一部分。 当我们知道从字符值中提取的子字符串的确切位置时,最好使用它。
使用PROC SQL与COUNT(DISTINCT variable_name)来确定列的唯一值的数量。
有迹象表明,可用于调试SAS宏一些系统选项:MPRINT,MLOGIC,SYMBOLGEN
使用PROC PRINTTO
数据步骤MERGE在多对多关系的情况下不创建笛卡尔积。 而Proc SQL生成笛卡儿乘积。
2字节和1字节。
程序是具有特定目的的子例程,数据步骤被设计为读入和操纵数据。
PUT(格式化)语句。
where语句
输入函数 - 字符到数字转换 - 输入(源,信息)和put函数 - 数字到字符转换输入(源,格式)
不,它必须是字符数据类型。
观测的数量仅受计算机处理和存储它们的能力的限制。
通过使用MAXDEC =选项
BY处理要求您的数据已按照BY变量的顺序排序或索引。
通过使用TABLES语句。
五
proc意味着给出解释统计量。 默认情况下,它会在输出窗口中给出输出。但proc摘要不会给出输出为default.we需要给出一个选项打印,然后只有它将给出输出。
在数据语句中的“/”后使用Debug子句。
使用MISSOVER关键字。
SAS是一款统计分析软件 。它于1960年由SAS软件研究所创建。从1960年1月1日,SAS用于数据管理,商业智能,预测分析,描述性和规范性分析等。从那时起,许多新的统计程序和组件在软件中进行了介绍。
通过引入JMP(跳转)的统计SAS利用了这是由Macintosh推出的图形用户界面的优势。跳转基本上是用于像六西格玛,设计,质量控制,工程和科学分析的应用程序。
SAS是跨平台的,这意味着你可以在任何操作系统Linux或Windows上运行SAS。 SAS是SAS程序员使用了SAS数据集的操作的若干序列进行的数据分析报告。
多年来,SAS公司增加了大量的解决方案和产品组合。它拥有数据治理,数据质量,大数据分析,文本挖掘,欺诈管理,健康科学等解决方案,我们可以放心地假设情景运用SAS解决方案服务每一个业务领域。
如果有需要,您可以访问SAS组件产品清单。
主要运用于大型数据集。随着SAS软件的帮助下,你可以对类似数据的各种操作:
SAS拥有200多个组件。
SN | SAS组件和它们的用法 |
---|---|
1 | SAS基地 这是一个核心组成部分,其中包含的数据管理设施和编程语言进行数据分析。它也是最广泛使用的。 |
2 | SAS / GRAPH 创建图表,演示更好地了解和展示结果以适当的格式。 |
3 | SAS / STAT 与方差分析,回归,多变量分析,生存分析和心理分析,混合模型分析进行统计分析。 |
4 | SAS / OR 行动调查。 |
五 | SAS / ETS 计量经济学和时间序列分析。 |
6 | SAS / IML CInteractive矩阵语言。 |
7 | SAS / AF 应用设施。 |
8 | SAS / QC 质量控制。 |
9 | SAS / INSIGHT 数据挖掘。 |
10 | SAS / PH 临床试验分析。 |
11 | SAS / Enterprise Miner中 数据挖掘。 |
通常组织及培训机构使用Window SAS。一些组织使用Linux,但没有图形用户界面,所以你必须为每个查询编写代码。但在Window SAS也有很多可用的实用工具,它可以对程序员起到非常多的帮助,这也减少了编写代码以及时间。
Window SAS由5个部分组成。
SN | Windows SAS和它们的用法 |
---|---|
1 | 日志窗口 日志窗口就像是一个执行窗口,我们可以检查SAS程序的执行。在这个窗口中,我们可以检查错误也。运行该程序后,检查每次日志窗口是非常重要的。这样我们就可以了解程序执行结果是否正确。 |
2 | 编辑器窗口 编辑器窗口是SAS的一部分,我们写的所有代码。它像一个记事本。 。 |
3 | 输出窗口 输出窗口是结果窗口,在这里我们可以看到我们的节目的输出。 |
4 | 结果窗口 它像一个索引到所有输出。我们在SAS的一次会议已经运行的所有程序都列在那里,你可以通过点击输出结果打开输出。但是,这些都在SAS的一次会议只提到。如果我们关闭软件,然后打开它,然后在结果窗口将是空的。 |
五 | 浏览窗口 这里列出的所有库。您还可以浏览您的系统SAS从这里支持的文件。 |
SAS存储于库中。你可以创建一个库并将所有类似的计划保存在库中的。 SAS为您提供的设施,以创建多个库。 SAS逻辑库只有8个字符。
SAS有两种类型的库:
SN | Windows SAS和它们的用法 |
---|---|
1 | 临时库 这是SAS的默认库。所有这一切,如果我们创建的程序不选择其他库将默认存储于临时库。您可以检查在浏览窗口这部作品库。如果您创建一个SAS程序和任何永久性的图书馆,如果你在关闭或者重启SAS前没有将该程序存储于一个永久库,程序将会丢失。因为程序只能在库中被运行。 |
2 | 永久库 这是SAS的永久库。我们可以通过使用SAS实用程序或通过在编辑器窗口编写代码创建一个新的SAS库。这些库被命名为永久性的,如果我们创建一个SAS永久库,存储在库中的程序将可以被永久的使用。 |
将SAS编程首先需要创建/读取数据集到存储器,然后做该数据的分析。我们需要了解在其中一个程序被写入实现这一目标的流程。
下图显示了按给定顺序写入以创建SAS程序的步骤。
每个SAS程序必须具有所有这些步骤才能完成读取输入数据,分析数据和给出分析输出。 此外,每个步骤结束时的RUN语句都需要完成该步骤的执行。
此步骤涉及将所需数据集加载到SAS存储器中并识别数据集的变量(也称为列)。 它还捕获记录(也称为观察或主体)。 DATA语句的语法如下。
DATA data_set_name; #Name the data set.INPUT var1,var2,var3; #Define the variables in this data set.NEW_VAR; #Create new variables.LABEL; #Assign labels to variables.DATALINES; #Enter the data.RUN;
以下示例显示了命名数据集,定义变量,创建新变量和输入数据的简单情况。 这里字符串变量在结尾有一个$,数字值没有它。
DATA TEMP;INPUT ID $ NAME $ SALARY DEPARTMENT $;comm = SALARY*0.25;LABEL ID = 'Employee ID' comm = 'COMMISION';DATALINES;1 Rick 623.3 IT2 Dan 515.2 Operations3 Michelle 611 IT4 Ryan 729 HR5 Gary 843.25 Finance6 Nina 578 IT7 Simon 632.8 Operations8 Guru 722.5 Finance;RUN;
该步骤包括调用的SAS内置程序来分析数据。
PROC procedure_name options; #The name of the proc.RUN;
以下示例显示使用MEANS过程打印数据集中数值变量的平均值。
PROC MEANS;RUN;
可以使用条件输出语句显示数据集中的数据。
PROC PRINT DATA = data_set;OPTIONS;RUN;
下面的示例显示在输出中使用where子句从数据集中只产生少数记录。
PROC PRINT DATA=TEMP;WHERE SALARY > 700;RUN;
下面是每个上述步骤的完整代码。
像任何其他编程语言中,SAS语言都有其自己的语法规则来创建SAS程序。任何SAS方案的三个组成部分 - 声明,变量和和数据集遵循以下语法规则。
SAS中的变量表示SAS数据集中的一列。 变量名遵循以下规则。
# Valid Variable NamesREVENUE_YEARMaxVal_Length# Invalid variable NamesMiles Per Liter #contains Space.RainfFall% # contains special character other than underscore.90_high # Starts with a number.
DATA语句标记创建新的SAS数据集。 创建DATA集的规则如下。
# Temporary data sets.DATA TempData;DATA abc;DATA newdat;# Permanent data sets.DATA LIBRARY1.DATA1DATA MYLIB.newdat;
SAS程序,数据文件和程序的结果在Windows中以各种扩展名保存。
SAS代码中的注释以两种方式指定。 以下是这两种格式。
*消息形式的注释; 不能在其中包含分号或不匹配的引号。 此外,不应该有任何参考任何宏语句在这样的注释。 它可以跨越多行并且可以是任何长度..以下是单行注释示例:
* This is comment ;
以下是一个多行注释的例子:
* This is first line of the comment* This is second line of the comment;
/ * message * /形式的注释更频繁地使用,并且不能嵌套。 但它可以跨越多个线并且可以是任何长度。 以下是单行评论示例:
/* This is comment */
以下是一个多行注释的例子:
/* This is first line of the comment* This is second line of the comment */
SAS程序可用于分析的数据称为SAS数据集。 它是使用DATA步骤创建的。 SAS可以读取各种文件作为其数据源,如CSV,Excel,Access,SPSS和原始数据。 它还有许多内置的数据源可供使用。 如果SAS程序使用数据集,则数据集称为临时数据集,然后在会话运行后丢弃。 但是如果它永久存储以备将来使用,那么它被称为永久数据集。 所有永久数据集都存储在特定库下。 SAS数据集以行和列的形式存储,也称为SAS数据表。 下面我们看到内置的永久数据集的示例,以及外部源的红色。
这些数据集已在已安装的SAS软件中提供。 它们可以被探索并用于形成用于数据分析的样本表达式。 要探索这些数据集,请转到库 - >我的库 - > SASHELP。 在展开时,我们可以看到所有内置数据集的名称列表。
让我们向下滚动以找到名为CARS的数据集。 双击此数据集将在右侧窗格中打开它,我们可以进一步探索它。 我们也可以通过使用右窗格下的最大化视图按钮来最小化左窗格。
我们可以使用底部的滚动条向右滚动,以浏览表中的所有列及其值。
我们可以使用SAS Studio中提供的导入功能将我们自己的文件导出为数据集。 但是这些文件必须在SAS服务器文件夹中可用。 因此,我们必须使用服务器文件和文件夹下的上传选项将源数据文件上传到SAS文件夹。
接下来,我们通过导入它在SAS程序中使用上述文件。 为此,我们使用选项Tasks - > Utilities - > Import data,如下所示。 双击导入数据按钮,打开右侧的窗口,选择数据集的文件。
下一步单击右窗格中导入数据程序下的选择文件按钮。 以下是可以导入的文件类型的列表。
我们选择存储在本地系统中的“employee.txt”文件,并获取导入的文件,如下所示。
我们可以通过运行使用“运行”选项生成的默认导入代码来查看导入的数据
我们可以使用与上述相同的方法导入任何其他文件类型,并在各种SAS程序中使用它。
一般来说,SAS中的变量表示它正在分析的数据表的列名。 但它也可以用于其他目的,如在编程循环中将其用作计数器。 在本章中,我们将看到使用SAS变量作为SAS数据集的列名。
SAS有如下三种变量类型:
这是默认变量类型。 这些变量用于数学表达式。
INPUT VAR1 VAR2 VAR3; #Define numeric variables in the data set.
在上面的语法中,INPUT语句显示数字变量的声明。
INPUT ID SALARY COMM_PERCENT;
字符变量用于不在数学表达式中使用的值。 它们被视为文本或字符串。 变量通过在变量名称的末尾添加一个带有空格的$ sing来变为字符变量。
INPUT VAR1 $ VAR2 $ VAR3 $; #Define character variables in the data set.
在上面的语法中,INPUT语句显示字符变量的声明。
INPUT FNAME $ LNAME $ ADDRESS $;
这些变量仅作为日期处理,它们需要采用有效的日期格式。 变量通过添加在变量名称末尾带有空格的日期格式变为日期变量。
INPUT VAR1 DATE11. VAR2 MMDDYY10. ; #Define date variables in the data set.
在上面的语法中,INPUT语句显示日期变量的声明。
INPUT DOB DATE11. START_DATE MMDDYY10. ;
上述变量用于SAS程序,如下面的示例所示。
以下代码显示了如何在SAS程序中声明和使用三种类型的变量
DATA TEMP;INPUT ID NAME $ SALARY DEPT $ DOJ DATE9. ;FORMAT DOJ DATE9. ;DATALINES;1 Rick 623.3 IT 02APR20012 Dan 515.2 OPS 11JUL20123 Michelle 611 IT 21OCT20004 Ryan 729 HR 30JUL20125 Gary 843.25 FIN 06AUG20006 Tusar 578 IT 01MAR20097 Pranab 632.8 OPS 16AUG19988 Rasmi 722.5 FIN 13SEP2014;PROC PRINT DATA=TEMP;RUN;
在上面的例子中,所有的字符变量都声明后跟一个$符号,日期变量声明后跟日期格式。 上述程序的输出如下。
这些变量在分析数据时非常有用。 它们用于应用统计分析的表达式中。 让我们看一个分析名为CARS的内置数据集的示例,它位于Libraries - > My Libraries - > SASHELP下。 双击它来探索变量及其数据类型。
接下来,我们可以使用SAS studio中的任务选项生成其中一些变量的汇总统计。 转到任务 - >统计 - >摘要统计,并双击它打开窗口如下所示。 选择数据集SASHELP.CARS并选择分析变量下的三个变量 - MPG_CITY,MPG_Highway和Weight。 按住Ctrl键,同时单击选择变量。 单击运行。
在上述步骤后单击结果选项卡。 它显示了所选择的三个变量的统计摘要。 最后一列表示在分析中使用的观察(记录)的数量。
SAS中的字符串是用一对单引号括起来的值。 还通过在变量声明的末尾添加一个空格和$ sign来声明字符串变量。 SAS具有许多强大的功能来分析和操作字符串。
我们可以声明字符串变量及其值,如下所示。 在下面的代码中,我们声明长度为6和5的两个字符变量。LENGTH关键字用于声明变量而不创建多个观察。
data string_examples; LENGTH string1 $ 6 String2 $ 5; /*String variables of length 6 and 5 */ String1 = 'Hello'; String2 = 'World'; Joined_strings = String1 ||String2 ; run;proc print data = string_examples noobs;run;
运行上面的代码,我们得到显示变量名称及其值的输出。
以下是经常使用的一些SAS函数的示例。
此函数使用开始和结束位置提取子字符串。 如果没有提到结束位置,它提取所有字符直到字符串结束。
SUBSTRN('stringval',p1,p2)
以下是所使用的参数的描述:
data string_examples; LENGTH string1 $ 6 ; String1 = 'Hello'; sub_string1 = substrn(String1,2,4) ; /*Extract from position 2 to 4 */ sub_string2 = substrn(String1,3) ; /*Extract from position 3 onwards */run;proc print data = string_examples noobs;run;
在运行上面的代码,我们得到显示substrn函数的结果的输出。
此函数从字符串中删除尾部空格。
TRIMN('stringval')
以下是所使用的参数的描述:
data string_examples; LENGTH string1 $ 7 ; String1='Hello '; length_string1 = lengthc(String1); length_trimmed_string = lengthc(TRIMN(String1));run;proc print data = string_examples noobs;run;
运行上面的代码,我们得到显示TRIMN函数结果的输出。
SAS中的数组用于使用索引值存储和检索一系列值。 索引表示保留存储区中的位置。
在SAS中,使用以下语法声明数组:
ARRAY ARRAY-NAME(SUBSCRIPT) ($) VARIABLE-LIST ARRAY-VALUES
在上面的语法中:
数组可以使用上述语法以多种方式声明。 下面是示例。
# Declare an array of length 5 named AGE with values.ARRAY AGE[5] (12 18 5 62 44);# Declare an array of length 8 named COUNTRIES with values starting at index 0.ARRAY COUNTRIES(0:8) A B C D E F G H I;# Declare an array of length 5 named QUESTS which contain character values.ARRAY QUESTS(1:5) $ Q1-Q5;# Declare an array of required length as per the number of values supplied.ARRAY ANSWER(*) A1-A100;
存储在数组中的值可以通过使用如下所示的打印过程访问。 在使用上述方法之一声明之后,使用DATALINES语句提供数据。
DATA array_example;INPUT a1 $ a2 $ a3 $ a4 $ a5 $;ARRAY colours(5) $ a1-a5;mix = a1||'+'||a2;DATALINES;yello pink orange green blue;RUN;PROC PRINT DATA=array_example;RUN;
当我们执行上面的代码,它会产生以下结果:
当分析数组形式的数组以对数组的整个行执行计算时,使用OF运算符。 在下面的示例中,我们应用每行中的值的和和均值。
DATA array_example_OF; INPUT A1 A2 A3 A4; ARRAY A(4) A1-A4; A_SUM=SUM(OF A(*)); A_MEAN=MEAN(OF A(*)); A_MIN=MIN(OF A(*)); DATALINES; 21 4 52 11 96 25 42 6 ; RUN; PROC PRINT DATA=array_example_OF; RUN;
当我们执行上面的代码,它会产生以下结果:
也可以使用IN运算符访问数组中的值,该运算符检查数组行中是否存在值。 在下面的例子中,我们检查数据中颜色“黄色”的可用性。 此值区分大小写。
DATA array_in_example; INPUT A1 $ A2 $ A3 $ A4 $; ARRAY COLOURS(4) A1-A4; IF 'yellow' IN COLOURS THEN available='Yes';ELSE available='No'; DATALINES; Orange pink violet yellow ; RUN; PROC PRINT DATA=array_in_example; RUN;
当我们执行上面的代码,它会产生以下结果:
SAS可以处理各种数字数据格式。 它在变量名的末尾使用这些格式,以向数据应用特定的数字格式。 SAS使用两种数字格式。 一个用于读取数字数据的特定格式,称为informat,另一个用于显示称为输出格式的特定格式的数字数据。
数字信息的语法是:
Varname Formatnamew.d
以下是使用的参数的描述:
下面是用于将数据读入SAS的格式列表。
格式 | 使用 |
---|---|
n. | 最大“n”个没有小数点的列数。 |
n.p | 最多“n”个带“p”小数点的列数。 |
COMMAn.p | COMMAn.p最大“n”个具有“p”小数位的列,删除任何逗号或美元符号。 |
类似于在读取数据时应用格式,以下是用于在SAS程序的输出中显示数据的格式的列表。
n. | 写入最大“n”位数,不带小数点。 |
n.p | 写入最大“n.p”个带“p”小数点的列数。 |
DOLLARn.p | 使用p个小数位数写入最大“n”列,前面带有美元符号,在第千个位置使用逗号。 |
请注意:
下面的例子说明了上述情况。
DATA MYDATA1;input x 6.; /*数据的最大宽度*/format x 6.3;datalines;872293.2.112215.116PROC PRINT DATA = MYDATA1;RUN;DATA MYDATA2;input x 6.; /*数据的最大宽度*/format x 5.2;datalines;872293.2.112215.116PROC PRINT DATA=MYDATA2;RUN;DATA MYDATA3;input x 6.; /*数据的最大宽度*/format x DOLLAR10.2;datalines;872293.2.112215.116PROC PRINT DATA=MYDATA3;RUN;
当我们执行上面的代码,它会产生以下结果:
# MYDATA1.Obs x1 8722.0 # 显示6个十进制后附加零的列。2 93.200 # 显示6个小数后附加零的列。3 0.112 # 十进制之前没有整数,因此在十进制后显示3个可用数字。4 15.116 # 显示6个十进制后有3位可用数字的列。# MYDATA2Obs x1 8722 # 显示5列。 只有4个可用。2 93.20 # 显示5个十进制后附加零的列。3 0.11 # 显示5个小数点后2位的列。4 15.12 # 显示5个小数点后2位的列。# MYDATA3Obs x1 $8,722.00 # 显示10列带有$符号,逗号在第千个位置,零在十进制后附加。2 $93.20 # 只有两个整数在十进制之前可用,一个可用在十进制之后。3 $0.11 # 十进制之前没有整数,十进制后有两个可用。4 $15.12 # 只有两个整数在十进制之前可用,两个可用在十进制之后。
SAS中的运算符是在数学,逻辑或比较表达式中使用的符号。 这些符号内置到SAS语言中,并且许多运算符可以组合在单个表达式中以给出最终输出。
以下是SAS运算符类别的列表。
我们逐一观察。 运算符总是与作为由SAS程序分析的数据的一部分的变量一起使用。
下表介绍了算术运算符的详细信息。 让我们假设V1和V2的值分别为8和4。
操作者 | 描述 | 例 |
---|---|---|
+ | 加成 | V1 + V2 = 12 |
- | 减法 | V1-V2 = 4 |
* | 乘法 | V1 *V2 =32 |
/ | 除 | V1 / V2 = 2 |
** | 幂 | V1 **V2 = 4096 |
DATA MYDATA1;input @1 COL1 4.2 @7 COL2 3.1; Add_result = COL1+COL2;Sub_result = COL1-COL2;Mult_result = COL1*COL2;Div_result = COL1/COL2;Expo_result = COL1**COL2;datalines;11.21 5.33.11 11;PROC PRINT DATA=MYDATA1;RUN;
在运行上面的代码,我们可以得到下面的输出。
下表描述了逻辑运算符的详细信息。 这些运算符可以计算表达式的真值。 因此,逻辑运算符的结果总是1或0.我们假设两个数据变量V1和V2的值分别为8和4。
操作者 | 描述 | 例 |
---|---|---|
& | AND运算符。 如果两个数据值都为真,则结果为1,否则为0。 | (V1< 2 & V2> 3)的真值为0 (V1< 2 & V2< 3)的真值为0 (V1> 2 & V2< 3)的真值为0 (V1 > 2 & V2> 3)的真值为1 |
| | OR运算符。 如果任何一个数据值求值为真,则结果为1,否则为0。 | (V1> 9 | V2> 3)的真值为1 (V1> 9 | V2< 3)的真值为0 (V1< 9 | V2> 3)的真值为1 (V1< 9 | V2< 3)的真值为1 |
〜 | NOT运算符。 NOT运算符以值为FALSE或缺少值的表达式形式的结果为1,否则为0。 | (V1> 3)的真值为1。 ~(V1> 3)的真值为0。 |
DATA MYDATA1;input @1 COL1 5.2 @7 COL2 4.1; and_=(COL1 > 10 & COL2 > 5 );or_ = (COL1 > 12 | COL2 > 15 );not_ = ~( COL2 > 7 );datalines;11.21 5.33.11 11.4;PROC PRINT DATA=MYDATA1;RUN;
在运行上面的代码,我们可以得到下面的输出。
下表描述了比较运算符的详细信息。 这些运算符比较变量的值,结果是真值,1表示TRUE,0表示False。 让我们假设分别具有值8和4的两个数据变量V1和V2。
操作者 | 描述 | 例 |
---|---|---|
= | EQUAL运算符。 如果两个数据值相等,则结果为1,否则为0。 | (V1 = 8)给出1。 |
^ = | NOT EQUAL运算符。 如果两个数据值不相等,则结果为1,否则为0。 | (V1 ^ = V2)给出1。 |
< | LESS THAN运算符。 | (V2 <V2)提供1。 |
<= | 小于或等于运算符。 | (V2 <= 4)给出1。 |
> | 大于运算符。 | (V2> V1)给出1。 |
> = | 大于或等于运算符。 | (V2> = V1)给出0。 |
在 | IN运算符。 如果变量的值等于给定值列表中的任何一个值,则返回1 else否则返回0。 | V1在(5,7,9,8)给出1。 |
DATA MYDATA1;input @1 COL1 5.2 @7 COL2 4.1; EQ_ = (COL1 = 11.21);NEQ_= (COL1 ^= 11.21);GT_ = (COL2 => 8);LT_ = (COL2 <= 12);IN_ = COL2 in( 6.2,5.3,12 );datalines;11.21 5.33.11 11.4;PROC PRINT DATA=MYDATA1;RUN;
在运行上面的代码,我们可以得到下面的输出。
下表描述了最小/最大运算符的详细信息。 这些运算符比较一行中变量的值,并返回行中的值列表中的最小值或最大值。
操作者 | 描述 | 例 |
---|---|---|
MIN | MIN运算符。 它从行中的值列表返回最小值。 | MIN(45.2,11.6,15.41)给出了11.6 |
MAX | MAX操作符。 它从行中的值列表返回最大值。 | MAX(45.2,11.6,15.41)给出了45.2 |
DATA MYDATA1;input @1 COL1 5.2 @7 COL2 4.1 @12 COL3 6.3; min_ = MIN(COL1 , COL2 , COL3);max_ = MAX( COL1, COl2 , COL3);datalines;11.21 5.3 29.0123.11 11.4 18.512;PROC PRINT DATA=MYDATA1;RUN;
在运行上面的代码,我们可以得到下面的输出。
下表描述了Concatenation运算符的详细信息。 此运算符连接两个或多个字符串值。 返回单个字符值。
操作者 | 描述 | 例 |
---|---|---|
|| | 连接运算符。 它返回两个或多个值的连接。 | 'Hello'||'World' 输出 HelloWorld |
DATA MYDATA1;input COL1 $ COL2 $ COL3 $; concat_ = (COL1 || COL2 || COL3);datalines;Tutorial s pointsimple easy learning;PROC PRINT DATA=MYDATA1;RUN;
在运行上面的代码,我们可以得到下面的输出。
运算符优先级表示复杂表达式中存在的多个运算符的求值顺序。 下表描述了一组运算符中的优先顺序。
组 | 顺序 | 符号 |
---|---|---|
第一组 | 右到左 | ** + - NOT MIN MAX |
第二组 | 左到右 | * / |
第三组 | 左到右 | + - |
第四组 | 左到右 | || |
第五组 | 左到右 | <<= => => |
决策结构要求程序员指定要由程序评估或测试的一个或多个条件,以及如果条件被确定为真则要执行的一个或多个语句,相反如果条件为假则不执行。
以下是大多数编程语言中典型的决策结构的一般形式:
SAS提供以下类型的决策语句。 单击以下链接以检查其详细信息。
SN | 声明类型和说明 |
---|---|
1. | if语句。 if语句由条件组成。 如果条件为真,则提取特定数据。 |
2. | IF-THEN-ELSE语句。 if语句后跟随else语句,当布尔条件为假时执行。 |
3. | IF-THEN-ELSE-IF语句。 if语句后跟随else语句,后面再跟一对IF-THEN语句。 |
4. | IF-THEN-DELETE语句。 if语句包括acondition,当真正从观察值中删除特定数据时。 |
SAS具有多种内置函数,有助于分析和处理数据。 这些函数用作DATA语句的一部分。 它们将数据变量作为参数,并将结果存储到另一个变量中。 根据函数的类型,所需的参数数量可能会有所不同。 一些函数接受零参数,而另一些函数接受固定数量的变量。 以下是SAS提供的功能类型列表。
在SAS中使用函数的一般语法如下。
FUNCTIONNAME(argument1, argument2...argument)
这里的参数可以是常量,变量,表达式或另一个函数。
根据它们的使用情况,在SAS中的功能被分类为如下。
这些是用于对变量值应用一些数学计算的函数。
下面的SAS程序显示了一些重要的数学函数的使用。
data Math_functions;v1=21; v2=42; v3=13; v4=10; v5=29;/* Get Maximum value */max_val = MAX(v1,v2,v3,v4,v5);/* Get Minimum value */min_val = MIN (v1,v2,v3,v4,v5);/* Get Median value */med_val = MEDIAN (v1,v2,v3,v4,v5);/* Get a random number */rand_val = RANUNI(0);/* Get Square root of sum of the values */SR_val= SQRT(sum(v1,v2,v3,v4,v5));proc print data = Math_functions noobs;run;
当上面的代码运行时,我们得到以下输出:
这些是用于处理日期和时间值的函数。
下面的SAS程序显示了使用日期和时间的函数。
data date_functions;INPUT @1 date1 date9. @11 date2 date9.;format date1 date9. date2 date9.;/* Get the interval between the dates in years*/Years_ = INTCK('YEAR',date1,date2);/* Get the interval between the dates in months*/months_ = INTCK('MONTH',date1,date2);/* Get the week day from the date*/weekday_ = WEEKDAY(date1);/* Get Today's date in SAS date format */today_ = TODAY();/* Get current time in SAS time format */time_ = time();DATALINES;21OCT2000 16AUG199801MAR2009 11JUL2012;proc print data = date_functions noobs;run;
当运行上面的代码,我们得到以下的输出:
这些都是用于处理字符或文本值的功能。
下面的SAS程序显示了使用的字符函数。
data character_functions;/* Convert the string into lower case */lowcse_ = LOWCASE('HELLO'); /* Convert the string into upper case */upcase_ = UPCASE('hello'); /* Reverse the string */reverse_ = REVERSE('Hello'); /* Return the nth word */nth_letter_ = SCAN('Learn SAS Now',2);run;proc print data = character_functions noobs;run;
当运行上面的代码,我们得到以下的输出:
这些是用于截断数字值的功能。
下面的SAS程序说明了如何使用截断功能。
data trunc_functions;/* Nearest greatest integer */ceil_ = CEIL(11.85); /* Nearest greatest integer */floor_ = FLOOR(11.85); /* Integer portion of a number */int_ = INT(32.41); /* Round off to nearest value */round_ = ROUND(5621.78);run;proc print data = trunc_functions noobs;run;
当运行上面的代码,我们得到以下的输出:
下面的SAS程序显示了使用的辅助功能。
data misc_functions;/* Nearest greatest integer */state2=zipstate('01040'); /* Amortization calculation */payment=mort(50000, . , .10/12,30*12);proc print data = misc_functions noobs;run;
当运行上面的代码,我们得到以下的输出:
输入方法用于读取原始数据。 原始数据可以来自外部源或来自流数据。 输入语句创建一个变量,其名称将分配给每个字段。 所以你必须在输入语句中创建一个变量。 相同的变量将显示在 SAS 数据集的输出中。 以下是 SAS 中可用的不同输入方法。
每个输入方法的细节描述如下。
在此方法中,变量与数据类型一起列出。 仔细分析原始数据,以便声明的变量的顺序与数据匹配。 分隔符(通常为空格)在任何一对相邻列之间应该是一致的。 任何丢失的数据将导致输出中的问题,因为结果将是错误的。
下面的代码和输出显示了使用列表输入法。
DATA TEMP;INPUT EMPID ENAME $ DEPT $ ;DATALINES;1 Rick IT2 Dan OPS3 Tusar IT4 Pranab OPS5 Rasmi FIN;PROC PRINT DATA=TEMP;RUN;
在运行 bove 代码,我们得到以下输出。
SAS有一个强大的编程功能叫宏,它允许我们避免重复的代码段,并在需要时一次又一次地使用它们。 它还有助于在代码中创建动态变量,可以为同一代码的不同运行实例使用不同的值。 宏还可以声明为代码块,它将以类似于宏变量的方式被重复使用多次。 我们将在下面的例子中看到这两个。
这些是保存由SAS程序一次又一次使用的值的变量。 它们在SAS程序开始时声明,并在程序体中稍后调用。 它们可以是全局或局部范围。
它们称为全局宏变量,因为它们可以由SAS环境中可用的任何SAS程序访问。 通常它们是由多个程序访问的系统分配的变量。 一般的例子是系统日期。
下面是一个名为SYSDATE的SAS变量的示例,它表示系统日期。 考虑一种方案,以便在生成报告的每天的SAS报告的标题中打印系统日期。 标题将显示当前日期和日期,而不为它们编码任何值。 我们使用SASHELP库中提供的名为CARS的内置SAS数据集。
proc print data = sashelp.cars;where make = 'Audi' and type = 'Sports' ; TITLE "Sales as of &SYSDAY &SYSDATE";run;
当运行上面的代码,我们得到以下输出。
这些变量可以被SAS程序访问,在这些程序中它们被声明为程序的一部分。 它们通常用于向相同的SAS语句SL提供不同的变量,使得它们可以处理数据集的不同观察值。
局部变量使用下面的语法声明。
% LET (Macro Variable Name) = Value;
这里的值字段可以采取程序所需的任何数字,文本或日期值。 宏变量名是任何有效的SAS变量。
这些变量由SAS语句使用,并在变量名的开头附加&字符。 下面的程序得到我们所有的观察的'奥迪'和类型'体育'。 如果我们想要不同make的结果,我们需要更改变量make_name的值,而不改变程序的任何其他部分。 在带来程序的情况下,这个变量可以在任何SAS语句中被再次引用。
%LET make_name = 'Audi';%LET type_name = 'Sports';proc print data = sashelp.cars;where make = &make_name and type = &type_name ; TITLE "Sales as of &SYSDAY &SYSDATE";run;
当上面的代码运行时,我们得到与上一个程序相同的输出。 但是让我们将type_name改为'Wagon',并运行相同的程序。 我们将得到以下结果。
宏是一组SAS语句,由名称引用,并在程序中使用该名称在任何地方使用它。 它以%MACRO语句开始,以%MEND语句结束。
局部变量使用下面的语法声明。
# Creating a Macro program.%MACRO (Param1, Param2,….Paramn);Macro Statements;%MEND;# Calling a Macro program.%MacroName (Value1, Value2,…..Valuen);
以下程序在名为“show_result”的宏下对一组SAT staemnets进行解密; 此宏正由其他SAS语句调用。
%MACRO show_result(make_ , type_);proc print data = sashelp.cars;where make = "&make_" and type = "&type_" ;TITLE "Sales as of &SYSDAY &SYSDATE";run;%MEND;%show_result(BMW,SUV);
当运行上面的代码,我们得到以下输出。
SAS有许多MACRO语句,它们内置在SAS编程语言中。 它们被其他SAS程序使用,而没有明确声明它们。 常见的例子是 - 当满足一些条件时终止程序或捕获程序日志中变量的运行时值。 下面是一些例子。
此宏语句将文本或宏变量信息写入SAS日志。 在下面的例子中,变量“today”的值被写入程序日志。
data _null_;CALL SYMPUT ('today',TRIM(PUT("&sysdate"d,worddate22.)));run;%put &today;
当某个条件的计算结果为真时,执行该宏将导致当前执行的宏正常终止。 在下面的示例中,当变量“val”的值变为10时,宏终止其它连接。
%macro check_condition(val); %if &val = 10 %then %return; data p; x=34.2; run; %mend check_condition; %check_condition(11) ;
此宏定义包含一个%DO%WHILE循环,根据需要以%END语句结束。 在下面的示例中,名为test的宏采用用户输入,并使用此输入值运行DO循环。 DO循环的结束通过%end语句实现,而宏的结束通过%mend语句实现。
%macro test(finish); %let i=1; %do %while (&i <&finish); %put the value of i is &i; %let i=%eval(&i+1); %end;%mend test;%test(5)
在SAS中日期有一种特殊的计算方式,以1960年1月1日为中心点进行计算,该日期为0,下一个日期的日期为1,以此类推。该日期之前的日期则为负数-1,-2等表示。使用这种方法,SAS可以表示未来的任何日期和过去的任何日期。
当SAS从源读取数据时,它将读取的数据转换为指定日期格式的特定日期格式。 用于存储日期值的变量使用所需的正确informat来声明。 输出日期通过使用输出数据格式显示。
可以使用特定的日期信息正确读取源数据,如下所示。 信息末尾的数字表示使用信息完全读取的日期字符串的最小宽度。 较小的宽度将给出不正确的结果。 使用SAS V9,有一个通用的日期格式anydtdte15。 它可以处理任何日期输入。
输入日期 | 日期宽度 | INFORMAT |
---|---|---|
03/11/2014 | 10 | mmddyy10。 |
03/11/14 | 8 | mmddyy8。 |
December 11, 2012 | 20 | worddate20。 |
14mar2011 | 9 | date9。 |
14-mar-2011 | 11 | date11。 |
14-mar-2011 | 15 | anydtdte15。 |
下面的代码显示了不同日期格式的读取。 请注意,所有的输出值只是数字,因为我们没有对输出值应用任何格式语句。
DATA TEMP;INPUT @1 Date1 date11. @12 Date2 anydtdte15. @23 Date3 mmddyy10. ;DATALINES;02-mar-2012 3/02/2012 3/02/2012;PROC PRINT DATA=TEMP;RUN;
当执行上面的代码,我们可以得到下面的输出。
读取后的日期可以根据显示器的要求转换为其他格式。 这是使用日期类型的格式语句实现的。 它们采用与informats相同的格式。
在下面的示例中,日期以一种格式读取,但以另一种格式显示。
DATA TEMP;INPUT @1 DOJ1 mmddyy10. @12 DOJ2 mmddyy10. ;format DOJ1 date11. DOJ2 worddate20. ;DATALINES;01/12/2012 02/11/1998 ;PROC PRINT DATA=TEMP;RUN;
当执行上面的代码,我们可以得到下面的输出。
与读取数据集类似,SAS可以以不同的格式写入数据集。 它可以将数据从SAS文件写入正常文本文件。 这些文件可以由其他软件程序读取。 SAS使用PROC EXPORT写入数据集。
它是一个SAS内置过程,用于导出SAS数据集,以将数据写入不同格式的文件。
在SAS中编写过程的基本语法是:
PROC EXPORT DATA=libref.SAS data-set (SAS data-set-options)OUTFILE="filename" DBMS=identifier LABEL(REPLACE);
以下是所使用的参数的说明:
我们将使用SASHELP库中提供的名为cars的SAS数据集。 我们将其作为以空格分隔的文本文件导出,其代码如下所示。
proc export data=sashelp.cars outfile= '/folders/myfolders/sasuser.v94/TutorialsPoint/car_data.txt' dbms=dlm; delimiter=' '; run;
在执行上面的代码中我们可以看到输出为文本文件并右键单击它,看它的内容。
为了写逗号分隔的文件,我们可以使用带有值“csv”的dlm选项。 以下代码写入文件car_data.csv。
proc export data=sashelp.cars outfile= '/folders/myfolders/sasuser.v94/TutorialsPoint/car_data.csv' dbms=csv; run;
执行上面的代码,我们得到下面的输出。
为了写一个制表符分隔文件,我们可以使用带有值“tab”的dlm选项。 以下代码写入文件car_tab.txt。
proc export data=sashelp.cars outfile= '/folders/myfolders/sasuser.v94/TutorialsPoint/car_tab.txt' dbms=csv; run;
数据也可以写成HTML文件,我们将在输出交付系统章节下看到。
可以使用SET语句连接多个SAS数据集以提供单个数据集。 在连接的数据集中的观察的总数是原始数据集中的观察的数量的总和。 观察的顺序是连续的。 来自第一数据集的所有观察结果后面是来自第二数据集的所有观察结果,并依此类推。
所有组合数据集具有相同的变量,但是如果它们具有不同数量的变量,则在结果中出现所有变量,对于较小数据集具有缺失值。
SAS中SET语句的基本语法是:
SET data-set 1 data-set 2 data-set 3.....;
以下是所使用的参数的说明:
考虑在两个不同数据集中可用的组织的员工数据,一个用于IT部门,另一个用于非IT部门。 要获得所有员工的完整详细信息,我们使用如下所示的SET语句连接两个数据集。
DATA ITDEPT; INPUT empid name $ salary ; DATALINES; 1 Rick 623.3 3 Mike 611.5 6 Tusar 578.6 ; RUN; DATA NON_ITDEPT; INPUT empid name $ salary ; DATALINES; 2 Dan 515.2 4 Ryan 729.1 5 Gary 843.25 7 Pranab 632.8 8 Rasmi 722.5 RUN; DATA All_Dept; SET ITDEPT NON_ITDEPT; RUN; PROC PRINT DATA=All_Dept; RUN;
当执行上面的代码,我们可以得到下面的输出。
当我们在用于级联的数据集中有许多变化时,变量的结果可以不同,但是级联数据集中的观测值的总数总是每个数据集中的观测值的总和。 我们将在下面考虑这种变化的许多情况。
如果原始数据集中的一个具有更多数量的变量而另一个数据集,则数据集仍然被组合,但是在较小的数据集中,这些变量显示为缺失。
在下面的例子中,第一个数据集有一个名为DOJ的额外变量。 在结果中,第二个数据集的DOJ值将显示为缺失。
DATA ITDEPT; INPUT empid name $ salary DOJ date9. ; DATALINES; 1 Rick 623.3 02APR20013 Mike 611.5 21OCT20006 Tusar 578.6 01MAR2009 ; RUN; DATA NON_ITDEPT; INPUT empid name $ salary ; DATALINES; 2 Dan 515.2 4 Ryan 729.1 5 Gary 843.25 7 Pranab 632.8 8 Rasmi 722.5 RUN; DATA All_Dept; SET ITDEPT NON_ITDEPT; RUN; PROC PRINT DATA=All_Dept; RUN;
当执行上面的代码,我们可以得到下面的输出。
在这种情况下,数据集具有相同数量的变量,但变量名在它们之间不同。 在这种情况下,正态连接将产生结果集中的所有变量,并给出不同的两个变量的缺失结果。 虽然我们不能更改原始数据集中的变量名称,但我们可以在我们创建的连接数据集中应用RENAME函数。 这将产生与正常连接相同的结果,但是当然使用一个新的变量名称代替原始数据集中存在的两个不同的变量名称。
在下面的示例中,数据集ITDEPT具有变量名ename,而数据集NON_ITDEPT具有变量名empame。 但这两个变量代表相同的类型(字符)。 我们在SET语句中应用RENAME函数,如下所示。
DATA ITDEPT; INPUT empid ename $ salary ; DATALINES; 1 Rick 623.3 3 Mike 611.5 6 Tusar 578.6 ; RUN; DATA NON_ITDEPT; INPUT empid empname $ salary ; DATALINES; 2 Dan 515.2 4 Ryan 729.1 5 Gary 843.25 7 Pranab 632.8 8 Rasmi 722.5 RUN; DATA All_Dept; SET ITDEPT(RENAME =(ename=Employee) ) NON_ITDEPT(RENAME =(empname=Employee) ); RUN; PROC PRINT DATA=All_Dept; RUN;
当执行上面的代码,我们可以得到下面的输出。
如果两个数据集中的变量长度不同,则连接的数据集将具有其中一些数据对于具有较小长度的变量被截断的值。 如果第一个数据集的长度较小,就会发生这种情况。 为了解决这个问题,我们对数据集应用更高的长度,如下所示。
在下面的示例中,变量ename在第一个数据集中的长度为5,在第二个数据集中为7。 当连接时,我们应用连接数据集中的LENGTH语句将枚举长度设置为7。
DATA ITDEPT; INPUT empid 1-2 ename $ 3-7 salary 8-14 ; DATALINES; 1 Rick 623.3 3 Mike 611.5 6 Tusar 578.6 ; RUN;DATA NON_ITDEPT; INPUT empid 1-2 ename $ 3-9 salary 10-16 ; DATALINES; 2 Dan 515.2 4 Ryan 729.1 5 Gary 843.257 Pranab 632.8 8 Rasmi 722.5 RUN; DATA All_Dept; LENGTH ename $ 7 ; SET ITDEPT NON_ITDEPT ; RUN; PROC PRINT DATA=All_Dept; RUN;
当执行上面的代码,我们可以得到下面的输出。
可以基于特定的公共变量合并多个SAS数据集以给出单个数据集。 这是使用MERGE语句和BY语句完成的。 合并数据集中的观察的总数通常小于原始数据集中的观察的数量的总和。 这是因为当公共变量的值存在匹配时,变量形成两个数据集合被合并为一个记录。
下面给出了合并数据集的两个先决条件:
SAS中的MERGE和BY语句的基本语法是:
MERGE Data-Set 1 Data-Set 2BY Common Variable
以下是所使用的参数的说明:
考虑两个SAS数据集,一个包含具有名称和工资的雇员ID,另一个包含具有雇员ID和部门的雇员ID。 在这种情况下,为了获得每个员工的完整信息,我们可以合并这两个数据集。 最终数据集仍将对每个员工有一个观察值,但它将包含薪水和部门变量。
# Data set 1 ID NAME SALARY 1 Rick 623.3 2 Dan 515.2 3 Mike 611.5 4 Ryan 729.1 5 Gary 843.25 6 Tusar 578.6 7 Pranab 632.8 8 Rasmi 722.5 # Data set 2ID DEPT1 IT 2 OPS3 IT 4 HR 5 FIN 6 IT 7 OPS8 FIN # Merged data setID NAME SALARY DEPT 1 Rick 623.3 IT 2 Dan 515.2 OPS 3 Mike 611.5 IT 4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 IT 7 Pranab 632.8 OPS8 Rasmi 722.5 FIN
上述结果通过使用以下代码实现,其中在BY语句中使用公共变量(ID)。 请注意,两个数据集中的观测值已在ID列中排序。
DATA SALARY; INPUT empid name $ salary ; DATALINES; 1 Rick 623.3 2 Dan 515.2 3 Mike 611.5 4 Ryan 729.1 5 Gary 843.25 6 Tusar 578.6 7 Pranab 632.8 8 Rasmi 722.5 ;RUN; DATA DEPT; INPUT empid dEPT $ ; DATALINES; 1 IT 2 OPS3 IT 4 HR 5 FIN 6 IT 7 OPS8 FIN ;RUN; DATA All_details;MERGE SALARY DEPT;BY (empid);RUN;PROC PRINT DATA=All_details; RUN;
可能存在公共变量的一些值在数据集之间不匹配的情况。 在这种情况下,数据集仍然会合并,但在结果中给出缺失值。
ID NAME SALARY DEPT 1 Rick 623.3 IT 2 Dan 515.2 OPS 3 . . IT4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 .7 Pranab 632.8 OPS8 Rasmi 722.5 FIN
为了避免结果中的缺失值,我们可以考虑仅保留具有公共变量的匹配值的观察值。 这是通过使用IN语句实现的。 SAS程序的merge语句需要更改。
在下面的示例中,IN =值仅保留来自数据集SALARY和DEPT的值匹配的观察值。
DATA All_details;MERGE SALARY(IN=a) DEPT(IN=b);BY (empid);IF a=1 and b=1;RUN;PROC PRINT DATA=All_details; RUN;
在执行具有上述改变的部分的SAS程序时,我们得到以下输出。
1 Rick 623.3 IT 2 Dan 515.2 OPS 4 Ryan 729.1 HR 5 Gary 843.25 FIN 7 Pranab 632.8 OPS8 Rasmi 722.5 FIN
设置SAS数据集的子设置意味着通过选择较少数量的变量或较少数量的观测值或同时选择较少数量的观测值来提取数据集的一部分。 通过使用KEEP和DROP语句完成变量的子设置,使用DELETE语句完成观察的子设置。 此外,来自子设置操作的结果数据保存在可用于进一步分析的新数据集中。 子设置主要用于分析数据集的一部分而不使用那些可能与分析不相关的变量或观察的目的。
在这种方法中,我们只从整个数据集中提取很少的变量。
SAS中子设置变量的基本语法是:
KEEP var1 var2 ... ;DROP var1 var2 ... ;
以下是所使用的参数的说明:
考虑包含组织的员工详细信息的以下SAS数据集。 如果我们只想从数据集中获取Name和Department值,那么我们可以使用下面的代码。
DATA Employee; INPUT empid ename $ salary DEPT $ ; DATALINES; 1 Rick 623.3 IT 2 Dan 515.2 OPS 3 Mike 611.5 IT 4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 IT 7 Pranab 632.8 OPS8 Rasmi 722.5 FIN ;RUN;DATA OnlyDept; SET Employee; KEEP ename DEPT; RUN; PROC PRINT DATA=OnlyDept; RUN;
当上面的代码执行时,我们得到以下输出。
通过删除不需要的变量可以获得相同的结果。 下面的代码说明了这一点。
DATA Employee; INPUT empid ename $ salary DEPT $ ; DATALINES; 1 Rick 623.3 IT 2 Dan 515.2 OPS 3 Mike 611.5 IT 4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 IT 7 Pranab 632.8 OPS8 Rasmi 722.5 FIN ;RUN;DATA OnlyDept; SET Employee; DROP empid salary; RUN; PROC PRINT DATA=OnlyDept; RUN;
在这种方法中,我们只从整个数据集中提取少数观测值。
我们使用PROC FREQ来跟踪为新数据集选择的观测值。
子设置观测的语法是:
IF Var Condition THEN DELETE ;
以下是所使用的参数的说明:
考虑包含组织的员工详细信息的以下SAS数据集。 如果我们只想获得薪水超过700的员工的数据,那么我们使用以下代码。
DATA Employee; INPUT empid name $ salary DEPT $ ; DATALINES; 1 Rick 623.3 IT 2 Dan 515.2 OPS 3 Mike 611.5 IT 4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 IT 7 Pranab 632.8 OPS8 Rasmi 722.5 FIN ;RUN;DATA OnlyDept; SET Employee; IF salary < 700 THEN DELETE; RUN; PROC PRINT DATA=OnlyDept; RUN;
当执行上面的代码,我们可以得到下面的输出。
SAS中的数据集可以对其中存在的任何变量进行排序。 这有助于在数据分析和执行其他选项,如合并等。排序可以发生在任何单个变量以及多个变量。 用于在SAS数据集中执行排序的SAS过程被称为PROC SORT。 排序后的结果存储在新数据集中,原始数据集保持不变。
SAS中数据集中排序操作的基本语法是:
PROC SORT DATA=original dataset OUT=Sorted dataset; BY variable name;
以下是使用的参数的描述:
让我们考虑包含组织的员工详细信息的以下SAS数据集。 我们可以使用以下代码对工资数据集进行排序。
DATA Employee; INPUT empid name $ salary DEPT $ ; DATALINES; 1 Rick 623.3 IT 2 Dan 515.2 OPS 3 Mike 611.5 IT 4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 IT 7 Pranab 632.8 OPS8 Rasmi 722.5 FIN ;RUN;PROC SORT DATA=Employee OUT=Sorted_sal ; BY salary;RUN ; PROC PRINT DATA=Sorted_sal;RUN ;
当执行上面的代码,我们可以得到下面的输出。
默认排序选项按升序排列,这意味着观察值按排序变量的较低值到较高值排列。 但我们也可能希望排序以升序发生。
在下面的代码中,通过使用DESCENDING语句实现反向排序。
DATA Employee; INPUT empid name $ salary DEPT $ ; DATALINES; 1 Rick 623.3 IT 2 Dan 515.2 OPS 3 Mike 611.5 IT 4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 IT 7 Pranab 632.8 OPS8 Rasmi 722.5 FIN ;RUN;PROC SORT DATA=Employee OUT=Sorted_sal_reverse ; BY DESCENDING salary;RUN ; PROC PRINT DATA=Sorted_sal_reverse;RUN ;
当执行上面的代码,我们可以得到下面的输出。
通过在BY语句中使用它们,可以对多个变量应用排序。 变量以从左到右的优先级排序。
在下面的代码中,数据集首先在变量名称上排序,然后在变量名称salary上排序。
DATA Employee; INPUT empid name $ salary DEPT $ ; DATALINES; 1 Rick 623.3 IT 2 Dan 515.2 OPS 3 Mike 611.5 IT 4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 IT 7 Pranab 632.8 OPS8 Rasmi 722.5 FIN ;RUN;PROC SORT DATA=Employee OUT=Sorted_dept_sal ; BY salary DEPT;RUN ; PROC PRINT DATA=Sorted_dept_sal;RUN ;
当执行上面的代码,我们可以得到下面的输出。
有时,我们更喜欢以不同于其已经存在于数据集中的格式来显示分析的数据。 例如,我们想要向有价格信息的变量添加美元符号和两个小数位。 或者我们可能想要显示一个文本变量,全部为大写。 我们可以使用FORMAT来应用内置的SAS格式,PROC FORMAT是应用用户定义的格式。此外,单个格式可以应用于多个变量。
应用内置SAS格式的基本语法是:
format variable name format name
以下是使用的参数的描述:
让我们考虑包含组织的员工详细信息的以下SAS数据集。 我们希望以大写显示所有的名称。 格式化语句用于实现这一点。
DATA Employee; INPUT empid name $ salary DEPT $ ; format name $upcase9. ;DATALINES; 1 Rick 623.3 IT 2 Dan 515.2 OPS 3 Mike 611.5 IT 4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 IT 7 Pranab 632.8 OPS8 Rasmi 722.5 FIN ;RUN; PROC PRINT DATA=Employee; RUN;
当执行上面的代码,我们可以得到下面的输出。
我们还可以使用PROC FORMAT来格式化数据。 在下面的示例中,我们将新值分配给部门名称的变量DEPT。
DATA Employee; INPUT empid name $ salary DEPT $ ; DATALINES; 1 Rick 623.3 IT 2 Dan 515.2 OPS3 Mike 611.5 IT 4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 IT 7 Pranab 632.8 OPS8 Rasmi 722.5 FIN ;proc format;value $DEP 'IT' = 'Information Technology' 'OPS'= 'Operations' ;RUN; PROC PRINT DATA=Employee; format name $upcase9. DEPT $DEP.; RUN;
当执行上面的代码,我们可以得到下面的输出。
SAS通过在SAS程序中使用SQL查询,为大多数流行的关系数据库提供广泛的支持。 支持大多数ANSI SQL语法。 过程PROC SQL用于处理SQL语句。 此过程不仅可以返回SQL查询的结果,还可以创建SAS表和变量。 所有这些情况的示例如下所述。
在SAS中使用PROC SQL的基本语法是:
PROC SQL;SELECT ColumnsFROM TABLEWHERE ColumnsGROUP BY Columns;QUIT;
以下是使用的参数的描述:
下面我们将看到这个SAS过程如何用于SQL中的CRUD(创建,读取,更新和删除)操作。
使用SQL,我们可以创建新的数据集形式原始数据。 在下面的示例中,首先声明一个名为TEMP的数据集,其中包含原始数据。 然后我们写一个SQL查询,从这个数据集的变量创建一个表。
DATA TEMP;INPUT ID $ NAME $ SALARY DEPARTMENT $;DATALINES;1 Rick 623.3 IT2 Dan 515.2 Operations3 Michelle 611 IT4 Ryan 729 HR5 Gary 843.25 Finance6 Nina 578 IT7 Simon 632.8 Operations8 Guru 722.5 Finance;RUN;PROC SQL;CREATE TABLE EMPLOYEES ASSELECT * FROM TEMP;QUIT;PROC PRINT data = EMPLOYEES;RUN;
当执行上面的代码中,我们得到以下结果:
SQL中的读取操作涉及编写SQL SELECT查询以从表中读取数据。 In以下程序查询库SASHELP中可用的名为CARS的SAS数据集。 查询获取数据集的某些列。
PROC SQL;SELECT make,model,type,invoice,horsepower FROM SASHELP.CARS;QUIT;
当执行上面的代码中,我们得到以下结果:
以下程序使用where子句查询CARS数据集。 在结果中,我们只得到了作为“Audi”和类型为“Sports”的观察。
PROC SQL;SELECT make,model,type,invoice,horsepower FROM SASHELP.CARSWhere make = 'Audi'and Type = 'Sports';QUIT;
当执行上面的代码中,我们得到以下结果:
我们可以使用SQL Update语句更新SAS表。 下面我们首先创建一个名为EMPLOYEES2的新表,然后使用SQL UPDATE语句更新它。
DATA TEMP;INPUT ID $ NAME $ SALARY DEPARTMENT $;DATALINES;1 Rick 623.3 IT2 Dan 515.2 Operations3 Michelle 611 IT4 Ryan 729 HR5 Gary 843.25 Finance6 Nina 578 IT7 Simon 632.8 Operations8 Guru 722.5 Finance;RUN;PROC SQL;CREATE TABLE EMPLOYEES2 ASSELECT ID as EMPID,Name as EMPNAME ,SALARY as SALARY,DEPARTMENT as DEPT,SALARY*0.23 as COMMISIONFROM TEMP;QUIT;PROC SQL;UPDATE EMPLOYEES2 SET SALARY=SALARY*1.25; QUIT; PROC PRINT data = EMPLOYEES2;RUN;
SQL中的删除操作涉及使用SQL DELETE语句从表中删除某些值。 我们继续使用上面示例中的数据,并从表中删除雇员的工资大于900的行。
PROC SQL;DELETE FROM EMPLOYEES2 WHERE SALARY > 900;QUIT; PROC PRINT data = EMPLOYEES2;RUN;
SAS程序的输出可以转换为更加用户友好的形式,如.html或PDF。 这是通过使用SAS中提供的ODS语句来完成的。 ODS代表输出传递系统。 它主要用于格式化SAS程序的输出数据到好的报告,这是很好看的和理解。 这也有助于与其他平台和软件共享输出。 它还可以将多个PROC语句的结果合并在一个文件中。
在SAS中使用ODS语句的基本语法是:
ODS outputtypePATH path nameFILE = Filename and PathSTYLE = StyleName;PROC some proc;ODS outputtype CLOSE;
以下是使用的参数的描述:
我们使用ODS HTML语句创建HTML输出。在下面的示例中,我们在所需的路径中创建一个html文件。 我们应用样式库中提供的样式。 我们可以看到提到的路径中的输出文件,我们可以下载它以保存在不同于SAS环境的环境中。 请注意,我们有两个proc SQL语句,它们的输出都捕获到一个文件中。
ODS HTML PATH='/folders/myfolders/sasuser.v94/TutorialsPoint/' FILE='CARS2.html' STYLE=EGDefault;proc SQL;select make, model, invoice from sashelp.carswhere make in ('Audi','BMW')and type = 'Sports';quit;proc SQL;select make,mean(horsepower)as meanhpfrom sashelp.carswhere make in ('Audi','BMW')group by make;quit;ODS HTML CLOSE;
当执行上面的代码中,我们得到以下结果:
在下面的示例中,我们在所需的路径中创建一个PDF文件。 我们应用样式库中提供的样式。 我们可以看到提到的路径中的输出文件,我们可以下载它以保存在不同于SAS环境的环境中。 请注意,我们有两个proc SQL语句,它们的输出都捕获到一个文件中。
ODS PDF FILE='/folders/myfolders/sasuser.v94/TutorialsPoint/CARS2.pdf' STYLE=EGDefault;proc SQL;select make, model, invoice from sashelp.carswhere make in ('Audi','BMW')and type = 'Sports';quit;proc SQL;select make,mean(horsepower)as meanhpfrom sashelp.carswhere make in ('Audi','BMW')group by make;quit;ODS PDF CLOSE;
当执行上面的代码中,我们得到以下结果:
在下面的示例中,我们在所需的路径中创建一个RTF文件。 我们应用样式库中提供的样式。 我们可以看到提到的路径中的输出文件,我们可以下载它以保存在不同于SAS环境的环境中。 请注意,我们有两个proc SQL语句,它们的输出都捕获到一个文件中。
ODS RTF FILE='/folders/myfolders/sasuser.v94/TutorialsPoint/CARS.rtf'STYLE=EGDefault;proc SQL;select make, model, invoice from sashelp.carswhere make in ('Audi','BMW')and type = 'Sports';quit;proc SQL;select make,mean(horsepower)as meanhpfrom sashelp.carswhere make in ('Audi','BMW')group by make;quit;ODS rtf CLOSE;
当执行上面的代码中,我们得到以下结果:
模拟是一种计算技术,其对许多不同的随机样本使用重复计算以便估计统计量。 使用SAS,我们可以模拟在现实系统中指定统计属性的复杂数据。 我们使用软件构建系统模型,并数字化生成数据,您可以用它来更好地了解真实世界系统的行为。 设计计算机仿真模型的一部分是决定现实生活系统的哪些方面需要包括在模型中,使得由模型产生的数据可以用于做出有效的决定。 由于这种复杂性,SAS有一个用于模拟的专用软件组件。
用于创建SAS仿真的SAS软件组件称为SAS Simulation Studio。 其图形用户界面提供了一整套工具,用于构建,执行和分析离散事件仿真模型的结果。
下面列出了可应用SAS模拟的不同类型的统计分布。
SAS可以从包括许多文件格式的各种源读取数据。 SAS环境中使用的文件格式如下所述。
这些是包含文本格式数据的文件。 数据通常由空格分隔,但也可以有不同类型的分隔符,SAS也可以处理它们。 让我们考虑一个包含员工数据的ASCII文件。 我们使用SAS中提供的Infile语句读取此文件。
在下面的示例中,我们从本地环境读取名为emp_data.txt的数据文件。
data TEMP; infile '/folders/myfolders/sasuser.v94/TutorialsPoint/emp_data.txt'; input empID empName $ Salary Dept $ DOJ date9. ; format DOJ date9.; run; PROC PRINT DATA=TEMP;RUN;
当执行上面的代码,我们可以得到下面的输出。
这些是数据文件,其中列值由定界字符(如逗号或管道等)分隔。在这种情况下,我们使用infile语句中的dlm选项。
在下面的示例中,我们从本地环境读取名为emp.csv的数据文件。
data TEMP; infile '/folders/myfolders/sasuser.v94/TutorialsPoint/emp.csv' dlm=","; input empID empName $ Salary Dept $ DOJ date9. ; format DOJ date9.; run; PROC PRINT DATA=TEMP;RUN;
当执行上面的代码,我们可以得到下面的输出。
SAS可以使用导入工具直接读取excel文件。 如章节SAS数据集中所示,它可以处理各种各样的文件类型,包括MS excel。 假定文件emp.xls在SAS环境中本地可用。
FILENAME REFFILE"/folders/myfolders/TutorialsPoint/emp.xls"TERMSTR=CR;PROC IMPORT DATAFILE=REFFILEDBMS=XLSOUT=WORK.IMPORT;GETNAMES=YES;RUN;PROC PRINT DATA=WORK.IMPORT RUN;
上面的代码从excel文件读取数据,并给出与上述两种文件类型相同的输出。
DEPT:IT DTLS:1:Rick:623 DTLS:3:Mike:611 DTLS:6:Tusar:578 DEPT:OPSDTLS:7:Pranab:632DTLS:2:Dan:452DEPT:HRDTLS:4:Ryan:487DTLS:2:Siyona:452
要读取分层文件,我们使用下面的代码,其中我们使用IF子句标识头记录,并使用do循环来处理详细信息记录。
data employees(drop=Type); length Type $ 3 Department empID $ 3 empName $ 10 Empsal 3 ; retain Department; infile '/folders/myfolders/TutorialsPoint/empdtls.txt' dlm=':'; input Type $ @; if Type='DEP' then input Department $; else do; input empID empName $ Empsal ; output; end;run; PROC PRINT DATA=employees;RUN;
当执行上面的代码,我们可以得到下面的输出。
直方图是使用不同高度的条的数据的图形显示。 它将数据集中的各种数字分成许多范围。 它还表示连续变量的分布概率的估计。 在SAS中,PROC UNIVARIATE用于创建具有以下选项的直方图。
在SAS中创建直方图的基本语法是:
PROC UNIVARAITE DATA = DATASET;HISTOGRAM variables;RUN;以下是使用的参数的描述:
通过指定变量的名称和要考虑的对值进行分组的范围来创建简单的直方图。
在下面的例子中,我们考虑变量马力的最小值和最大值,取范围为50.因此,这些值形成一个以50为步长的组。
proc univariate data=sashelp.cars; histogram horsepower / midpoints = 176 to 350 by 50;run;
当我们执行上面的代码,我们得到以下的输出:
我们可以使用附加选项将一些分布曲线拟合到直方图中。
在下面的例子中,我们拟合一个分布曲线,其平均值和标准偏差值被称为EST。 此选项使用和估计参数。
proc univariate data=sashelp.cars noprint; histogram horsepower / normal ( mu = est sigma = est color = blue w = 2.5 )barlabel=percent midpoints = 70 to 550 by 50;run;
当我们执行上面的代码,我们得到以下的输出:
条形图表示矩形条中的数据,条的长度与变量的值成比例。 SAS使用过程PROC SGPLOT来创建条形图。 我们可以在条形图中绘制简单和堆叠的条形。 在条形图中,每个条可以给予不同的颜色。
在SAS中创建条形图的基本语法是:
PROC SGPLOT DATA = DATASET;VBAR variables;RUN;以下是使用的参数的描述:
简单的条形图是条形图,其中数据集中的变量表示为条形。
以下脚本将创建一个条形图,表示汽车的长度为条形。
PROC SQL;create table CARS1 asSELECT make,model,type,invoice,horsepower,length,weight FROM SASHELP.CARSWHERE make in ('Audi','BMW');RUN;proc SGPLOT data=work.cars1;vbar length ;title 'Lengths of cars';run;quit;
当我们执行上面的代码,我们得到以下的输出:
堆叠条形图是一个条形图,其中相对于另一个变量计算数据集中的变量。
以下脚本将创建一个堆叠条形图,其中计算每种车型的车辆长度。 我们使用group选项指定第二个变量。
proc SGPLOT data=work.cars1;vbar length /group = type ;title 'Lengths of Cars by Types';run;quit;
当我们执行上面的代码,我们得到以下的输出:
创建群集的条形图显示变量的值是如何跨文化传播。
下面的脚本将创建一个集群的条形图,其中汽车的长度是围绕汽车类型聚类。所以我们看到在长度191两个相邻的条形图,一为车型'轿车',而另一个用于汽车类型“旅行车”。
proc SGPLOT data=work.cars1;vbar length /group = type GROUPDISPLAY = CLUSTER;title 'Cluster of Cars by Types';run;quit;
当我们执行上面的代码,我们得到以下的输出:
基本的语法来创建一个饼图的SAS是:
PROC TEMPLATE; DEFINE STATGRAPH pie; BEGINGRAPH; LAYOUT REGION; PIECHART CATEGORY = variable / DATALABELLOCATION = OUTSIDE CATEGORYDIRECTION = CLOCKWISE START = 180 NAME = 'pie'; DISCRETELEGEND 'pie' / TITLE = ' '; ENDLAYOUT; ENDGRAPH; END;RUN;以下是使用的参数的描述:
在这个饼图中,我们从数据集中获取单个变量。 创建饼图时,使用表示变量计数相对于变量总值的分数的切片值。
在下面的例子中,每个切片代表汽车类型与汽车总数的比例。
PROC SQL;create table CARS1 asSELECT make,model,type,invoice,horsepower,length,weight FROM SASHELP.CARSWHERE make in ('Audi','BMW');RUN;PROC TEMPLATE; DEFINE STATGRAPH pie; BEGINGRAPH; LAYOUT REGION; PIECHART CATEGORY = type / DATALABELLOCATION = OUTSIDE CATEGORYDIRECTION = CLOCKWISE START = 180 NAME = 'pie'; DISCRETELEGEND 'pie' / TITLE = 'Car Types'; ENDLAYOUT; ENDGRAPH; END;RUN;PROC SGRENDER DATA = cars1 TEMPLATE = pie;RUN;
当我们执行上面的代码,我们得到以下输出:
在此饼图中,我们表示每个切片的分数值以及百分比值。 我们还将标签的位置更改为图表内。 使用DATASKIN选项修改图表的外观样式。 它使用SAS环境中提供的内置样式之一。
PROC TEMPLATE; DEFINE STATGRAPH pie; BEGINGRAPH; LAYOUT REGION; PIECHART CATEGORY = type / DATALABELLOCATION = INSIDE DATALABELCONTENT=ALL CATEGORYDIRECTION = CLOCKWISE DATASKIN= SHEEN START = 180 NAME = 'pie'; DISCRETELEGEND 'pie' / TITLE = 'Car Types'; ENDLAYOUT; ENDGRAPH; END;RUN;PROC SGRENDER DATA = cars1 TEMPLATE = pie;RUN;
当我们执行上面的代码,我们得到以下输出:
在该饼图中,图中呈现的变量的值相对于相同数据集的另一变量分组。 每个组变为一个圆,并且该图具有与可用组的数量一样多的同心圆。
在下面的示例中,我们将图表相对于名为“Make”的变量分组。 由于有两个可用的值(“Audi”和“BMW”),所以我们得到两个同心圆,每个代表自己的车类型的切片。
PROC TEMPLATE; DEFINE STATGRAPH pie; BEGINGRAPH; LAYOUT REGION; PIECHART CATEGORY = type / Group = make DATALABELLOCATION = INSIDE DATALABELCONTENT=ALL CATEGORYDIRECTION = CLOCKWISE DATASKIN= SHEEN START = 180 NAME = 'pie'; DISCRETELEGEND 'pie' / TITLE = 'Car Types'; ENDLAYOUT; ENDGRAPH; END;RUN;PROC SGRENDER DATA = cars1 TEMPLATE = pie;RUN;
当我们执行上面的代码,我们得到以下的输出:
在SAS中创建散点图的基本语法是:
PROC sgscatter DATA=DATASET; PLOT VARIABLE_1 * VARIABLE_2 / datalabel = VARIABLE group = VARIABLE;RUN;
以下是使用的参数的描述:
在一个简单的散点图中,我们从数据集中选择两个变量,并根据第三个变量对它们进行分组。 我们还可以标记数据。 结果显示两个变量如何分散在笛卡尔平面中。
PROC SQL;create table CARS1 asSELECT make,model,type,invoice,horsepower,length,weight FROM SASHELP.CARSWHERE make in ('Audi','BMW');RUN;TITLE 'Scatterplot - Two Variables';PROC sgscatter DATA=CARS1; PLOT horsepower*Invoice / datalabel = make group = type grid; title 'Horsepower vs. Invoice for car makers by types';RUN;
当我们执行上面的代码,我们得到以下的输出:
我们可以使用估计参数通过围绕值绘制椭圆来预测相关性的强度。 我们使用过程中的附加选项来绘制椭圆,如下所示。
proc sgscatter data =cars1; compare y = Invoice x =(horsepower length) / group=type ellipse =(alpha =0.05 type=predicted); title'Average Invoice vs. horsepower for cars by length'; title2'-- with 95% prediction ellipse --'; formatInvoice dollar6.0;run;
当我们执行上面的代码,我们得到以下的输出:
我们还可以有一个散点图,通过将它们分组成对,涉及多于两个变量。 在下面的示例中,我们考虑三个变量并绘制散点图矩阵。 我们得到3对结果矩阵。
PROC sgscatter DATA=CARS1; matrix horsepower invoice length / group = type; title 'Horsepower vs. Invoice vs. Length for car makers by types';RUN;
基本的语法来创建一个箱线图在SAS是:
PROC SGPLOT DATA=DATASET; VBOX VARIABLE / category = VARIABLE;RUN; PROC SGPANEL DATA=DATASET;;PANELBY VARIABLE; VBOX VARIABLE> / category = VARIABLE;RUN;以下是使用的参数的描述:
在一个简单的箱线图中,我们从数据集中选择一个变量,另一个变量形成一个类别。 第一变量的值被分类为与第二变量中的不同值的数量一样多的组数。
在下面的示例中,我们选择变量马力作为第一个变量,并键入类别变量。 因此,我们得到每种类型的汽车的马力值分布的箱线图。
PROC SQL;create table CARS1 asSELECT make,model,type,invoice,horsepower,length,weight FROM SASHELP.CARSWHERE make in ('Audi','BMW');RUN;PROC SGPLOT DATA=CARS1; VBOX horsepower / category = type; title 'Horsepower of cars by types';RUN;
我们可以将一个变量的Boxplots分成许多垂直面板(列)。 每个面板包含所有分类变量的箱线图。 但是盒图使用另一个第三个变量进一步分组,该图将该图分成多个面板。
在下面的例子中,我们使用变量'make'来绘制图形。 因为'make'有两个不同的值,所以我们得到两个垂直面板。
PROC SGPANEL DATA=CARS1;PANELBY MAKE; VBOX horsepower / category = type; title 'Horsepower of cars by types';RUN;
当我们执行上面的代码,我们得到以下的输出:
我们可以将一个变量的Boxplots分成许多水平面板(行)。 每个面板包含所有分类变量的箱线图。 但是盒图使用另一个第三个变量进一步分组,该图将该图分成多个面板。 在下面的例子中,我们使用变量'make'来绘制图形。 因为'make'有两个不同的值,所以我们得到两个水平面板。
PROC SGPANEL DATA=CARS1;PANELBY MAKE / columns = 1 novarname; VBOX horsepower / category = type; title 'Horsepower of cars by types';RUN;
线性回归用于识别因变量和一个或多个独立变量之间的关系。 提出了关系的模型,并且使用参数值的估计来形成估计的回归方程。
然后使用各种测试来确定模型是否令人满意。 如果是,则可以使用估计的回归方程来预测自变量的因变量给定值的值。 在SAS中,程序PROC REG用于找到两个变量之间的线性回归模型。
在SAS中应用PROC REG的基本语法是:
PROC REG DATA = dataset;MODEL variable_1 = variable_2;
以下是使用的参数的描述:
下面的例子显示了使用PROC REG查找汽车的两个变量马力和重量之间的相关性的过程。 在结果中,我们看到可以用于形成回归方程的截距值。
PROC SQL;create table CARS1 asSELECT invoice,horsepower,length,weight FROM SASHELP.CARSWHERE make in ('Audi','BMW');RUN;proc reg data=cars1;model horsepower= weight ;run;
当执行上面的代码中,我们得到以下结果:
上面的代码还给出了模型的各种估计的图形视图,如下所示。 作为一个高级SAS程序,它不会停止给予截距值作为输出。
Bland-Altman分析是验证设计用于测量相同参数的两种方法之间的一致性或不一致程度的过程。 方法之间的高相关性表明在数据分析中选择了足够好的样品。 在SAS中,我们通过计算变量值的平均值,上限和下限来创建一个Bland-Altman图。 然后我们使用PROC SGPLOT创建Bland-Altman图。
在SAS中应用PROC SGPLOT的基本语法是:
PROC SGPLOT DATA = dataset;SCATTER X=variable Y=Variable;REFLINE value;
以下是使用的参数的描述:
在下面的例子中,我们取两个名为new和old的方法生成的两个实验的结果。 我们计算变量值的差异以及相同观察值的变量的平均值。 我们还计算要在计算的上限和下限中使用的标准偏差值。
结果显示Bland-Altman图为散点图。
data mydata;input new old;datalines;31 4527 1211 3736 2514 827 153 1162 4238 3520 935 5462 6748 2577 6445 5332 4216 1915 2722 98 3824 1659 25;data diffs ;set mydata ;/* calculate the difference */diff=new-old ;/* calculate the average */mean=(new+old)/2 ;run ;proc print data=diffs;run;proc sql noprint ;select mean(diff)-2*std(diff), mean(diff)+2*std(diff)into :lower, :upper from diffs ;quit;proc sgplot data=diffs ;scatter x=mean y=diff;refline 0 &upper &lower / LABEL = ("zero bias line" "95% upper limit" "95%lower limit") ;TITLE 'Bland-Altman Plot';footnote 'Accurate prediction with 10% homogeneous error'; run ;quit ;
当执行上面的代码中,我们得到以下结果:
在上述程序的增强模型中,我们得到95%的置信水平曲线拟合。
proc sgplot data=diffs ;reg x = new y = diff/clm clmtransparency= .5;needle x= new y=diff/baseline=0;refline 0 / LABEL = ('No diff line');TITLE 'Enhanced Bland-Altman Plot';footnote 'Accurate prediction with 10% homogeneous error'; run ;quit ;
当执行上面的代码中,我们得到以下结果:
卡方检验用于检验两个分类变量之间的关联。 它可以用于测试变量的依赖程度和独立性程度。 SAS使用PROC FREQ和chisq选项来确定卡方检验的结果。
在SAS中对卡方检验应用PROC FREQ的基本语法是:
PROC FREQ DATA = dataset;TABLES variables /CHISQ TESTP=(percentage values);
以下是使用的参数的描述:
在下面的示例中,我们考虑对数据集SASHELP.CARS中的变量named类型进行卡方检验。 该变量有六个级别,我们根据测试的设计为每个级别分配百分比。
proc freq data = sashelp.cars;tables type /chisq testp=(0.20 0.12 0.18 0.10 0.25 0.15);run;
当执行上面的代码中,我们得到以下结果:
我们还得到显示变量类型的偏差的条形图,如下所示。
当我们将测试应用于数据集的两个变量时,使用双向卡方检验。
在下面的例子中,我们对名为type和origin的两个变量应用卡方检验。 结果显示这两个变量的所有组合的表格形式。
proc freq data = sashelp.cars;tables type*origin /chisq ;run;
当执行上面的代码中,我们得到以下结果:
Fisher精确检验是用于确定两个分类变量之间是否存在非随机关联的统计检验。 在SAS中,这是使用PROC FREQ执行的。 我们使用Tables选项来使用经过Fisher Exact测试的两个变量。
在SAS中应用Fisher Exact测试的基本语法是:
PROC FREQ DATA = dataset ;TABLES Variable_1*Variable_2 / fisher;
以下是所使用的参数的说明:
为了应用Fisher精确检验,我们选择两个名为Test1和Test2的分类变量及其结果。我们使用PROC FREQ应用如下所示的检验。
data temp;input Test1 Test2 Result @@;datalines;1 1 3 1 2 1 2 1 1 2 2 3;proc freq; tables Test1*Test2 / fisher;run;
当执行上面的代码中,我们得到以下结果:
算术平均值是通过对数值变量的值进行求和,然后将和值与变量的数量相除而获得的值。 它也称为平均值。 在SAS算术平均值使用PROC MEANS计算。 使用这个SAS程序,我们可以找到所有变量的平均值或数据集的一些变量。 我们还可以形成组并找到特定于该组的值的变量的均值。
SAS中计算算术平均值的基本语法是:
PROC MEANS DATA = DATASET;CLASS Variables ;VAR Variables;以下是使用的参数的描述:
数据集中每个数字变量的平均值通过使用PROC仅提供数据集名称而不使用任何变量来计算。
在下面的示例中,我们找到名为CARS的SAS数据集中所有数字变量的平均值。 我们将小数位后的最大位数指定为2,并找出这些变量的总和。
PROC MEANS DATA = sashelp.CARS Mean SUM MAXDEC=2;RUN;
我们可以通过在var选项中提供它们的名字来得到一些变量的平均值。
在下面,我们计算三个变量的平均值。
PROC MEANS DATA = sashelp.CARS mean SUM MAXDEC=2 ;var horsepower invoice EngineSize;RUN;
当执行上面的代码,我们得到以下的输出:
我们可以通过使用一些其他变量将它们聚集到组来找到数字变量的平均值。
在下面的例子中,我们找到每个车型下的每种类型的可变马力的平均值。
PROC MEANS DATA = sashelp.CARS mean SUM MAXDEC=2;class make type;var horsepower;RUN;
当执行上面的代码,我们得到以下的输出:
当在多个不同条件下测量随机样品的所有成员时使用重复测量分析。 当样品存在多种不同条件时必须依次进行测量。 在这种情况下使用标准ANOVA是不合适的,因为它不能建模重复测量不同条件之间的相关性。 应该清楚重复测量多个不同条件之间的差异。 对样本进行重复测量试验,每个试验测试了在不同条件下相同样品的特点。
在SAS PROC GLM用于进行重复测量分析。
为PROC GLM在SAS的基本语法是:
PROC GLM DATA=dataset; CLASS variable; MODEL variables = group / NOUNI ; REPEATED TRIAL n;
以下是使用的参数的描述:
考虑下面的例子,其中我们有两组人进行药物效应测试。 对于所测试的四种药物类型中的每一种记录每个人的反应时间。 这里对每组人进行5次试验,以观察四种药物类型的作用之间的相关性的强度。
DATA temp; INPUT person group $ r1 r2 r3 r4;CARDS;1 A 2 1 6 52 A 5 4 11 93 A 6 14 12 104 A 2 4 5 85 A 0 5 10 96 B 9 11 16 137 B 12 4 13 148 B 15 9 13 89 B 6 8 12 510 B 5 7 11 9;RUN;PROC PRINT DATA=temp ;RUN; PROC GLM DATA=temp; CLASS group; MODEL r1-r4 = group / NOUNI ; REPEATED trial 5;RUN;
当执行上面的代码中,我们得到以下结果:
标准偏差(SD)是数据集中的数据如何变化的量度。 在数学上,它测量每个值与数据集的平均值的距离或接近程度。 接近0的标准偏差值表示数据点趋向于非常接近数据集的平均值,并且高标准偏差表示数据点在更宽的值范围上展开。
在SAS中,使用PROC MEAN以及PROC SURVEYMEANS测量SD值。
要使用proc测量SD,我们在PROC步骤中选择STD选项。 它为数据集中存在的每个数字变量输出SD值。
在SAS计算标准偏差的基本语法是:
PROC means DATA = dataset STD;
以下是所使用的参数的说明:
在下面的示例中,我们从SASHELP库中的CARS数据集创建数据集CARS1。 我们选择带有PROC平均值步骤的STD选项。
PROC SQL;create table CARS1 asSELECT make,type,invoice,horsepower,length,weight FROM SASHELP.CARSWHERE make in ('Audi','BMW');RUN;proc means data=CARS1 STD;run;
当我们执行上面的代码它提供了以下的输出:
该程序还用于测量SD以及一些先进的特征,例如测量分类变量的SD以及提供方差的估计。
使用PROC SURVEYMEANS的语法是:
PROC SURVEYMEANS options statistic-keywords ;BY variables ;CLASS variables ;VAR variables ;
以下是使用的参数的描述:
下面的示例描述了使用class选项为类变量中的每个值创建统计信息。
proc surveymeans data=CARS1 STD;class type;var type horsepower;ods output statistics=rectangle;run;proc print data=rectangle;run;
当我们执行上面的代码它提供了以下的输出:
下面的代码给出了BY选项的示例。 在其中,结果按BY选项的每个值分组。
proc surveymeans data=CARS1 STD;var horsepower;BY make;ods output statistics=rectangle;run;proc print data=rectangle;run;
当我们执行上面的代码它提供了以下的输出:
ANOVA代表方差分析。 在SAS中,它使用PROC ANOVA完成。 它执行从各种各样的实验设计的数据的分析。 在这个过程中,在被称为独立变量的分类变量识别的实验条件下测量被称为因变量的连续响应变量。 响应的变化被认为是归因于分类中的影响,其中随机误差考虑了剩余变化。
在SAS中应用PROC ANOVA的基本语法是:
PROC ANOVA dataset ;CLASS Variable;MODEL Variable1=variable2 ;MEANS ;
以下是使用的参数的描述:
让我们考虑数据集SASHELP.CARS。 在这里我们研究变量汽车类型和他们的马力之间的依赖。 因为car类型是一个带有分类值的变量,我们把它作为类变量,并在MODEL中使用这两个变量。
PROC ANOVA DATA = SASHELPS.CARS;CLASS type;MODEL horsepower = type;RUN;
当执行上面的代码中,我们得到以下结果:
我们还可以通过应用MEANS语句来扩展模型,其中我们使用土耳其的Studentized方法来比较各种类型的汽车的平均值。 汽车类型的类别列出了每个类别中马力的平均值以及一些附加值,如误差均方等。
PROC ANOVA DATA = SASHELPS.CARS;CLASS type;MODEL horsepower = type;MEANS type / tukey lines;RUN;
当执行上面的代码中,我们得到以下结果:
频率分布是示出数据集中的数据点的频率的表。 表中的每个条目包含特定组或间隔内的值的出现频率或计数,并且以这种方式,表概括了样本中的值的分布。
SAS提供了一个称为PROC FREQ的过程来计算数据集中数据点的频率分布。
SAS中计算频率分布的基本语法是:
PROC FREQ DATA = Dataset ;TABLES Variable_1 ;BY Variable_2 ;
以下是使用的参数的描述:
我们可以使用PROC FREQ确定单个变量的频率分布。 在这种情况下,结果将显示变量的每个值的频率。 结果还显示百分比分布,累积频率和累积百分比。
在下面的例子中,我们找到名为CARS1的数据集的变量马力的频率分布,该数据集是从库SASHELP.CARS创建的。 我们可以看到结果分为两类结果。 一个为汽车的每一个。
PROC SQL;create table CARS1 asSELECT make,model,type,invoice,horsepower,length,weight FROM SASHELP.CARSWHERE make in ('Audi','BMW');RUN;proc FREQ data=CARS1 ;tables horsepower; by make;run;
当执行上面的代码中,我们得到以下结果:
我们可以找到多个变量的频率分布,将它们分组成所有可能的组合。
在下面的例子中,我们计算按汽车类型分组的汽车制造的频率分布,以及按每种制造分组的每种类型汽车的频率分布。
proc FREQ data=CARS1 ;tables make type; run;
当执行上面的代码中,我们得到以下结果:
使用权重选项,我们可以计算用变量的权重偏置的频率分布。 这里,变量的值被取为观察值的数量,而不是值的计数。
在下面的例子中,我们计算变量make和type的频率分布,分配给马力的权重。
proc FREQ data=CARS1 ;tables make type; weight horsepower;run;
当执行上面的代码中,我们得到以下结果:
假设检验是使用统计学来确定给定假设为真的概率。 假设检验的通常过程包括如下所示的四个步骤。
制定零假设H0(通常,观察是纯偶然的结果)和替代假设H1(通常,观察显示真实效应与机会变化的分量组合)。
识别可用于评估零假设的真实性的检验统计量。
计算P值,其是假设当无效假设为真时测试统计量至少与所观察到的统计量一样有效的概率。 P值越小,证据相对于零假设越强。
将p值与可接受的显着性值α(有时称为α值)进行比较。 如果p <=α,观察到的效果是统计学显着的,则排除零假设,并且替代假设是有效的。
SAS编程语言具有执行各种类型的假设测试的特征,如下所示。
测试 | 描述 | SAS PROC |
---|---|---|
T-Test | 使用t检验来测试一个变量的平均值是否显着不同于假设值。 我们还确定两个独立组的平均值是否显着不同,以及对于依赖或配对组的平均值是否显着不同。 | PROC TTEST |
ANOVA | 当有一个独立的分类变量时,它也用于比较均值。 当测试时,我们想要使用单因素方差分析以查看区间因变量的均值是否根据独立的分类变量而不同。 | PROC ANOVA |
Chi-Square | 我们使用卡方拟合优度来评估分类变量的频率是否可能由于偶然发生。 如果分类变量的比例是假设值,则需要使用卡方检验。 | PROC FREQ |
Linear Regression | 当想要测试变量预测另一个变量有效性时,使用简单的线性回归。 多元线性回归允许测试多个变量如何预测感兴趣的变量。 当使用多元线性回归时,我们另外假设预测变量是独立的。 | PROC REG |
交叉制表涉及使用两个或更多变量的所有可能组合来产生也称为偶然表的交叉表。 在SAS中,它使用PROC FREQ以及TABLES选项创建。 例如 - 如果我们需要每个车型类别中每个车型的每个车型的频率,那么我们需要使用PROC FREQ的TABLES选项。
在SAS中应用交叉表的基本语法是:
PROC FREQ DATA = dataset;TABLES variable_1*Variable_2;
以下是使用的参数的描述:
考虑到如下所示的从SASHELP.CARS创建的数据集car1中查找每种汽车品牌下可用的汽车类型的情况。 在这种情况下,我们需要单个频率值以及跨越类型的频率值的和。 我们可以观察到结果显示跨行和列的值。
PROC SQL;create table CARS1 asSELECT make,type,invoice,horsepower,length,weight FROM SASHELP.CARSWHERE make in ('Audi','BMW');RUN;proc FREQ data=CARS1 ;tables make*type; run;
当执行上面的代码中,我们得到以下结果:
当我们有三个变量时,我们可以对其中的两个进行分组,并用第三个变量交叉列表这两个变量。 所以在结果中我们有两个交叉表。
在下面的例子中,我们找到每种类型的汽车和每种车型的车型相对于汽车的频率。 另外,我们使用nocol和norow选项来避免和和百分比值。
proc FREQ data=CARS2 ;tables make * (type model) / nocol norow nopercent; run;
当执行上面的代码中,我们得到以下结果:
对于4个变量,配对组合的数量增加到4.来自组1的每个变量与组2的每个变量配对。
在下面的例子中,我们找到每个车型和每个车型的汽车长度的频率。 类似地,每个制造和每个模型的马力频率。
proc FREQ data=CARS2 ;tables (make model) * (length horsepower) / nocol norow nopercent; run;
当执行上面的代码中,我们得到以下结果:
进行T检验以通过比较它们的均值和平均差异来计算一个样本或两个独立样本的置信限度。 名为PROC TTEST的SAS过程用于对单个变量和一对变量执行t个测试。
在SAS应用PROC TTEST的基本语法是:
PROC TTEST DATA = dataset;VAR variable;CLASS Variable;PAIRED Variable_1 * Variable_2;
以下是使用的参数的描述:
下面我们看到一个样本t检验,其中找到具有95%置信限的可变马力的t检验估计。
PROC SQL;create table CARS1 asSELECT make,type,invoice,horsepower,length,weight FROM SASHELP.CARSWHERE make in ('Audi','BMW');RUN;proc ttest data=cars1 alpha=0.05 h0=0; var horsepower; run;
当执行上面的代码中,我们得到以下结果:
进行配对T检验以测试两个因变量是否在统计学上彼此不同。
由于汽车的长度和重量将取决于彼此,我们应用配对T测试如下所示。
proc ttest data=cars1 ; paired weight*length; run;
当执行上面的代码中,我们得到以下结果:
该t检验设计用于比较两组之间相同变量的平均值。
在我们的例子中,我们比较了两种不同车型(“Audi”和“BMW”)之间的可变马力的平均值。
proc ttest data=cars1 sides=2 alpha=0.05 h0=0; title "Two sample t-test example"; class make; var horsepower; run;
当执行上面的代码中,我们得到以下结果:
相关性分析处理变量之间的关系。 相关系数是两个变量之间的线性关联的度量。相关系数的值总是在-1和+1之间。 SAS提供过程PROC CORR以找到数据集中的一对变量之间的相关系数。
在SAS中应用PROC CORR的基本语法是:
PROC CORR DATA = dataset options;VAR variable;
以下是使用的参数的描述:
数据集中可用的一对变量之间的相关系数可以通过在VAR语句中使用它们的名称来获得。 在下面的例子中,我们使用数据集CARS1并得到显示马力和重量之间的相关系数的结果。
PROC SQL;create table CARS1 asSELECT invoice,horsepower,length,weight FROM SASHELP.CARSWHERE make in ('Audi','BMW');RUN;proc corr data=cars1 ;VAR horsepower weight ;BY make;run;
当执行上面的代码中,我们得到以下结果:
通过简单地应用具有数据集名称的过程,可以获得数据集中可用的所有变量之间的相关系数。
在下面的例子中,我们使用数据集CARS1并获得显示每对变量之间的相关系数的结果。
proc corr data=cars1 ;run;
当执行上面的代码中,我们得到以下结果:
我们可以通过在PROC语句中选择绘制矩阵的选项来获得变量之间的散点图矩阵。
在下面的例子中,我们得到马力和重量之间的矩阵。
proc corr data=cars1 plots=matrix ;VAR horsepower weight ;run;
当执行上面的代码中,我们得到以下结果:
SAS是业务分析领域的领导者。 通过创新的分析,它迎合商业智能和数据管理软件和服务。 SAS将数据转换为洞察力,可以为业务提供一个全新的视角。
亲爱的读者,以下是关于SAS使用与设计时的相关问题,你在平时的编程操作过程中可能会遇到以下的问题。通过广大用户的经验反馈,对以下的常见问题进行了对应的解答,
更多的问题欢迎广大用户的反馈,我们将后继进一步的进行解答。
DO WHILE表达式在DO循环的顶部评估。 如果表达式是第一次被评估,那么DO循环永远不会执行。 而DO UNTIL至少执行一次。
字符,数字
通过使用MAXDEC =选项
两个过程之间的区别是默认情况下PROC MEANS生成报告。 相反,要在PROC SUMMARY中生成报表,必须在PROC SUMMARY语句中包含一个PRINT选项。
如何指定要由FREQ过程处理的变量?
通过使用TABLES语句。
在输入语句中双尾@@的目的?
双尾标记(@@)指示SAS而不是前进到新记录,保存当前输入记录以执行下一个INPUT语句。
使用DROP,KEEP语句和数据集选项。
它产生MIN,MAX,MEAN和STD DEV的默认统计。
PDV是存储器中的逻辑区域。创建PDV之后创建输入缓冲器。 SAS在内存的PDV区域中构建数据集
它也可以用于写入输出而不创建数据集。
通过使用带有NODUPKEY和NODUP选项的PROC SORT。
NODUPKEY选项删除重复的观察,其中重复在BY语句中列出的变量的值,而NODUP选项删除重复的观察,其中所有变量中的值重复(相同的观察)
在PROC SORT代码中使用DESCENDING关键字。
通过使用PUT函数创建不同命名的变量。
通过使用INPUT函数创建不同命名的变量。
SET连接数据集,其中MERGE与数据集的观测值匹配
SYMPUT将数据集中的值放入宏变量中,SYMGET从宏变量获取值到数据集。
INTNX函数按给定的间隔提前一个日期,时间或日期时间值,并返回日期,时间或日期时间值
RETAIN语句告诉SAS在从DATA步骤的当前迭代到下一步时,不要将变量设置为缺失。 相反,SAS保留这些值。
%EVAL不能使用具有浮点值的操作数执行算术计算。 它是%SYSEVALF函数出现的时候。
它执行简单和多重回归,方差分析(ANOVAL),协方差分析,多变量方差分析和重复测量方差分析。
SAS INFORMATS用于从称为平面文件ASCII文件,文本文件或顺序文件的外部文件读取或输入数据。 信息将告诉SAS如何将数据读入SAS变量。
扫描(参数,n,分隔符)
扫描,Substr,修剪,Catx,索引,tranwrd,查找,总和。
TRANWRD函数替换或删除字符串中所有出现的字符模式。
INFILE语句用于标识外部文件,而INPUT语句用于描述变量。
当在INFILE语句上使用MISSOVER选项时,INPUT语句在读取短行时不会跳转到下一行。 相反,MISSOVER将变量设置为missing
使用FIRSTOBS =和OBS =声明。
SUM函数返回非缺失参数的总和,而“+”运算符在缺少任何参数时返回缺失值。
SUBSTR函数用于从字符变量中提取子字符串。
ceil函数返回大于/等于参数的最小整数,而floor返回小于/等于参数的最大整数。
SCAN提取由定界符标记的值内的字。 SUBSTR通过说明特定位置来提取值的一部分。 当我们知道从字符值中提取的子字符串的确切位置时,最好使用它。
使用PROC SQL与COUNT(DISTINCT variable_name)来确定列的唯一值的数量。
有迹象表明,可用于调试SAS宏一些系统选项:MPRINT,MLOGIC,SYMBOLGEN
使用PROC PRINTTO
数据步骤MERGE在多对多关系的情况下不创建笛卡尔积。 而Proc SQL生成笛卡儿乘积。
2字节和1字节。
程序是具有特定目的的子例程,数据步骤被设计为读入和操纵数据。
PUT(格式化)语句。
where语句
输入函数 - 字符到数字转换 - 输入(源,信息)和put函数 - 数字到字符转换输入(源,格式)
不,它必须是字符数据类型。
观测的数量仅受计算机处理和存储它们的能力的限制。
通过使用MAXDEC =选项
BY处理要求您的数据已按照BY变量的顺序排序或索引。
通过使用TABLES语句。
五
proc意味着给出解释统计量。 默认情况下,它会在输出窗口中给出输出。但proc摘要不会给出输出为default.we需要给出一个选项打印,然后只有它将给出输出。
在数据语句中的“/”后使用Debug子句。
使用MISSOVER关键字。