SAS - 快速指南



SAS - 概述

SAS 代表 Statistical Analysis Software(统计分析软件)。它由 SAS Institute 于 1960 年创建。从 1960 年 1 月 1 日起,SAS 用于数据管理、商业智能、预测分析、描述性和规范性分析等。从那时起,软件中引入了许多新的统计程序和组件。

随着 JMP(Jump)统计软件的引入,SAS 利用了 Macintosh 引入的图形用户界面。Jump 主要用于六西格玛、设计、质量控制以及工程和科学分析等应用。

SAS 是平台无关的,这意味着您可以在任何操作系统上运行 SAS,无论是 Linux 还是 Windows。SAS 由 SAS 程序员驱动,他们在 SAS 数据集上使用一系列操作来创建用于数据分析的正确报告。

多年来,SAS 已在其产品组合中增加了众多解决方案。它提供了数据治理、数据质量、大数据分析、文本挖掘、欺诈管理、健康科学等方面的解决方案。我们可以安全地假设 SAS 针对每个业务领域都提供解决方案。

要了解可用的产品列表,您可以访问 SAS 组件

我们为什么要使用 SAS

SAS 主要用于处理大型数据集。借助 SAS 软件,您可以在数据上执行各种操作,例如:

  • 数据管理
  • 统计分析
  • 生成具有完美图形的报表
  • 业务规划
  • 运筹学和项目管理
  • 质量改进
  • 应用程序开发
  • 数据提取
  • 数据转换
  • 数据更新和修改

如果我们谈论 SAS 的组件,那么 SAS 中提供了 200 多个组件。

序号 SAS 组件及其用途
1

Base SAS

它是核心组件,包含数据管理功能和用于数据分析的编程语言。它也是使用最广泛的。

2

SAS/GRAPH

创建图形、演示文稿,以便更好地理解和以正确的格式展示结果。

3

SAS/STAT

执行统计分析,包括方差分析、回归、多元分析、生存分析、心理测量分析和混合模型分析。

4

SAS/OR

运筹学。

5

SAS/ETS

计量经济学和时间序列分析。

6

SAS/IML

交互式矩阵语言。

7

SAS/AF

应用程序功能。

8

SAS/QC

质量控制。

9

SAS/INSIGHT

数据挖掘。

10

SAS/PH

临床试验分析。

11

SAS/Enterprise Miner

数据挖掘。

SAS 软件类型

  • Windows 或 PC SAS
  • SAS EG(企业指南)
  • SAS EM(企业挖掘,即用于预测分析)
  • SAS Means
  • SAS Stats

在组织和培训机构中,我们大多使用 Windows SAS。一些组织使用 Linux,但它没有图形用户界面,因此您必须为每个查询编写代码。但在 Windows SAS 中,提供了许多实用程序,这极大地帮助了程序员,并且还减少了编写代码的时间。

SAS 窗口有 5 个部分。

序号 SAS 窗口及其用途
1

日志窗口

日志窗口就像一个执行窗口,我们可以在其中检查 SAS 程序的执行情况。在此窗口中,我们还可以检查错误。在运行程序后每次检查日志窗口非常重要。这样,我们就可以对程序的执行有一个正确的理解。

2

编辑器窗口

编辑器窗口是 SAS 中编写所有代码的部分。它就像一个记事本。

3

输出窗口

输出窗口是结果窗口,我们可以在其中查看程序的输出。

4

结果窗口

它就像所有输出的索引。我们在 SAS 的一个会话中运行的所有程序都列在其中,您可以通过单击输出结果来打开输出。但这些仅在 SAS 的一个会话中提及。如果我们关闭软件然后再次打开它,则结果窗口将为空。

5

浏览窗口

这里列出了所有库。您还可以从此处浏览系统中 SAS 支持的文件。

SAS 中的库

库就像 SAS 中的存储。您可以创建一个库并将所有类似的程序保存在该库中。SAS 为您提供了创建多个库的功能。SAS 库的长度仅为 8 个字符。

SAS 中提供了两种类型的库:

序号 SAS 窗口及其用途
1

临时或工作库

这是 SAS 的默认库。如果我们没有为程序分配任何其他库,则我们创建的所有程序都将存储在此工作库中。您可以在浏览窗口中检查此工作库。如果您创建了一个 SAS 程序并且没有为其分配任何永久库,那么如果您结束会话并在之后再次启动软件,则此程序将不在工作库中。因为它只会在会话持续期间存在于工作库中。

2

永久库

这些是 SAS 的永久库。我们可以使用 SAS 实用程序或在编辑器窗口中编写代码来创建一个新的 SAS 库。这些库被称为永久库,因为如果我们在 SAS 中创建一个程序并将其保存在这些永久库中,那么这些程序将根据需要一直可用。

SAS - 环境

SAS Institute Inc. 发布了一个免费的SAS University Edition,它非常适合学习 SAS 编程。它提供了学习 BASE SAS 编程所需的所有功能,进而使您能够学习任何其他 SAS 组件。

下载和安装 SAS University Edition 的过程非常简单。它作为虚拟机提供,需要在虚拟环境中运行。在运行 SAS 软件之前,您需要在 PC 中安装虚拟化软件。在本教程中,我们将使用VMware。以下是下载、设置 SAS 环境和验证安装的步骤的详细信息。

下载 SAS University Edition

SAS University Edition 可在以下网址下载 SAS University Edition。请向下滚动以阅读系统要求,然后再开始下载。访问此 URL 时将显示以下屏幕。

SAS_environment_download_link

设置虚拟化软件

在同一页面上向下滚动以找到安装步骤 1。此步骤提供了获取适合您的虚拟化软件的链接。如果您已经在系统中安装了其中任何一个软件,则可以跳过此步骤。

SAS_environment2_vm_options

快速启动虚拟化软件

如果您完全不熟悉虚拟化环境,则可以通过阅读以下指南和视频(作为步骤 2 提供)来熟悉它。如果您已经熟悉,则可以再次跳过此步骤。

SAS_environment3_vm_guides_videos

下载 Zip 文件

在步骤 3 中,您可以选择与您拥有的虚拟化环境兼容的 SAS University Edition 的适当版本。它将下载为一个 zip 文件,名称类似于 unvbasicvapp__9411005__vmx__en__sp0__1.zip

SAS_environment4_vm_download

解压缩 zip 文件

上面提到的 zip 文件需要解压缩并存储到适当的目录中。在我们的例子中,我们选择了 VMware zip 文件,解压缩后显示以下文件。

SAS_environment5_file_unzip

加载虚拟机

启动 VMware 播放器(或工作站)并打开扩展名为 .vmx 的文件。将显示以下屏幕。请注意分配给虚拟机的基本设置,例如内存和硬盘空间。

SAS_environment6_vm_machine

启动虚拟机

单击绿色箭头标记旁边的启动此虚拟机以启动虚拟机。将显示以下屏幕。

SAS_environment7_vm_machine_poweron

当 SAS 虚拟机处于加载状态时,将显示以下屏幕,之后正在运行的虚拟机将提示您转到一个 URL 位置,该位置将打开 SAS 环境。

SAS_environment8_vm_running

启动 SAS Studio

打开一个新的浏览器标签页并加载上述URL(每个电脑的URL可能不同)。以下屏幕显示SAS环境已准备就绪。

SAS_environment9_vm_start_studio

SAS环境

点击启动SAS Studio,我们将进入SAS环境,默认情况下以可视化编程模式打开,如下所示。

SAS_environment10_vm_visual_programming

我们也可以通过点击下拉菜单将其更改为SAS编程模式。

SAS_environment11_vm_SAS_Programmer

现在我们准备编写SAS程序了。

SAS - 用户界面

SAS程序是使用一个称为SAS Studio的用户界面创建的。

以下是各个窗口及其用法的描述。

SAS主窗口

这是您进入SAS环境时看到的窗口。左侧是导航窗格,用于导航各种编程功能。右侧是工作区,用于编写代码并执行它。

ui_main_screen1.JPG

代码自动完成

这是一个非常强大的功能,它有助于获取SAS关键字的正确语法,并提供指向该关键字文档的链接。

ui_program_code2.JPG

程序执行

代码的执行是通过按下运行图标(最左侧的第一个图标)或F3键来完成的。

ui_program_run_4.JPG

程序日志

已执行代码的日志可在日志选项卡下找到。它描述了程序执行过程中的错误、警告或提示。这是您获取所有调试代码线索的窗口。

ui_program_log_5.JPG

程序结果

代码执行的结果显示在结果选项卡中。默认情况下,它们以html表格格式显示。

ui_program_result_6.JPG

程序选项卡

导航区域包含创建和管理程序的功能。它还提供可与您的程序一起使用的预构建功能。

服务器文件和文件夹

在此选项卡下,我们可以创建其他程序、导入要分析的数据以及查询现有数据。它还可用于创建文件夹快捷方式。

ui_program_multiple_7.JPG

任务

任务选项卡提供功能,可以通过仅提供输入变量来使用内置SAS程序。例如,在统计文件夹下,您可以找到一个SAS程序,只需提供SAS数据集名称和变量名称即可进行线性回归。

ui_program_tasks_8.JPG

代码片段

代码片段选项卡提供功能来编写SAS宏并从现有数据集中生成文件。

ui_program_snippets_9.JPG

程序库

SAS将数据集存储在SAS库中。临时库仅在单个会话中可用,并命名为WORK。但永久库始终可用。

ui_program_libraries_10.JPG

文件快捷方式

此选项卡用于访问存储在SAS环境外部的文件。此类文件的快捷方式存储在此选项卡下。

ui_program_file_shortcuts_11.JPG

SAS - 程序结构

SAS编程首先涉及将数据集创建/读取到内存中,然后对这些数据进行分析。我们需要了解编写程序以实现此目标的流程。

SAS程序结构

下图显示了以给定顺序编写的创建SAS程序的步骤。

ps_flow_1

每个SAS程序都必须包含所有这些步骤才能完成读取输入数据、分析数据和给出分析输出。此外,每个步骤末尾的RUN语句都是完成该步骤执行所必需的。

DATA步

此步骤涉及将所需数据集加载到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 IT
2 Dan 515.2 Operations
3 Michelle 611 IT
4 Ryan 729 HR
5 Gary 843.25 Finance
6 Nina 578 IT
7 Simon 632.8 Operations
8 Guru 722.5 Finance
;
RUN;

PROC步

此步骤涉及调用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程序

以下是每个上述步骤的完整代码。

ps_complete_code

程序输出

上述代码的输出显示在结果选项卡中。

ps_program_output

SAS - 基本语法

与任何其他编程语言一样,SAS语言也有自己的语法规则来创建SAS程序。

任何SAS程序的三个组成部分——语句、变量和数据集遵循以下语法规则。

SAS语句

  • 语句可以从任何位置开始,到任何位置结束。最后一行末尾的分号标志着语句的结束。

  • 同一行可以有多个SAS语句,每个语句以分号结尾。

  • 可以使用空格分隔SAS程序语句中的组件。

  • SAS关键字不区分大小写。

  • 每个SAS程序都必须以RUN语句结束。

SAS变量名称

SAS中的变量表示SAS数据集中的一列。变量名称遵循以下规则。

  • 最多可以有32个字符。

  • 不能包含空格。

  • 必须以字母A到Z(不区分大小写)或下划线(_)开头。

  • 可以包含数字,但不能作为第一个字符。

  • 变量名称不区分大小写。

示例

# Valid Variable Names
REVENUE_YEAR
MaxVal
_Length

# Invalid variable Names
Miles Per Liter	#contains Space.
RainfFall%      # contains apecial character other than underscore.
90_high		# Starts with a number.

SAS数据集

DATA语句标志着新SAS数据集的创建。数据集创建规则如下。

  • DATA语句后跟一个单词表示临时数据集名称。这意味着数据集在会话结束时会被删除。

  • 数据集名称可以以库名称为前缀,这使其成为永久数据集。这意味着数据集在会话结束后仍然存在。

  • 如果省略了SAS数据集名称,则SAS会创建一个由SAS生成的临时数据集名称,例如- DATA1、DATA2等。

示例

# Temporary data sets.
DATA TempData;
DATA abc;
DATA newdat;

# Permanent data sets.
DATA LIBRARY1.DATA1
DATA MYLIB.newdat;

SAS文件扩展名

SAS程序、数据文件和程序结果在Windows中以各种扩展名保存。

  • *.sas − 它表示SAS代码文件,可以使用SAS编辑器或任何文本编辑器进行编辑。

  • *.log − 它表示SAS日志文件,其中包含提交的SAS程序的错误、警告和数据集详细信息等信息。

  • *.mht / *.html −它表示SAS结果文件。

  • *.sas7bdat −它表示SAS数据文件,其中包含SAS数据集,包括变量名称、标签和计算结果。

SAS中的注释

SAS代码中的注释以两种方式指定。以下是这两种格式。

*message; 类型注释

形式为*message;的注释不能包含分号或不匹配的引号。此外,此类注释中不应引用任何宏语句。它可以跨越多行,并且可以是任意长度。以下是一个单行注释示例−

* This is comment ;

以下是一个多行注释示例−

* This is first line of the comment
* This is second line of the comment;

/*message*/ 类型注释

形式为/*message*/的注释使用频率更高,并且不能嵌套。但它可以跨越多行,并且可以是任意长度。以下是一个单行注释示例−

/* This is comment */

以下是一个多行注释示例−

/* This is first line of the comment
* This is second line of the comment */

SAS - 数据集

可用于SAS程序分析的数据称为SAS数据集。它使用DATA步创建。SAS可以读取各种文件作为其数据源,例如CSV、Excel、Access、SPSS以及原始数据。它还提供了许多可供使用的内置数据源。

  • 如果数据集由SAS程序使用,然后在会话运行后被丢弃,则称为临时数据集

  • 但如果它被永久存储以供将来使用,则称为永久数据集。所有永久数据集都存储在特定的库中。

SAS数据集以行和列的形式存储,也称为SAS数据表。下面我们将看到内置以及从外部来源读取的永久数据集的示例。

SAS内置数据集

这些数据集已存在于已安装的SAS软件中。它们可以被探索并用于制定数据分析的示例表达式。要探索这些数据集,请转到库 -> 我的库 -> SASHELP。展开后,我们将看到所有可用内置数据集名称的列表。

data_sets_1_explore

让我们向下滚动以找到一个名为CARS的数据集。双击此数据集将在右侧窗口窗格中打开它,我们可以在其中进一步探索它。我们还可以使用右侧窗格下方的最大化视图按钮最小化左侧窗格。

data_sets_2_CARS

我们可以使用底部的滚动条向右滚动以浏览表中的所有列及其值。

data_sets_3_CARS_explore

导入外部数据集

我们可以使用SAS Studio中提供的导入功能将自己的文件导出为数据集。但这些文件必须存在于SAS服务器文件夹中。因此,我们必须使用服务器文件和文件夹下的上传选项将源数据文件上传到SAS文件夹。

data_sets_4_1_loacl_files_to_server

接下来,我们通过导入在SAS程序中使用上述文件。为此,我们使用选项任务 -> 实用程序 -> 导入数据,如下所示。双击导入数据按钮,将在右侧打开一个窗口,用于选择数据集的文件。

接下来,点击右侧窗格中导入数据程序下的选择文件按钮。以下是可导入的文件类型列表。

data_sets_5_import_files

我们选择存储在本地系统中的“employee.txt”文件,并将文件导入,如下所示。

data_sets_4_2_import_utility

查看导入的数据

我们可以使用运行选项运行使用生成的默认导入代码来查看导入的数据。

data_sets_6_view_imported_data

我们可以使用与上述相同的方法导入任何其他文件类型,并在各种SAS程序中使用它。

SAS - 变量

通常,SAS中的变量表示其正在分析的数据表的列名。但它也可以用于其他目的,例如在编程循环中用作计数器。在本章中,我们将看到SAS变量用作SAS数据集列名的用法。

SAS变量类型

SAS有三种类型的变量,如下所示−

数值变量

这是默认变量类型。这些变量用于数学表达式。

语法

INPUT VAR1 VAR2 VAR3; 		#Define numeric variables in the data set.

在上述语法中,INPUT语句显示了数值变量的声明。

示例

INPUT ID SALARY COMM_PERCENT;

字符变量

字符变量用于不用于数学表达式的值。它们被视为文本或字符串。通过在变量名称末尾添加$符号和空格,变量将变为字符变量。

语法

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程序中使用,如下例所示。

示例

以下代码显示了三种变量如何在SAS程序中声明和使用。

DATA TEMP;
INPUT ID NAME $ SALARY DEPT $ DOJ DATE9. ;
FORMAT DOJ DATE9. ;
DATALINES;
1 Rick 623.3 IT 02APR2001
2 Dan 515.2 OPS 11JUL2012
3 Michelle 611 IT 21OCT2000
4 Ryan 729 HR 30JUL2012
5 Gary 843.25 FIN 06AUG2000
6 Tusar 578 IT 01MAR2009
7 Pranab 632.8 OPS 16AUG1998
8 Rasmi 722.5 FIN 13SEP2014
;
PROC PRINT DATA = TEMP;
RUN;

在上面的示例中,所有字符变量的声明后面都跟着一个$符号,日期变量的声明后面跟着日期格式。上面程序的输出如下所示。

SAS_BS_variable_output

使用变量

变量在分析数据中非常有用。它们用于应用统计分析的表达式中。让我们看一个分析名为CARS的内置数据集的示例,该数据集位于Libraries → My Libraries → SASHELP下。双击它以浏览变量及其数据类型。

variable_1_explore_car

接下来,我们可以使用SAS Studio中的任务选项生成一些这些变量的汇总统计信息。转到Tasks -> Statistics -> Summary Statistics并双击它以打开如下所示的窗口。选择数据集SASHELP.CARS,并在“分析变量”下选择三个变量 - MPG_CITY、MPG_Highway和Weight。在选择变量时按住Ctrl键单击。点击运行。

variable_2_select_summary_car

完成上述步骤后,点击结果选项卡。它显示了所选三个变量的统计摘要。最后一列表示分析中使用的观察值(记录)的数量。

variable_3_summary_result_car

SAS - 字符串

SAS中的字符串是包含在一对单引号中的值。此外,字符串变量通过在变量声明末尾添加空格和$符号来声明。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;

运行上述代码后,我们得到输出,其中显示了变量名及其值。

strings_1_concatenate

字符串函数

以下是经常使用的一些SAS函数的示例。

SUBSTRN

此函数使用起始位置和结束位置提取子字符串。如果没有提及结束位置,它将提取到字符串末尾的所有字符。

语法

SUBSTRN('stringval',p1,p2)

以下是所用参数的说明:

  • 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函数的结果。

strings_2_substr

TRIMN

此函数删除字符串后面的空格。

语法

TRIMN('stringval')

以下是所用参数的说明:

  • 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函数的结果。

strings_3_trimn

SAS - 数组

SAS中的数组用于使用索引值存储和检索一系列值。索引表示保留内存区域中的位置。

语法

在SAS中,数组的声明使用以下语法:

ARRAY ARRAY-NAME(SUBSCRIPT) ($) VARIABLE-LIST ARRAY-VALUES

在上述语法中:

  • ARRAY是声明数组的SAS关键字。

  • 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 5 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;

访问数组值

可以使用print过程访问存储在数组中的值,如下所示。在使用上述方法之一声明后,使用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;

当我们执行上述代码时,它会产生以下结果:

array_character_2_result

使用OF运算符

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;

当我们执行上述代码时,它会产生以下结果:

array_of_result

使用IN运算符

还可以使用IN运算符访问数组中的值,该运算符检查数组行中是否存在某个值。在下面的示例中,我们检查数据中是否存在颜色“Yellow”。此值区分大小写。

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;

当我们执行上述代码时,它会产生以下结果:

array_in_result

SAS - 数字格式

SAS可以处理各种各样的数值数据格式。它在变量名的末尾使用这些格式,以将特定的数值格式应用于数据。SAS使用两种数值格式。一种用于读取数值数据的特定格式,称为informat,另一种用于以特定格式显示数值数据,称为output format

语法

数值informat的语法为:

Varname Formatnamew.d

以下是所用参数的说明:

  • Varname是变量的名称。

  • Formatname是应用于变量的数值格式的名称。

  • w是允许为变量存储的最大数据列数(包括小数点后的数字和小数点本身)。

  • d是小数点右边的数字位数。

读取数值格式

以下是用于将数据读入SAS的格式列表。

输入数值格式

格式 用途
n.

最多“n”列,无小数点。

n.p

最多“n”列,有“p”位小数。

COMMAn.p

最多“n”列,有“p”位小数,删除任何逗号或美元符号。

COMMAn.p

最多“n”列,有“p”位小数,删除任何逗号或美元符号。

显示数值格式

类似于在读取数据时应用格式,以下是用于在SAS程序输出中显示数据的格式列表。

输出数值格式

格式 用途
n.

写入最多“n”位数字,无小数点。

n.p

写入最多“n.p”列,有“p”位小数。

DOLLARn.p

写入最多“n”列,有“p”位小数,前导美元符号和千分位逗号。

请注意:

  • 如果小数点后的数字位数小于格式说明符,则在末尾追加零

  • 如果小数点后的数字位数大于格式说明符,则最后一个数字将四舍五入

示例

以下示例说明了上述场景。

DATA MYDATA1;
input x 6.; /*maxiiuum width of the data*/
format x 6.3;
datalines;
8722
93.2
.1122
15.116
PROC PRINT DATA = MYDATA1;
RUN;

DATA MYDATA2;
input x 6.; /*maximum width of the data*/
format x 5.2;
datalines;
8722
93.2
.1122
15.116
PROC PRINT DATA = MYDATA2;
RUN;
DATA MYDATA3;
input x 6.; /*maximum width of the data*/
format x DOLLAR10.2;
datalines;
8722
93.2
.1122
15.116
PROC PRINT DATA = MYDATA3;
RUN;

当我们执行上述代码时,它会产生以下结果:

# MYDATA1.
Obs 	x
1 	8722.0 # Display 6 columns with zero appended after decimal.
2 	93.200 # Display 6 columns with zero appended after decimal.
3 	0.112  # No integers before decimal, so display 3 available digits after decimal.
4 	15.116 # Display 6 columns with 3 available digits after decimal.

# MYDATA2
Obs 	x
1 	8722  # Display 5 columns. Only 4 are available.
2 	93.20 # Display 5 columns with zero appended after decimal.
3 	0.11  # Display 5 columns with 2 places after decimal.
4 	15.12 # Display 5 columns with 2 places after decimal.

# MYDATA3
Obs 	x
1 	$8,722.00 # Display 10 columns with leading $ sign, comma at thousandth place and zeros appended after decimal.
2 	$93.20    # Only 2 integers available before decimal and one available after the decimal.
3 	$0.11	  # No integers available before decimal and two available after the decimal.
4 	$15.12    # Only 2 integers available before decimal and two available after the decimal.

SAS - 运算符

SAS中的运算符是用于数学、逻辑或比较表达式中的符号。这些符号内置于SAS语言中,并且可以在单个表达式中组合多个运算符以提供最终输出。

以下是SAS运算符类别列表。

  • 算术运算符
  • 逻辑运算符
  • 比较运算符
  • 最小/最大运算符
  • 连接运算符

我们将逐一查看每个运算符。运算符始终与作为SAS程序分析的数据一部分的变量一起使用。

算术运算符

下表描述了算术运算符的详细信息。假设有两个数据变量V1V2,其值分别为84

运算符 描述 示例
+ 加法 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.3
3.11  11
;
PROC PRINT DATA = MYDATA1;
RUN;

运行上述代码后,我们得到以下输出。

operators_arithmrtic

逻辑运算符

下表描述了逻辑运算符的详细信息。这些运算符评估表达式的真值。因此,逻辑运算符的结果始终为1或0。假设有两个数据变量V1V2,其值分别为84

运算符 描述 示例
& AND运算符。如果两个数据值都计算为真,则结果为1,否则为0。 (V1>2 & V2 > 3)给出0。
| OR运算符。如果任何一个数据值计算为真,则结果为1,否则为0。 (V1>9 & V2 > 3)为1。
~ NOT运算符。NOT运算符的结果以表达式的形式表示,其值为FALSE或缺失值,则为1,否则为0。 NOT(V1 > 3)为1。

示例

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.3
3.11  11.4
;
PROC PRINT DATA = MYDATA1;
RUN;

运行上述代码后,我们得到以下输出。

operators_logical

比较运算符

下表描述了比较运算符的详细信息。这些运算符比较变量的值,结果是真值,用1表示TRUE,用0表示False。假设有两个数据变量V1V2,其值分别为84

运算符 描述 示例
= EQUAL运算符。如果两个数据值相等,则结果为1,否则为0。 (V1 = 8)给出1。
^= NOT EQUAL运算符。如果两个数据值不相等,则结果为1,否则为0。 (V1 ^= V2)给出1。
< LESS THAN运算符。 (V2 < V2)给出1。
<= LESS THAN or EQUAL TO运算符。 (V2 <= 4)给出1。
> GREATER THAN运算符。 (V2 > V1)给出1。
>= GREATER THAN or EQUAL TO运算符。 (V2 >= V1)给出0。
IN IN运算符。如果变量的值等于给定值列表中的任何一个值,则返回1,否则返回0。 V1 in (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.3
3.11  11.4
;
PROC PRINT DATA = MYDATA1;
RUN;

运行上述代码后,我们得到以下输出。

operators_comparison

最小/最大运算符

下表描述了最小/最大运算符的详细信息。这些运算符比较跨行的变量的值,并返回行中值列表中的最小值或最大值。

运算符 描述 示例
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.012
3.11  11.4 18.512
;
PROC PRINT DATA = MYDATA1;
RUN;

运行上述代码后,我们得到以下输出。

operators_minmax

连接运算符

下表描述了连接运算符的详细信息。此运算符连接两个或多个字符串值。返回单个字符值。

运算符 描述 示例
|| 连接运算符。它返回两个或多个值的连接。 'Hello'||' World'给出Hello World

示例

DATA MYDATA1;
input  COL1 $	COL2 $  COL3 $; 
concat_ = (COL1 || COL2 || COL3);
datalines;
Tutorial s point
simple easy learning
;
PROC PRINT DATA = MYDATA1;
RUN;

运行上述代码后,我们得到以下输出。

operators_concate

运算符优先级

运算符优先级指示复杂表达式中多个运算符的评估顺序。下表描述了运算符组内的优先级顺序。

顺序 符号
组I 从右到左 ** + - NOT MIN MAX
组II 从左到右 * /
组III 从左到右 + -
组IV 从左到右 ||
组V 从左到右 < <= = >= >

SAS - 循环

您可能会遇到需要多次执行代码块的情况。通常,语句按顺序执行:函数中的第一个语句首先执行,然后是第二个语句,依此类推。但是,当您希望同一组语句被反复执行时,我们需要循环的帮助。

在 SAS 中,循环是通过使用 DO 语句来完成的。它也称为 **DO 循环**。下面是 SAS 中 DO 循环语句的一般形式。

流程图

SAS_do_while_loop.jpg

以下是 SAS 中 DO 循环的类型。

序号 循环类型和描述
1 DO Index。

循环从索引变量的起始值持续到结束值。

2 DO WHILE。

循环持续到 while 条件变为假。

3 DO UNTIL。

循环持续到 UNTIL 条件变为真。

SAS - 决策

决策结构要求程序员指定一个或多个条件,由程序进行评估或测试,以及如果条件确定为 **真** 则要执行的语句,以及可选地,如果条件确定为 **假** 则要执行的其他语句。

以下是大多数编程语言中典型的决策结构的一般形式:

Decision Making

SAS 提供以下类型的决策语句。点击以下链接查看它们的详细信息。

序号 语句类型和描述
1 IF 语句。

一个 **if 语句** 包含一个条件。如果条件为真,则获取特定的数据。

2 IF-THEN-ELSE 语句。

一个 **if 语句** 后跟 else 语句,当布尔条件为假时执行。

3 IF-THEN-ELSE-IF 语句。

一个 **if 语句** 后跟 else 语句,该语句又被另一个 IF-THEN 语句对跟随。

4 IF-THEN-DELETE 语句。

一个 **if 语句** 包含一个条件,当条件为真时,从观测值中删除特定数据。

SAS - 函数

SAS 具有各种内置函数,有助于分析和处理数据。这些函数用作 DATA 语句的一部分。它们将数据变量作为参数,并返回存储到另一个变量中的结果。根据函数的类型,它接受的参数数量可能会有所不同。某些函数接受零个参数,而其他函数则接受固定数量的变量。下面是 SAS 提供的函数类型的列表。

语法

在 SAS 中使用函数的一般语法如下。

FUNCTIONNAME(argument1, argument2...argumentn)

这里参数可以是常量、变量、表达式或另一个函数。

函数类别

根据其用途,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;

运行以上代码后,我们将获得以下输出:

math_funcs_result

日期和时间函数

这些函数用于处理日期和时间值。

示例

下面的 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 16AUG1998
01MAR2009 11JUL2012
;
proc print data = date_functions noobs;
run;

运行以上代码后,我们将获得以下输出:

date_time_funcs_result

字符函数

这些函数用于处理字符或文本值。

示例

下面的 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;

运行以上代码后,我们将获得以下输出:

char_funcs_result

截断函数

这些函数用于截断数值。

示例

下面的 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;

运行以上代码后,我们将获得以下输出:

trunc_funcs_result

杂项函数

现在让我们通过一些示例了解 SAS 的杂项函数。

示例

下面的 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;

运行以上代码后,我们将获得以下输出:

Misc_funcs_result

SAS - 输入方法

输入方法用于读取原始数据。原始数据可能来自外部来源或来自流式数据行。input 语句创建一个变量,其名称分配给每个字段。因此,您必须在 Input 语句中创建一个变量。相同的变量将显示在 SAS 数据集的输出中。以下是 SAS 中可用的不同输入方法。

  • 列表输入方法
  • 命名输入方法
  • 列输入方法
  • 格式化输入方法

每种输入方法的详细信息如下所述。

列表输入方法

在这种方法中,变量与数据类型一起列出。仔细分析原始数据,以便声明的变量顺序与数据匹配。分隔符(通常是空格)应在任何一对相邻列之间保持一致。任何缺失数据都会导致输出出现问题,因为结果将不正确。

示例

以下代码和输出显示了列表输入方法的使用。

DATA TEMP;
INPUT   EMPID ENAME $ DEPT $ ;
DATALINES;
1 Rick  IT
2 Dan  OPS
3 Tusar  IT
4 Pranab  OPS
5 Rasmi  FIN
;
PROC PRINT DATA = TEMP;
RUN;

运行上述代码后,我们将获得以下输出。

list_n_named_input

命名输入方法

在这种方法中,变量与数据类型一起列出。原始数据被修改为在匹配数据前面具有声明的变量名。分隔符(通常是空格)应在任何一对相邻列之间保持一致。

示例

以下代码和输出显示了命名输入方法的使用。

DATA TEMP;
INPUT   
EMPID= ENAME= $ DEPT= $ ;
DATALINES;
EMPID = 1 ENAME = Rick  DEPT = IT
EMPID = 2 ENAME = Dan  DEPT = OPS
EMPID = 3 ENAME = Tusar  DEPT = IT
EMPID = 4 ENAME = Pranab  DEPT = OPS
EMPID = 5 ENAME = Rasmi  DEPT = FIN
;
PROC PRINT DATA = TEMP;
RUN;

运行上述代码后,我们将获得以下输出。

list_n_named_input

列输入方法

在这种方法中,变量与数据类型和列的宽度一起列出,这些列指定单个数据列的值。例如,如果员工姓名最多包含 9 个字符,并且每个员工姓名从第 10 列开始,则员工姓名变量的列宽将为 10-19。

示例

以下代码显示了列输入方法的使用。

DATA TEMP;
INPUT   EMPID 1-3 ENAME $ 4-12 DEPT $ 13-16;
DATALINES;
14 Rick     IT 
241Dan      OPS 
30 Sanvi    IT 
410Chanchal OPS 
52 Piyu     FIN 
;
PROC PRINT DATA = TEMP;
RUN;

当我们执行上述代码时,它会产生以下结果:

column_n_formatted_input

格式化输入方法

在这种方法中,变量从固定的起始点读取,直到遇到空格。由于每个变量都有一个固定的起始点,因此任何一对变量之间的列数成为第一个变量的宽度。字符 '@n' 用于将变量的起始列位置指定为第 n 列。

示例

以下代码显示了格式化输入方法的使用

DATA TEMP;
INPUT   @1 EMPID $ @4 ENAME $ @13 DEPT $ ;
DATALINES;
14 Rick     IT 
241 Dan      OPS 
30 Sanvi    IT 
410 Chanchal OPS 
52 Piyu     FIN 
;
PROC PRINT DATA = TEMP;
RUN;

当我们执行上述代码时,它会产生以下结果:

column_n_formatted_input

SAS - 宏

SAS 具有一个强大的编程功能,称为 **宏**,它允许我们避免重复的代码部分,并在需要时反复使用它们。它还有助于在代码中创建动态变量,这些变量可以在相同代码的不同运行实例中采用不同的值。宏也可以为代码块声明,这些代码块将以类似于宏变量的方式多次重复使用。我们将在下面的示例中看到这两者。

宏变量

这些变量保存一个值,供 SAS 程序反复使用。它们在 SAS 程序的开头声明,并在程序主体中稍后调用。它们可以是全局范围或局部范围。

全局宏变量

它们被称为全局宏变量,因为 SAS 环境中可用的任何 SAS 程序都可以访问它们。通常,它们是系统分配的变量,多个程序都可以访问它们。一个常见的例子是系统日期。

示例

下面是一个名为 SYSDATE 的 SAS 变量的示例,它表示系统日期。考虑一个场景,在每天生成报表时,在 SAS 报表的标题中打印系统日期。标题将显示当前日期和日期,而无需我们为它们编码任何值。我们使用名为 CARS 的内置 SAS 数据集,该数据集位于 SASHELP 库中。

proc print data = sashelp.cars;
where make = 'Audi' and type = 'Sports' ;
 TITLE "Sales as of &SYSDAY &SYSDATE";
run;

运行以上代码后,我们将获得以下输出。

global_macro_result

局部宏变量

这些变量可以被声明为程序一部分的 SAS 程序访问。它们通常用于向相同的 SAS 语句提供不同的变量,以便它们可以处理数据集的不同观测值。

语法

局部变量使用以下语法声明。

% LET (Macro Variable Name) = Value;

这里 Value 字段可以根据程序需要采用任何数值、文本或日期值。宏变量名是任何有效的 SAS 变量。

示例

变量由 SAS 语句使用,方法是在变量名的开头附加 **&** 字符。以下程序获取制造商为“奥迪”且类型为“跑车”的所有观测值。如果我们想要 **不同制造商** 的结果,我们需要更改变量 **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;

运行以上代码后,我们将获得与上一个程序相同的输出。但让我们将 **类型名称** 更改为 **'旅行车'** 并运行相同的程序。我们将获得以下结果。

local_macro_result

宏程序

宏是一组 SAS 语句,由一个名称引用,并在程序中的任何位置使用该名称。它以 %MACRO 语句开头,以 %MEND 语句结尾。

语法

局部变量使用以下语法声明。

# Creating a Macro program.
%MACRO <macro name>(Param1, Param2,….Paramn);

Macro Statements;

%MEND;

# Calling a Macro program.
%MacroName (Value1, Value2,…..Valuen);

示例

以下程序在名为 **'show_result'** 的宏下声明一组 SAT 语句;此宏由其他 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);

运行以上代码后,我们将获得以下输出。

program_macro_result

常用宏

SAS 具有许多宏语句,这些语句是 SAS 编程语言中内置的。它们由其他 SAS 程序使用,无需显式声明它们。常见示例包括 - 在满足某些条件时终止程序或在程序日志中捕获变量的运行时值。以下是一些示例。

宏 %PUT

此宏语句将文本或宏变量信息写入 SAS 日志。在以下示例中,变量 'today' 的值被写入程序日志。

data _null_;
CALL SYMPUT ('today',
TRIM(PUT("&sysdate"d,worddate22.)));
run;
%put &today;

运行以上代码后,我们将获得以下输出。

macro_put

宏 %RETURN

执行此宏会导致当前正在执行的宏在某些条件评估为真时正常终止。在以下示例中,当变量 **"val"** 的值变为 10 时,宏终止,否则继续。

%macro check_condition(val);
   %if &val = 10 %then %return;

   data p;
      x = 34.2;
   run;  

%mend check_condition;  

%check_condition(11)  ;

运行以上代码后,我们将获得以下输出。

macro_return

宏 %END

此宏定义包含一个 **%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)

运行以上代码后,我们将获得以下输出。

macro_do_finish

SAS - 日期和时间

在 SAS 中,日期是数值的一种特殊情况。从 1960 年 1 月 1 日开始,每一天都被分配一个特定的数值。此日期被分配日期值 0,下一个日期的日期值为 1,依此类推。此日期之前的日期由 -1、-2 等表示。通过这种方法,SAS 可以表示将来的任何日期和过去的任何日期。

当 SAS 从源读取数据时,它会将读取的数据转换为指定的日期格式。存储日期值的变量用所需的正确 informat 声明。输出日期通过使用输出数据格式显示。

SAS 日期 Informat

源数据可以通过使用特定的日期 informat 正确读取,如下所示。informat 末尾的数字表示要使用 informat 完全读取的日期字符串的最小宽度。较小的宽度将导致错误的结果。在 SAS V9 中,有一个通用的日期格式 **anydtdte15。** 可以处理任何日期输入。

输入日期 日期宽度 Informat
03/11/2014 10 mmddyy10。
03/11/14 8 mmddyy8。
2012 年 12 月 11 日 20 worddate20。
2011 年 3 月 14 日 9 date9。
2011 年 3 月 14 日 11 date11。
2011 年 3 月 14 日 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;

当执行上述代码时,我们将得到以下输出。

date_time_1

SAS日期输出格式

读取日期后,可以根据显示需要将其转换为其他格式。这是通过使用日期类型的格式语句实现的。它们采用与informat相同的格式。

示例

在下面的示例中,日期以一种格式读取,但以另一种格式显示。

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;

当执行上述代码时,我们将得到以下输出。

date_time_2

SAS - 读取原始数据

SAS可以从各种来源读取数据,包括许多文件格式。下面将讨论SAS环境中使用的文件格式。

  • ASCII(文本)数据集
  • 分隔数据
  • Excel数据
  • 层次数据

读取ASCII(文本)数据集

这些文件包含以文本格式存储的数据。数据通常以空格分隔,但也可以使用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;

当执行上述代码时,我们将得到以下输出。

read_raw_data1

读取分隔数据

这些数据文件中的列值以分隔符(如逗号或管道等)分隔。在这种情况下,我们在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;

当执行上述代码时,我们将得到以下输出。

read_raw_data1

读取Excel数据

SAS可以使用导入功能直接读取Excel文件。如SAS数据集章节所示,它可以处理各种文件类型,包括MS Excel。假设文件emp.xls在SAS环境中本地可用。

示例

FILENAME REFFILE
"/folders/myfolders/TutorialsPoint/emp.xls"
TERMSTR = CR;

PROC IMPORT DATAFILE = REFFILE
DBMS = XLS
OUT = WORK.IMPORT;
GETNAMES = YES;
RUN;
PROC PRINT DATA = WORK.IMPORT RUN;

上述代码从Excel文件读取数据,并给出与上述两种文件类型相同的输出。

读取分层文件

在这些文件中,数据以分层格式存在。对于给定的观测值,下面有一个标题记录,其中提到了许多详细记录。详细记录的数量可能因观测值而异。下面是分层文件的示例。

在下面的文件中,列出了每个部门下每个员工的详细信息。第一条记录是标题记录,其中提到了部门,接下来的几条记录以DTLS开头是详细信息记录。

DEPT:IT 
DTLS:1:Rick:623 
DTLS:3:Mike:611 
DTLS:6:Tusar:578 
DEPT:OPS
DTLS:7:Pranab:632
DTLS:2:Dan:452
DEPT:HR
DTLS:4:Ryan:487
DTLS: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;

当执行上述代码时,我们将得到以下输出。

read_heirarchial_data2

SAS - 写入数据集

与读取数据集类似,SAS可以以不同的格式写入数据集。它可以将数据从SAS文件写入普通文本文件。这些文件可以被其他软件程序读取。SAS使用PROC EXPORT来写入数据集。

PROC EXPORT

这是一个SAS内置过程,用于导出SAS数据集以将数据写入不同格式的文件。

语法

在SAS中编写此过程的基本语法为:

PROC EXPORT 
DATA = libref.SAS data-set (SAS data-set-options)
OUTFILE = "filename" 
DBMS = identifier LABEL(REPLACE);

以下是所用参数的说明:

  • SAS数据集是要导出的数据集名称。SAS可以通过创建不同操作系统可以读取的文件,将其环境中的数据集与其他应用程序共享。它使用内置的EXPORT函数以各种格式输出数据集文件。在本章中,我们将看到使用proc export以及dlmdbms选项写入SAS数据集的方法。

  • SAS数据集选项用于指定要导出的列的子集。

  • 文件名是要将数据写入的文件的名称。

  • 标识符用于提及将写入文件的分隔符。

  • LABEL选项用于提及写入文件的变量的名称。

示例

我们将使用SASHELP库中名为cars的SAS数据集。我们将其导出为一个空格分隔的文本文件,代码如下面的程序所示。

proc export data = sashelp.cars
   outfile = '/folders/myfolders/sasuser.v94/TutorialsPoint/car_data.txt'
   dbms = dlm;
   delimiter = ' ';
   run;

执行上述代码后,我们可以看到输出为一个文本文件,并右键单击它以查看其内容,如下所示。

write_data_set_result

写入CSV文件

为了写入逗号分隔的文件,我们可以将dlm选项的值设置为“csv”。以下代码写入文件car_data.csv。

proc export data = sashelp.cars
   outfile = '/folders/myfolders/sasuser.v94/TutorialsPoint/car_data.csv'
   dbms = csv;
   run;

执行上述代码后,我们将得到以下输出。

write_data_set_csv

写入制表符分隔的文件

为了写入制表符分隔的文件,我们可以将dlm选项的值设置为“tab”。以下代码写入文件car_tab.txt。

proc export data = sashelp.cars
   outfile = '/folders/myfolders/sasuser.v94/TutorialsPoint/car_tab.txt'
   dbms = csv;
   run;

数据也可以作为HTML文件写入,我们将在输出交付系统章节中看到。

SAS - 合并数据集

可以使用SET语句将多个SAS数据集连接起来以生成单个数据集。连接数据集中的观测值总数是原始数据集中观测值总数的和。观测值的顺序是连续的。第一个数据集中的所有观测值后面跟着第二个数据集中的所有观测值,依此类推。

理想情况下,所有组合数据集都具有相同的变量,但如果它们具有不同数量的变量,则在结果中将显示所有变量,较小的数据集中的变量将显示缺失值。

语法

SAS中SET语句的基本语法为:

SET data-set 1 data-set 2 data-set 3.....;

以下是所用参数的说明:

  • 数据集1、数据集2是依次写入的数据集名称。

示例

考虑一个组织的员工数据,这些数据存储在两个不同的数据集中,一个用于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;  

当执行上述代码时,我们将得到以下输出。

concateate1

场景

当我们在连接数据集时存在许多差异时,变量的结果可能会有所不同,但连接数据集中观测值的总数始终是每个数据集中观测值的总数。我们将在下面考虑关于此差异的许多场景。

不同数量的变量

如果其中一个原始数据集的变量数量多于另一个,则数据集仍然会合并,但在较小的数据集中,这些变量将显示为缺失。

示例

在下面的示例中,第一个数据集有一个额外的名为DOJ的变量。在结果中,第二个数据集的DOJ值将显示为缺失。

DATA ITDEPT; 
   INPUT empid name $ salary DOJ date9.  ; 
DATALINES; 
1 Rick 623.3 02APR2001
3 Mike 611.5 21OCT2000
6 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;  

当执行上述代码时,我们将得到以下输出。

concateate2

不同的变量名

在这种情况下,数据集具有相同数量的变量,但它们之间的一个变量名称不同。在这种情况下,正常的连接将在结果集中生成所有变量,并为两个不同的变量提供缺失结果。虽然我们可能不会更改原始数据集中的变量名称,但我们可以在创建的连接数据集中应用RENAME函数。这将产生与正常连接相同的结果,当然,在一个新变量名称代替原始数据集中存在的两个不同变量名称。

示例

在下面的示例中,数据集ITDEPT的变量名为ename,而数据集NON_ITDEPT的变量名为empname。但这两个变量都表示相同的类型(字符)。我们像下面所示在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;  

当执行上述代码时,我们将得到以下输出。

concateate3

不同的变量长度

如果两个数据集中变量的长度不同,则连接数据集将包含一些数据被截断的值,这些值的变量长度较小。如果第一个数据集的长度较小,就会发生这种情况。要解决此问题,我们可以将较高的长度应用于两个数据集,如下所示。

示例

在下面的示例中,变量ename在第一个数据集中长度为5,在第二个数据集中长度为7。在连接时,我们在连接的数据集中应用LENGTH语句将ename长度设置为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.25
7 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;  

当执行上述代码时,我们将得到以下输出。

concateate4

SAS - 合并数据集

多个SAS数据集可以基于特定的公共变量合并以生成单个数据集。这是使用MERGE语句和BY语句完成的。合并数据集中观测值的总数通常小于原始数据集中观测值总数的和。这是因为当公共变量的值匹配时,来自两个数据集的变量将合并为一条记录。

下面给出了合并数据集的两个先决条件:

  • 输入数据集必须至少有一个公共变量才能进行合并。
  • 输入数据集必须按将用于合并的公共变量排序。

语法

SAS中MERGE和BY语句的基本语法为:

MERGE Data-Set 1 Data-Set 2
BY Common Variable

以下是所用参数的说明:

  • 数据集1、数据集2是依次写入的数据集名称。

  • 公共变量是根据其匹配值合并数据集的变量。

数据合并

让我们通过一个示例了解数据合并。

示例

考虑两个SAS数据集,一个包含员工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 2
ID DEPT
1 IT 
2 OPS
3 IT 
4 HR 
5 FIN 
6 IT 
7 OPS
8 FIN 

# Merged data set
ID 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  OPS
8 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 OPS
3 IT 
4 HR 
5 FIN 
6 IT 
7 OPS
8 FIN 
;
RUN; 
DATA All_details;
MERGE SALARY DEPT;
BY (empid);
RUN;
PROC PRINT DATA = All_details; 
RUN;  

匹配列中的缺失值

在某些情况下,公共变量的一些值在数据集之间可能不匹配。在这种情况下,数据集仍然会合并,但在结果中会显示缺失值。

示例

考虑数据集salary中缺少员工ID 3,数据集DEPT中缺少员工ID 6的情况。当应用上述代码时,我们将得到以下结果。

ID NAME SALARY DEPT	
1 Rick 623.3	IT 		 
2 Dan 515.2 	OPS	
3 .		.		IT
4 Ryan 729.1    HR 
5 Gary 843.25   FIN 
6 Tusar 578.6   .
7 Pranab 632.8  OPS
8 Rasmi 722.5   FIN 

仅合并匹配项

为了避免结果中的缺失值,我们可以考虑只保留公共变量匹配值的观测值。这是通过使用IN语句实现的。SAS程序的merge语句需要更改。

示例

在下面的示例中,IN=值仅保留来自两个数据集SALARYDEPT的值匹配的观测值。

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  OPS
8 Rasmi 722.5   FIN 

SAS - 子集数据集

子集化SAS数据集意味着通过选择较少的变量或较少的观测值(或两者)来提取数据集的一部分。虽然变量的子集化是通过使用KEEPDROP语句完成的,但观测值的子集化是使用DELETE语句完成的。

此外,子集化操作产生的结果数据保存在一个新数据集中,该数据集可用于进一步分析。子集化主要用于分析数据集的一部分,而不使用与分析无关的变量或观测值。

子集化变量

在这种方法中,我们仅从整个数据集中提取一些变量。

语法

SAS中子集化变量的基本语法为:

KEEP var1 var2 ... ;
DROP var1 var2 ... ;

以下是所用参数的说明:

  • var1和var2是要保留或删除的数据集中的变量名称。

示例

考虑以下包含组织员工详细信息的SAS数据集。如果我们只对获取数据集中的姓名和部门值感兴趣,则可以使用以下代码。

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  OPS
8 Rasmi 722.5   FIN 
;
RUN;
DATA OnlyDept;
   SET Employee;
   KEEP ename DEPT;
   RUN;
   PROC PRINT DATA = OnlyDept; 
RUN; 

当执行上述代码时,我们将得到以下输出。

subsetting1

可以通过删除不需要的变量来获得相同的结果。以下代码说明了这一点。

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  OPS
8 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 ;

以下是所用参数的说明:

  • Var 是变量的名称,根据其值将使用指定的条件删除观测值。

示例

考虑以下包含组织员工详细信息的 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  OPS
8 Rasmi 722.5   FIN 
;
RUN;
DATA OnlyDept;
   SET Employee;
   IF salary < 700 THEN DELETE;
   RUN;
   PROC PRINT DATA = OnlyDept; 
RUN; 

当执行上述代码时,我们将得到以下输出。

subsetting2

SAS - 格式化数据集

有时我们希望以与数据集中已存在格式不同的格式显示分析数据。例如,我们希望为包含价格信息的变量添加美元符号和小数点后两位。或者我们可能希望将文本变量全部显示为大写。我们可以使用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  OPS
8 Rasmi 722.5   FIN 
;
RUN;
   PROC PRINT DATA = Employee; 
RUN; 

当执行上述代码时,我们将得到以下输出。

format1

使用 PROC FORMAT

我们还可以使用PROC FORMAT 格式化数据。在下面的示例中,我们为变量 DEPT 分配新值,扩展部门的名称。

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 OPS
8 Rasmi 722.5 FIN 
;
proc format;
value $DEP 'IT' = 'Information Technology'
      'OPS'= 'Operations' ;
RUN;
   PROC PRINT DATA = Employee; 
   format name $upcase9. DEPT $DEP.; 
RUN; 

当执行上述代码时,我们将得到以下输出。

format2

SAS - SQL

SAS 通过在 SAS 程序中使用 SQL 查询,对大多数流行的关系数据库提供了广泛的支持。大多数ANSI SQL 语法都受支持。PROC SQL 过程用于处理 SQL 语句。此过程不仅可以返回 SQL 查询的结果,还可以创建 SAS 表和变量。下面描述了所有这些场景的示例。

语法

在 SAS 中使用 PROC SQL 的基本语法如下:

PROC SQL;
SELECT Columns
FROM TABLE
WHERE Columns
GROUP BY Columns
;
QUIT;

以下是所用参数的说明:

  • SQL 查询写在 PROC SQL 语句之后,后跟 QUIT 语句。

下面我们将看到如何在 SQL 中使用此 SAS 过程进行CRUD(创建、读取、更新和删除)操作。

SQL 创建操作

使用 SQL,我们可以从原始数据创建新的数据集。在下面的示例中,我们首先声明一个名为 TEMP 的数据集,其中包含原始数据。然后,我们编写一个 SQL 查询以从此数据集的变量创建表。

DATA TEMP;
INPUT ID $ NAME $ SALARY DEPARTMENT $;
DATALINES;
1 Rick 623.3 IT
2 Dan 515.2 Operations
3 Michelle 611 IT
4 Ryan 729 HR
5 Gary 843.25 Finance
6 Nina 578 IT
7 Simon 632.8 Operations
8 Guru 722.5 Finance
;
RUN;

PROC SQL;
CREATE TABLE EMPLOYEES AS
SELECT * FROM TEMP;
QUIT;

PROC PRINT data = EMPLOYEES;
RUN;

执行上述代码后,我们将获得以下结果:

SQL_create_table

SQL 读取操作

SQL 中的读取操作涉及编写 SQL SELECT 查询以读取表中的数据。在下面的程序中,查询了库 SASHELP 中名为 CARS 的 SAS 数据集。查询获取数据集的一些列。

PROC SQL;
SELECT make,model,type,invoice,horsepower
FROM 
SASHELP.CARS
;
QUIT;

执行上述代码后,我们将获得以下结果:

SQL1

带 WHERE 子句的 SQL SELECT

下面的程序使用where 子句查询 CARS 数据集。在结果中,我们仅获取制造商为“Audi”且类型为“Sports”的观测值。

PROC SQL;
SELECT make,model,type,invoice,horsepower
FROM 
SASHELP.CARS
Where make = 'Audi'
and Type = 'Sports'
;
QUIT;

执行上述代码后,我们将获得以下结果:

SQL_where_clause

SQL 更新操作

我们可以使用 SQL Update 语句更新 SAS 表。下面我们首先创建一个名为 EMPLOYEES2 的新表,然后使用 SQL UPDATE 语句更新它。

DATA TEMP;
INPUT ID $ NAME $ SALARY DEPARTMENT $;
DATALINES;
1 Rick 623.3 IT
2 Dan 515.2 Operations
3 Michelle 611 IT
4 Ryan 729 HR
5 Gary 843.25 Finance
6 Nina 578 IT
7 Simon 632.8 Operations
8 Guru 722.5 Finance
;
RUN;

PROC SQL;
CREATE TABLE EMPLOYEES2 AS
SELECT ID as EMPID,
Name as EMPNAME ,
SALARY as SALARY,
DEPARTMENT as DEPT,
SALARY*0.23 as COMMISION
FROM TEMP;
QUIT;

PROC SQL;
UPDATE EMPLOYEES2
      SET SALARY = SALARY*1.25;
   QUIT;
      PROC PRINT data = EMPLOYEES2;
RUN;

执行上述代码后,我们将获得以下结果:

proc_sql_update.JPG

SQL 删除操作

SQL 中的删除操作涉及使用 SQL DELETE 语句从表中删除某些值。我们继续使用上述示例中的数据,并删除表中员工薪资大于 900 的行。

PROC SQL;
DELETE FROM EMPLOYEES2
      WHERE SALARY > 900;
QUIT;
      PROC PRINT data = EMPLOYEES2;
RUN;

执行上述代码后,我们将获得以下结果:

proc_sql_delete.JPG

SAS - ODS

SAS 程序的输出可以转换为更用户友好的形式,例如.htmlPDF。 这是通过使用 SAS 中可用的ODS 语句完成的。ODS 代表输出交付系统。 它主要用于将 SAS 程序的输出数据格式化为漂亮的报表,这些报表易于查看和理解。这也有助于与其他平台和软件共享输出。它还可以将来自多个 PROC 语句的结果组合到一个文件中。

语法

在 SAS 中使用 ODS 语句的基本语法如下:

ODS outputtype
PATH path name
FILE = Filename and Path
STYLE = StyleName
;
PROC some proc
;
ODS outputtype CLOSE;

以下是所用参数的说明:

  • PATH 表示在 HTML 输出的情况下使用的语句。在其他类型的输出中,我们在文件名中包含路径。

  • Style 表示 SAS 环境中可用的内置样式之一。

创建 HTML 输出

我们使用 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.cars
where make in ('Audi','BMW')
and type = 'Sports'
;
quit;

proc SQL;
select make,mean(horsepower)as meanhp
from sashelp.cars
where make in ('Audi','BMW')
group by make;
quit;

ODS HTML CLOSE; 

执行上述代码后,我们将获得以下结果:

ods_html_output

创建 PDF 输出

在下面的示例中,我们在所需的路径中创建了一个 PDF 文件。我们应用样式库中可用的样式。我们可以在提到的路径中查看输出文件,并且可以将其下载以保存在与 SAS 环境不同的环境中。请注意,我们有两个 proc SQL 语句,并且它们的输出都捕获到一个文件中。

ODS PDF 
   FILE = '/folders/myfolders/sasuser.v94/TutorialsPoint/CARS2.pdf'
   STYLE = EGDefault;
proc SQL;
select make, model, invoice 
from sashelp.cars
where make in ('Audi','BMW')
and type = 'Sports'
;
quit;

proc SQL;
select make,mean(horsepower)as meanhp
from sashelp.cars
where make in ('Audi','BMW')
group by make;
quit;

ODS PDF CLOSE; 

执行上述代码后,我们将获得以下结果:

ods_pdf_output.JPG

创建 TRF(Word)输出

在下面的示例中,我们在所需的路径中创建了一个 RTF 文件。我们应用样式库中可用的样式。我们可以在提到的路径中查看输出文件,并且可以将其下载以保存在与 SAS 环境不同的环境中。请注意,我们有两个 proc SQL 语句,并且它们的输出都捕获到一个文件中。

ODS RTF 
FILE = '/folders/myfolders/sasuser.v94/TutorialsPoint/CARS.rtf'
STYLE = EGDefault;
proc SQL;
select make, model, invoice 
from sashelp.cars
where make in ('Audi','BMW')
and type = 'Sports'
;
quit;

proc SQL;
select make,mean(horsepower)as meanhp
from sashelp.cars
where make in ('Audi','BMW')
group by make;
quit;

ODS rtf CLOSE; 

执行上述代码后,我们将获得以下结果:

ods_rtf_output

SAS - 模拟

模拟是一种计算技术,它对许多不同的随机样本进行重复计算以估计统计量。使用 SAS,我们可以模拟具有现实世界系统中指定统计属性的复杂数据。我们使用软件构建系统的模型,并以数字方式生成可用于更好地理解现实世界系统行为的数据。设计计算机模拟模型的部分技巧是确定哪些方面的现实生活系统需要包含在模型中,以便模型生成的数据可用于做出有效决策。由于这种复杂性,SAS 拥有一个专用于模拟的软件组件。

用于创建 SAS 模拟的 SAS 软件组件称为SAS Simulation Studio。其图形用户界面提供了一套完整的工具,用于构建、执行和分析离散事件模拟模型的结果。

下面列出了 SAS 模拟可以应用的不同类型的统计分布。

  • 从连续分布模拟数据
  • 从离散分布模拟数据
  • 从混合分布模拟数据
  • 从复杂分布模拟数据
  • 从多变量分布模拟数据
  • 逼近抽样分布
  • 评估回归估计

SAS - 直方图

直方图是使用不同高度的条形显示数据的图形显示。它将数据集中各种数字分组到许多范围内。它还表示连续变量的概率分布估计。在 SAS 中,PROC UNIVARIATE 用于使用以下选项创建直方图。

语法

在 SAS 中创建直方图的基本语法如下:

PROC UNIVARAITE DATA = DATASET;
HISTOGRAM variables;
RUN;

以下是使用参数的描述:

  • 数据集 是使用的数据集的名称。

  • 变量 是用于绘制直方图的值。

简单直方图

通过指定变量的名称和要考虑的范围来对值进行分组,可以创建简单的直方图。

示例

在下面的示例中,我们考虑变量 horsepower 的最小值和最大值,并取 50 的范围。因此,值以 50 为步长形成一个组。

proc univariate data = sashelp.cars;
   histogram horsepower
   / midpoints = 176 to 350 by 50;
run;

执行上述代码后,我们将获得以下输出:

histogram1

带曲线拟合的直方图

我们可以使用其他选项将一些分布曲线拟合到直方图中。

示例

在下面的示例中,我们拟合一个分布曲线,其均值和标准差值分别表示为 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;

执行上述代码后,我们将获得以下输出:

histogram2

SAS - 条形图

条形图以矩形条形表示数据,条形的长度与变量的值成正比。SAS 使用PROC SGPLOT 过程创建条形图。我们可以在条形图中绘制简单条形和堆叠条形。在条形图中,每个条形都可以赋予不同的颜色。

语法

在 SAS 中创建条形图的基本语法如下:

PROC SGPLOT DATA = DATASET;
VBAR variables;
RUN;

以下是使用参数的描述:

  • 数据集 - 是使用的数据集的名称。

  • 变量 - 是用于绘制直方图的值。

简单条形图

简单条形图是条形图,其中数据集中的变量表示为条形。

示例

以下脚本将创建一个条形图,其中汽车的长度表示为条形。

PROC SQL;
create table CARS1 as
SELECT make, model, type, invoice, horsepower, length, weight
   FROM 
   SASHELP.CARS
   WHERE make in ('Audi','BMW')
;
RUN;

proc SGPLOT data = work.cars1;
vbar length ;
title 'Lengths of cars';
run;
quit;

执行上述代码后,我们将获得以下输出:

barchart1

堆叠条形图

堆叠条形图是条形图,其中数据集中的变量相对于另一个变量进行计算。

示例

以下脚本将创建一个堆叠条形图,其中汽车的长度针对每种汽车类型进行计算。我们使用 group 选项来指定第二个变量。

proc SGPLOT data = work.cars1;
vbar length /group = type ;
title 'Lengths of Cars by Types';
run;
quit;

执行上述代码后,我们将获得以下输出:

barchart2

聚类条形图

创建聚类条形图是为了显示变量的值如何在文化中分布。

示例

以下脚本将创建一个聚类条形图,其中汽车的长度围绕汽车类型进行聚类。因此,我们在长度 191 处看到两个相邻的条形,一个用于汽车类型“Sedan”,另一个用于汽车类型“Wagon”。

proc SGPLOT data = work.cars1;
vbar length /group = type GROUPDISPLAY = CLUSTER;
title 'Cluster of Cars by Types';
run;
quit;

执行上述代码后,我们将获得以下输出:

barchart3

SAS - 饼图

饼图是将值表示为圆的不同颜色切片的表示形式。切片被标记,并且与每个切片相对应的数字也显示在图表中。

在 SAS 中,饼图是使用PROC TEMPLATE 创建的,它接受参数来控制百分比、标签、颜色、标题等。

语法

在 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 as
SELECT make, model, type, invoice, horsepower, length, weight
 FROM 
SASHELP.CARS
WHERE 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;

执行上述代码后,我们将获得以下输出:

piechart1

带数据标签的饼图

在此饼图中,我们表示每个切片的比例值和百分比值。我们还将标签的位置更改为图表内部。图表的显示样式通过使用 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;

执行上述代码后,我们将获得以下输出:

piechart2

分组饼图

在此饼图中,图中显示的变量的值相对于同一数据集的另一个变量进行分组。每个组都成为一个圆,图表中包含与可用组数量一样多的同心圆。

示例

在下面的示例中,我们根据名为“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;

执行上述代码后,我们将获得以下输出:

piechart3

SAS - 散点图

散点图是一种图表类型,它使用笛卡尔平面中绘制的两个变量的值。它通常用于找出两个变量之间的关系。在 SAS 中,我们使用PROC SGSCATTER 创建散点图。

请注意,我们在第一个示例中创建了名为 CARS1 的数据集,并在所有后续数据集中使用相同的数据集。此数据集在 SAS 会话结束前一直保留在工作库中。

语法

在 SAS 中创建散点图的基本语法如下:

PROC sgscatter  DATA = DATASET;
   PLOT VARIABLE_1 * VARIABLE_2
   / datalabel = VARIABLE group = VARIABLE;
RUN;

以下是使用参数的描述:

  • 数据集是数据集的名称。

  • 变量是从数据集中使用的变量。

简单散点图

在简单散点图中,我们从数据集中选择两个变量,并根据第三个变量对它们进行分组。我们还可以标记数据。结果显示了这两个变量在笛卡尔平面上的散布情况。

示例

PROC SQL;
create table CARS1 as
SELECT make, model, type, invoice, horsepower, length, weight
FROM 
SASHELP.CARS
WHERE 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; 

执行上述代码后,我们将获得以下输出:

sactter_plot1

带预测的散点图

我们可以使用一个估计参数来预测相关性的强度,方法是在值周围绘制一个椭圆。我们使用过程中的附加选项来绘制椭圆,如下所示。

示例

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 --'
; 
format
Invoice dollar6.0;
run;

执行上述代码后,我们将获得以下输出:

sactter_plot_eliipse

散点矩阵

我们还可以通过将多个变量分组为对来创建包含多个变量的散点图。在下面的示例中,我们考虑三个变量并绘制一个散点图矩阵。我们得到 3 对结果矩阵。

示例

PROC sgscatter  DATA = CARS1;
   matrix horsepower invoice length
   / group = type;

   title 'Horsepower vs. Invoice vs. Length for car makers by types';
RUN; 

执行上述代码后,我们将获得以下输出:

sactter_plot_matrix

SAS - 箱线图

箱线图是通过其四分位数对数值数据组进行图形表示。箱线图也可能在框的垂直方向上延伸线条(须线),表示上四分位数和下四分位数之外的可变性。框的底部和顶部始终是第一和第三四分位数,框内的带状区域始终是第二四分位数(中位数)。在 SAS 中,使用PROC SGPLOT创建简单的箱线图,使用PROC SGPANEL创建面板箱线图。

请注意,我们在第一个示例中创建了名为 CARS1 的数据集,并在所有后续数据集中使用相同的数据集。此数据集在 SAS 会话结束前一直保留在工作库中。

语法

在 SAS 中创建箱线图的基本语法如下:

PROC SGPLOT  DATA = DATASET;
   VBOX VARIABLE / category = VARIABLE;
RUN; 

PROC SGPANEL  DATA = DATASET;;
PANELBY VARIABLE;
   VBOX VARIABLE> / category = VARIABLE;
RUN; 

以下是使用参数的描述:

  • 数据集 - 是使用的数据集的名称。

  • 变量- 用于绘制箱线图的值。

简单箱线图

在简单箱线图中,我们从数据集中选择一个变量,并选择另一个变量来形成一个类别。第一个变量的值被分类为与第二个变量中不同值的个数一样多的组。

示例

在下面的示例中,我们选择变量 horsepower 作为第一个变量,选择 type 作为类别变量。因此,我们得到了每种类型的汽车的马力值分布的箱线图。

PROC SQL;
create table CARS1 as
SELECT make, model, type, invoice, horsepower, length, weight
   FROM 
   SASHELP.CARS
   WHERE make in ('Audi','BMW')
;
RUN;

PROC SGPLOT  DATA = CARS1;
   VBOX horsepower 
   / category = type;

   title 'Horsepower of cars by types';
RUN; 

执行上述代码后,我们将获得以下输出:

box_plot_1

垂直面板中的箱线图

我们可以将一个变量的箱线图分成多个垂直面板(列)。每个面板包含所有类别变量的箱线图。但是,箱线图将使用另一个第三个变量进一步分组,该变量将图形划分为多个面板。

示例

在下面的示例中,我们使用变量“make”对图形进行了面板化。由于“make”有两个不同的值,因此我们得到两个垂直面板。

PROC SGPANEL  DATA = CARS1;
PANELBY MAKE;
   VBOX horsepower   / category = type;

   title 'Horsepower of cars by types';
RUN; 

执行上述代码后,我们将获得以下输出:

box_plot_2

水平面板中的箱线图

我们可以将一个变量的箱线图分成多个水平面板(行)。每个面板包含所有类别变量的箱线图。但是,箱线图将使用另一个第三个变量进一步分组,该变量将图形划分为多个面板。在下面的示例中,我们使用变量“make”对图形进行了面板化。由于“make”有两个不同的值,因此我们得到两个水平面板。

PROC SGPANEL  DATA = CARS1;
PANELBY MAKE / columns = 1 novarname;

   VBOX horsepower   / category = type;

   title 'Horsepower of cars by types';
RUN; 

执行上述代码后,我们将获得以下输出:

box_plot_3

SAS - 算术平均数

算术平均值是通过对数值变量的值求和,然后将和除以变量个数得到的值。它也称为平均值。在 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;

执行上述代码后,我们将获得以下输出:

Mean

选择变量的平均值

我们可以通过在var选项中提供变量名称来获取一些变量的平均值。

示例

在下面,我们计算三个变量的平均值。

PROC MEANS DATA = sashelp.CARS mean SUM MAXDEC=2 ;
var horsepower invoice EngineSize;
RUN;

执行上述代码后,我们将获得以下输出:

Mean_select_variables

按类别计算平均值

我们可以通过使用其他一些变量将数值变量组织成组来找到它们的平均值。

示例

在下面的示例中,我们找到了每种类型的汽车在每种制造商下的马力变量的平均值。

PROC MEANS DATA = sashelp.CARS mean SUM MAXDEC=2;
class make type;
var horsepower;
RUN;

执行上述代码后,我们将获得以下输出:

mean_with_class

SAS - 标准差

标准差 (SD) 是衡量数据集中数据变化程度的指标。从数学上讲,它衡量每个值与数据集的平均值的距离或接近程度。接近 0 的标准差值表示数据点倾向于非常接近数据集的平均值,而较高的标准差值表示数据点分布在较宽的值范围内。

在 SAS 中,SD 值是使用 PROC MEAN 和 PROC SURVEYMEANS 测量的。

使用 PROC MEANS

要使用proc means测量 SD,我们在 PROC 步骤中选择 STD 选项。它会显示数据集中每个数值变量的 SD 值。

语法

在 SAS 中计算标准差的基本语法如下:

PROC means DATA = dataset STD;

以下是所用参数的说明:

  • 数据集- 是数据集的名称。

示例

在下面的示例中,我们从 SASHELP 库中的 CARS 数据集中创建 CARS1 数据集。我们在 PROC means 步骤中选择 STD 选项。

PROC SQL;
create table CARS1 as
SELECT make, type, invoice, horsepower, length, weight
   FROM 
   SASHELP.CARS
   WHERE make in ('Audi','BMW')
;
RUN;

proc means data = CARS1 STD;
run;

当我们执行上述代码时,它会给出以下输出:

SD_1.JPG

使用 PROC SURVEYMEANS

此过程也用于测量 SD,以及一些高级功能,例如测量分类变量的 SD 以及提供方差估计。

语法

使用 PROC SURVEYMEANS 的语法如下:

PROC SURVEYMEANS options statistic-keywords ;
BY variables ;
CLASS variables ;
VAR variables ;

以下是所用参数的说明:

  • BY- 指示用于创建观测值组的变量。

  • CLASS- 指示用于分类变量的变量。

  • VAR- 指示将为其计算 SD 的变量。

示例

下面的示例描述了class选项的使用,该选项为类别变量中的每个值创建统计数据。

proc surveymeans data = CARS1 STD;
class type;
var type horsepower;
ods output statistics = rectangle;
run;
proc print data = rectangle;
run;

当我们执行上述代码时,它会给出以下输出:

SD_2.JPG

使用 BY 选项

以下代码给出了 BY 选项的示例。在其中,结果按 BY 选项中的每个值进行分组。

示例

proc surveymeans data = CARS1 STD;
var horsepower;
BY make;
ods output statistics = rectangle;
run;
proc print data = rectangle;
run;

当我们执行上述代码时,它会给出以下输出:

make = "Audi" 的结果

SD_3.JPG

make = "BMW" 的结果

SD_3.JPG

SAS - 频率分布

频率分布表显示了数据集中数据点的频率。表中的每个条目都包含特定组或区间内值出现的频率或计数,并以此方式总结样本中值的分布。

SAS 提供了一个名为PROC FREQ的过程来计算数据集中数据点的频率分布。

语法

在 SAS 中计算频率分布的基本语法如下:

PROC FREQ DATA = Dataset ;
TABLES Variable_1 ;
BY Variable_2 ;

以下是所用参数的说明:

  • 数据集是数据集的名称。

  • 变量_1是需要计算其频率分布的数据集的变量名称。

  • 变量_2是将频率分布结果分类的变量。

单变量频率分布

我们可以使用PROC FREQ确定单个变量的频率分布。在这种情况下,结果将显示变量每个值的频率。结果还显示百分比分布、累积频率和累积百分比。

示例

在下面的示例中,我们找到了名为CARS1的数据集(从库SASHELP.CARS创建)的变量 horsepower 的频率分布。我们可以看到结果分为两类。一类是每种汽车的制造商。

PROC SQL;
create table CARS1 as
SELECT make, model, type, invoice, horsepower, length, weight
   FROM 
   SASHELP.CARS
   WHERE make in ('Audi','BMW')
;
RUN;

proc FREQ data = CARS1 ;
tables horsepower; 
by make;
run;

执行上述代码后,我们将获得以下结果:

FREQ_By2

多变量频率分布

我们可以找到多个变量的频率分布,这些变量将它们分组为所有可能的组合。

示例

在下面的示例中,我们计算了汽车制造商的频率分布(按汽车类型分组),以及每种类型的汽车的频率分布(按每种制造商分组)。

proc FREQ data = CARS1 ;
tables make type; 
run;

执行上述代码后,我们将获得以下结果:

FREQ_tables1

带权重的频率分布

使用权重选项,我们可以计算出受变量权重影响的频率分布。在这里,变量的值被视为观测值的数量,而不是值的计数。

示例

在下面的示例中,我们计算了变量 make 和 type 的频率分布,并将权重分配给 horsepower。

proc FREQ data = CARS1 ;
tables make type; 
weight horsepower;
run;

执行上述代码后,我们将获得以下结果:

FREQ_tables3

SAS - 交叉表

交叉表涉及使用两个或多个变量的所有可能组合生成交叉表,也称为列联表。在 SAS 中,它是使用PROC FREQ以及TABLES选项创建的。例如 - 如果我们需要每种类型的汽车中每种制造商的每种型号的频率,那么我们需要使用 PROC FREQ 的 TABLES 选项。

语法

在 SAS 中应用交叉表的基本语法如下:

PROC FREQ DATA = dataset;
TABLES variable_1*Variable_2;

以下是所用参数的说明:

  • 数据集是数据集的名称。

  • 变量_1 和变量_2是需要计算其频率分布的数据集的变量名称。

示例

考虑查找从数据集 cars1(从SASHELP.CARS创建)中每种汽车品牌下有多少种汽车类型的情况,如下所示。在这种情况下,我们需要各个频率值以及跨制造商和跨类型的频率值之和。我们可以观察到结果显示了跨行和跨列的值。

PROC SQL;
create table CARS1 as
SELECT make, type, invoice, horsepower, length, weight
   FROM 
   SASHELP.CARS
   WHERE make in ('Audi','BMW')
;
RUN;

proc FREQ data = CARS1;
tables make*type; 
run;

执行上述代码后,我们将获得以下结果:

cross_tab_1

3 个变量的交叉表

当我们有三个变量时,我们可以将其中两个变量分组,并将这两个变量中的每一个与第三个变量进行交叉制表。因此,在结果中,我们有两个交叉表。

示例

在下面的示例中,我们找到了每种类型的汽车和每种型号的汽车相对于汽车制造商的频率。此外,我们使用 nocol 和 norow 选项来避免总和和百分比值。

proc FREQ data = CARS2 ;
tables make * (type model)  / nocol norow nopercent;   
run;

执行上述代码后,我们将获得以下结果:

cross_tab_2

4 个变量的交叉表

对于 4 个变量,配对组合的数量增加到 4。组 1 中的每个变量都与组 2 中的每个变量配对。

示例

在下面的示例中,我们找到了每种制造商和每种型号的汽车长度的频率。同样,每种制造商和每种型号的马力的频率。

proc FREQ data = CARS2 ;
tables (make model) * (length  horsepower)  / nocol norow nopercent;   
run;

执行上述代码后,我们将获得以下结果:

cross_tab_3

SAS - T检验

T 检验用于通过比较其均值和均值差异来计算一个样本或两个独立样本的置信限。名为PROC TTEST的 SAS 过程用于对单个变量和变量对执行 t 检验。

语法

在SAS中应用PROC TTEST的基本语法如下:

PROC TTEST DATA = dataset;
VAR variable;
CLASS Variable;
PAIRED Variable_1 * Variable_2;

以下是所用参数的说明:

  • 数据集是数据集的名称。

  • Variable_1和Variable_2是t检验中使用的变量名称。

示例

下面我们来看一个单样本t检验的例子,其中找到变量horsepower的t检验估计值,置信区间为95%。

PROC SQL;
create table CARS1 as
SELECT make, type, invoice, horsepower, length, weight
   FROM 
   SASHELP.CARS
   WHERE make in ('Audi','BMW')
;
RUN;

proc ttest data = cars1 alpha = 0.05 h0 = 0;
 	var horsepower;
   run;

执行上述代码后,我们将获得以下结果:

t_test_1

配对t检验

配对t检验用于检验两个相关变量之间是否存在统计学上的显著差异。

示例

由于汽车的长度和重量是相互依赖的,因此我们应用配对t检验,如下所示。

proc ttest data = cars1 ;
   paired weight*length;
   run;

执行上述代码后,我们将获得以下结果:

t_test_2

双样本t检验

此t检验旨在比较两组之间同一变量的均值。

示例

在我们的例子中,我们比较了两种不同汽车品牌(“奥迪”和“宝马”)之间变量horsepower的均值。

proc ttest data = cars1 sides = 2 alpha = 0.05 h0 = 0;
   title "Two sample t-test example";
   class make; 
   var horsepower;
   run;

执行上述代码后,我们将获得以下结果:

t_test_3

SAS - 相关分析

相关分析处理变量之间的关系。相关系数是衡量两个变量之间线性关联程度的指标。相关系数的值始终介于-1和+1之间。SAS提供了PROC CORR过程来查找数据集中的变量对之间的相关系数。

语法

在SAS中应用PROC CORR的基本语法如下:

PROC CORR DATA = dataset options;
VAR variable;

以下是所用参数的说明:

  • 数据集是数据集的名称。

  • Options是过程的附加选项,例如绘制矩阵等。

  • Variable是用于查找相关性的数据集的变量名称。

示例

可以通过在VAR语句中使用变量名来获取数据集中变量对之间的相关系数。在下面的示例中,我们使用数据集CARS1,并获得结果,显示horsepower和weight之间的相关系数。

PROC SQL;
create table CARS1 as
SELECT invoice, horsepower, length, weight
   FROM 
   SASHELP.CARS
   WHERE make in ('Audi','BMW')
;
RUN;

proc corr data = cars1 ;
VAR horsepower weight ;
BY make;
run;

执行上述代码后,我们将获得以下结果:

corr_ana_2

所有变量之间的相关性

可以通过简单地应用该过程和数据集名称来获得数据集中所有可用变量之间的相关系数。

示例

在下面的示例中,我们使用数据集CARS1,并获得结果,显示每对变量之间的相关系数。

proc corr data = cars1 ;
run;

执行上述代码后,我们将获得以下结果:

corr_ana_1

相关矩阵

我们可以通过在PROC语句中选择绘制矩阵选项来获取变量之间的散点图矩阵。

示例

在下面的示例中,我们获取了horsepower和weight之间的矩阵。

proc corr data = cars1 plots = matrix ;
VAR horsepower weight ;
run;

执行上述代码后,我们将获得以下结果:

corr_ana_3

SAS - 线性回归

线性回归用于识别因变量和一个或多个自变量之间的关系。提出了关系模型,并使用参数值的估计来开发估计的回归方程。

然后使用各种检验来确定模型是否令人满意。如果是,则可以使用估计的回归方程来预测给定自变量值的因变量的值。在SAS中,PROC REG过程用于查找两个变量之间的线性回归模型。

语法

在SAS中应用PROC REG的基本语法如下:

PROC REG DATA = dataset;
MODEL variable_1 = variable_2;

以下是所用参数的说明:

  • 数据集是数据集的名称。

  • variable_1和variable_2是用于查找相关性的数据集的变量名称。

示例

下面的示例显示了使用PROC REG查找汽车的两个变量horsepower和weight之间相关性的过程。在结果中,我们看到了可以用来形成回归方程的截距值。

PROC SQL;
create table CARS1 as
SELECT invoice, horsepower, length, weight
   FROM 
   SASHELP.CARS
   WHERE make in ('Audi','BMW')
;
RUN;
proc reg data = cars1;
model horsepower = weight ;
run;

执行上述代码后,我们将获得以下结果:

regression_1

以上代码还提供了模型各种估计值的图形视图,如下所示。作为高级SAS过程,它不仅提供截距值作为输出。

regression_2

SAS - Bland Altman分析

Bland-Altman分析是一个用于验证两种旨在测量相同参数的方法之间一致性或不一致程度的过程。方法之间的高度相关性表明在数据分析中选择了足够好的样本。在SAS中,我们通过计算变量值的均值、上限和下限来创建Bland-Altman图。然后我们使用PROC SGPLOT创建Bland-Altman图。

语法

在SAS中应用PROC SGPLOT的基本语法如下:

PROC SGPLOT DATA = dataset;
SCATTER X = variable Y = Variable;
REFLINE value;

以下是所用参数的说明:

  • 数据集是数据集的名称。

  • SCATTER语句创建以X和Y形式提供的值的散点图。

  • REFLINE创建水平或垂直参考线。

示例

在下面的示例中,我们采用两种方法(名为new和old)生成的两组实验结果。我们计算变量值之间的差异以及相同观测值的变量均值。我们还计算标准差值,以便用于计算的上限和下限。

结果显示一个Bland-Altman图作为散点图。

data mydata;
input new old;
datalines;
31 45
27 12
11 37
36 25
14 8
27 15
3 11
62 42
38 35
20 9
35 54
62 67
48 25
77 64
45 53
32 42
16 19
15 27
22 9
8 38
24 16
59 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 ;

执行上述代码后,我们将获得以下结果:

bland_altman_1

增强模型

在上述程序的增强模型中,我们得到了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 ;

执行上述代码后,我们将获得以下结果:

bland_altman_2

SAS - 卡方检验

卡方检验用于检验两个分类变量之间的关联性。它可以用于检验变量之间的依赖程度和独立程度。SAS使用PROC FREQ以及选项chisq来确定卡方检验的结果。

语法

在SAS中应用PROC FREQ进行卡方检验的基本语法如下:

PROC FREQ DATA = dataset;
TABLES variables 
/CHISQ TESTP = (percentage values);

以下是所用参数的说明:

  • 数据集是数据集的名称。

  • Variables是卡方检验中使用的数据集的变量名称。

  • TESTP语句中的Percentage Values表示变量水平的百分比。

示例

在下面的示例中,我们考虑对数据集SASHELP.CARS中名为type的变量进行卡方检验。此变量有六个水平,我们根据检验设计为每个水平分配百分比。

proc freq data = sashelp.cars;
tables type 
/chisq 
testp = (0.20 0.12 0.18 0.10 0.25 0.15);
run;

执行上述代码后,我们将获得以下结果:

chi_square_1

我们还得到了显示变量type偏差的条形图,如下面的屏幕截图所示。

chi_square_2

双因素卡方检验

当我们将检验应用于数据集的两个变量时,使用双因素卡方检验。

示例

在下面的示例中,我们将卡方检验应用于名为type和origin的两个变量。结果显示了这两个变量所有组合的表格形式。

proc freq data = sashelp.cars;
tables type*origin 
/chisq 
;
run;

执行上述代码后,我们将获得以下结果:

chi_square_3

SAS - Fisher 精确检验

Fisher精确检验是一种统计检验,用于确定两个分类变量之间是否存在非随机关联。在SAS中,这可以通过PROC FREQ来完成。我们使用Tables选项来使用进行Fisher精确检验的两个变量。

语法

在SAS中应用Fisher精确检验的基本语法如下:

PROC FREQ DATA = dataset ;
TABLES Variable_1*Variable_2 / fisher;

以下是所用参数的说明:

  • dataset是数据集的名称。

  • 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;

执行上述代码后,我们将获得以下结果:

fisher_exact_1

SAS - 重复测量分析

重复测量分析用于当随机样本的所有成员都在许多不同的条件下进行测量时。由于样本依次暴露于每个条件,因此对因变量的测量会重复进行。在这种情况下使用标准方差分析是不合适的,因为它无法对重复测量之间的相关性进行建模。

应该清楚重复测量设计简单多元设计之间的区别。对于两者,样本成员都在几个场合或试验中进行测量,但在重复测量设计中,每个试验代表在不同条件下对相同特征的测量。

在SAS中,PROC GLM用于进行重复测量分析。

语法

PROC GLM在SAS中的基本语法如下:

PROC GLM DATA = dataset;
   CLASS variable;
   MODEL variables = group / NOUNI;
   REPEATED TRIAL n;

以下是所用参数的说明:

  • dataset是数据集的名称。

  • CLASS给出用作分类变量的变量。

  • MODEL定义使用来自数据集的某些变量拟合的模型。

  • REPEATED定义每组的重复测量次数,以检验假设。

示例

考虑下面的例子,其中我们有两组人进行药物效果测试。记录每个人的反应时间,针对测试的四种药物类型。这里对每组人进行了5次试验,以观察四种药物类型效果之间相关性的强度。

DATA temp;
   INPUT person group $ r1 r2 r3 r4;
CARDS;
1 A  2  1  6  5
2 A  5  4 11  9
3 A  6 14 12 10
4 A  2  4  5  8
5 A  0  5 10  9
6 B  9 11 16 13
7 B  12 4 13 14
8 B  15 9 13  8
9 B  6  8 12  5
10 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;

执行上述代码后,我们将获得以下结果:

repeated_measure_analysis

SAS - 单因素方差分析

ANOVA代表方差分析。在SAS中,它是使用PROC ANOVA完成的。它执行来自各种实验设计的分析数据。在此过程中,在由分类变量(称为自变量)识别的实验条件下测量连续响应变量(称为因变量)。假设响应的变化是由于分类中的影响造成的,随机误差解释了其余的变化。

语法

在SAS中应用PROC ANOVA的基本语法如下:

PROC ANOVA dataset ;
CLASS Variable;
MODEL Variable1 = variable2 ;
MEANS ;

以下是所用参数的说明:

  • dataset是数据集的名称。

  • CLASS给出用作分类变量的变量。

  • MODEL定义使用来自数据集的某些变量拟合的模型。

  • Variable_1和Variable_2是分析中使用的数据集的变量名称。

  • MEANS定义均值的计算类型和比较。

应用方差分析

现在让我们了解在SAS中应用方差分析的概念。

示例

让我们考虑数据集SASHELP.CARS。在这里,我们研究汽车类型及其马力之间的依赖关系。由于汽车类型是具有分类值的变量,因此我们将它作为分类变量,并在MODEL中使用这两个变量。

PROC ANOVA DATA = SASHELPS.CARS;
CLASS type;
MODEL horsepower = type;
RUN;

执行上述代码后,我们将获得以下结果:

anova_1

使用MEANS应用方差分析

现在让我们了解在SAS中使用MEANS应用方差分析的概念。

示例

我们还可以通过在其中使用Turkey's Studentized方法比较各种汽车类型的均值来扩展模型。列出了汽车类型的类别以及每个类别的马力均值以及一些附加值,例如误差均方等。

PROC ANOVA DATA = SASHELPS.CARS;
CLASS type;
MODEL horsepower = type;
MEANS type / tukey lines;
RUN;

执行上述代码后,我们将获得以下结果:

anova_3

SAS - 假设检验

假设检验是使用统计数据来确定给定假设为真的概率。假设检验的常用过程包括以下四个步骤。

步骤1

制定零假设H0(通常,观测结果是纯偶然的结果)和备择假设H1(通常,观测结果显示出真实效应以及偶然变化的成分)。

步骤2

确定可用于评估零假设真值的检验统计量。

步骤3

计算P值,它是假设原假设成立的情况下,获得至少与观察到的检验统计量一样显著的检验统计量的概率。P值越小,则反对原假设的证据越强。

步骤4

将p值与可接受的显著性值alpha(有时称为alpha值)进行比较。如果p <= alpha,则观察到的效应具有统计学意义,原假设被排除,备择假设有效。

SAS编程语言具有执行各种假设检验的功能,如下所示。

检验 描述 SAS过程
T检验 t检验用于检验一个变量的均值是否与假设值显著不同。我们还可以确定两个独立组的均值是否显著不同,以及相关或配对组的均值是否显著不同。 PROC TTEST
方差分析(ANOVA) 它也用于在存在一个独立分类变量时比较均值。当检验区间因变量的均值是否根据独立分类变量的不同而不同时,我们希望使用单因素方差分析。 PROC ANOVA
卡方检验 我们使用卡方拟合优度检验来评估分类变量的频率是否可能是由于偶然性造成的。无论分类变量的比例是否为假设值,都需要使用卡方检验。 PROC FREQ
线性回归 当想要检验一个变量预测另一个变量的程度时,使用简单线性回归。多元线性回归允许检验多个变量预测感兴趣变量的程度。在使用多元线性回归时,我们还假设预测变量是独立的。 PROC REG
广告