Sas 简明教程

SAS - Quick Guide

SAS - Overview

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

随着用于统计的 JMP(Jump)的引入,SAS 利用了由 Macintosh 引入的 Graphical user Interface 。Jump 主要用于六西格玛、设计、质量控制以及工程和科学分析等应用。

SAS 与平台无关,这意味着你可以在任何操作系统(例如 Linux 或 Windows)上运行 SAS。SAS 由 SAS 程序员驱动,他们对 SAS 数据集使用一系列操作,以生成适当的数据分析报告。

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

若要大致了解可用产品,你可以访问 SAS Components

Why we use SAS

SAS 基本上会处理大型数据集。在 SAS 软件的帮助下,你可以对数据执行各种操作,如:

  1. Data Management

  2. Statistical Analysis

  3. 报告编制以及完美的图形

  4. Business Planning

  5. 运筹学和项目管理

  6. Quality Improvement

  7. Application Development

  8. Data extraction

  9. Data transformation

  10. Data updation and modification

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

Sr.No.

SAS 组件及用法

1

Base SAS 这是一个核心组件,它包含数据管理工具和数据分析的编程语言。它也是使用最广泛的组件。

2

SAS/GRAPH 创建图表和展示,以更好地理解并以适当格式展示结果。

3

SAS/STAT 使用方差分析、回归、多变量分析、生存分析、心理测量分析以及混合模型分析执行统计分析。

4

SAS/OR Operations research.

5

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

6

SAS/IML CInteractive matrix language.

7

SAS/AF Applications facility.

8

SAS/QC Quality control.

9

SAS/INSIGHT Data mining.

10

SAS/PH Clinical trial analysis.

11

SAS/Enterprise Miner Data mining.

Types of SAS Software

  1. Windows or PC SAS

  2. SAS EG (Enterprise Guide)

  3. SAS EM(即企业矿工,用于预测分析)

  4. SAS Means

  5. SAS Stats

我们普遍在组织和培训机构中使用 SAS 窗口。其中一些组织使用 Linux,但没有图形用户界面,所以你必须针对每个查询编写代码。但在窗口版 SAS 中,有一些可以极大帮助程序员的实用工具,而且它还可以减少代码编写时间。

SAS 窗口有 5 个部分。

Sr.No.

SAS 窗口及用法

1

Log Window 日志窗口就像一个执行窗口,我们可以在其中检查 SAS 程序的执行情况。在此窗口中,我们还可以检查错误。在运行程序之后务必每次检查日志窗口都非常重要。这样我们就能对程序的执行情况有更恰当的了解。

2

Editor Window 编辑器窗口就是我们编写所有代码的 SAS 部分。它就像一个便笺本。

3

Output Window 输出窗口是我们查看程序输出结果的一个结果窗口。

4

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

5

Explore Window 在此列出了所有库。你还可以在此浏览你计算机上受 SAS 支持的文件。

Libraries in SAS

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

SAS 中有两种类型的库 −

Sr.No.

SAS 窗口及用法

1

Temporary or Work Library 这是 SAS 的默认库。如果我们没有向任意其他库分配程序,那么我们创建的所有程序将存储在此工作库中。你可以在资源管理器窗口中查看此工作库。如果你创建了一个 SAS 程序,且没有向其分配任何永久库,那么,如果你在会话结束之后再次启动该软件,那么此程序将不再存在于此工作库中。因为它仅在会话持续期间存储在工作库中。

2

Permanent Library 这些是 SAS 的永久库。我们可以使用 SAS 实用程序或在编辑器窗口中写入代码来创建新的 SAS 库。这些库被命名为永久库,因为如果我们在 SAS 中创建了一个程序并将它保存在这些永久库中,那么只要我们想要它们,它们将始终可用。

SAS - Environment

SAS Institute Inc. 已经发布了免费的 SAS University Edition ,它完全能满足学习 SAS 编程的需求。它提供了学习 BASE SAS 编程所需的所有功能,进而让你能够学习任何其他 SAS 组件。

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

Download SAS University Edition

SAS University Edition 可在此 URL 下载: SAS University Edition 。请向下滚动,在开始下载之前阅读系统要求。访问此 URL 会出现以下屏幕。

environment download link

Setup virtualization software

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

environment2 vm options

Quick start virtualization software

如果你对虚拟化环境完全陌生,你可以通过阅读步骤 2 中提供的以下指南和视频,来了解它。如果你已经熟悉它,你也可以跳过此步骤。

environment3 vm guides videos

Download the Zip file

在步骤 3 中,你可以选择与你所具有的虚拟化环境兼容的 SAS University Edition 的相应版本。它会下载为一个 zip 文件,文件名类似于 unvbasicvapp_9411005_vmx_en_sp0__1.zip

environment4 vm download

Unzip the zip file

以上 zip 文件需要解压缩并存储在一个合适的目录中。在我们案例中,我们选择了 VMware zip 文件,解压缩后显示以下文件。

environment5 file unzip

Loading the virtual machine

启动 VMware 播放器(或工作站)并打开以扩展名 .vmx 结尾的文件。会出现以下屏幕。请注意分配给 vm 的基础设置,比如内存和硬盘空间。

environment6 vm machine

Power on the virtual machine

点击绿色箭头标记旁边的 Power on this virtual machine 以启动虚拟机。会出现以下屏幕。

environment7 vm machine poweron

当 SAS vm 处于加载状态时,会出现以下屏幕,正在运行的 vm 会提示转到一个 URL 位置,该位置将打开 SAS 环境。

environment8 vm running

Starting SAS studio

打开一个新的浏览器标签,并加载以上 URL(不同 PC 上的 URL 不同)。会出现以下屏幕,指示 SAS 环境已准备就绪。

environment9 vm start studio

The SAS Environment

点击 Start SAS Studio ,我们便会获得 SAS 环境,它默认以视觉程序员模式打开,如下所示。

environment10 vm visual programming

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

environment11 vm SAS Programmer

现在我们可以开始编写 SAS 程序了。

SAS - User Interface

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

以下是各个窗口的说明及其用法。

SAS Main Window

这是进入 SAS 环境后看到的窗口。左侧是 Navigation Pane*used to navigate various programming features. In the right is the *Work Area ,用于编写代码并执行代码。

ui main screen1

Code Autocomplete

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

ui program code2

Program Execution

通过按从左起第一个图标的运行图标或 F3 按钮执行代码。

ui program run 4

Program Log

已执行代码的日志可在 Log 选项卡中获得。它描述了程序执行过程中出现的错误、警告或说明。这是获取所有线索以对代码进行故障排除的窗口。

ui program log 5

Program Result

代码执行的结果在RESULTS(结果)标签中可见。默认情况下,它们格式化为HTML表格。

ui program result 6

Program Tabs

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

Server Files and Folders

在这个标签下,我们可以创建其他程序、导入待分析的数据和查询现有数据。还可以使用它来创建文件夹快捷方式。

ui program multiple 7

Tasks

“任务”标签提供了通过仅提供输入变量来使用内置 SAS 程序的功能。例如,在统计文件夹下,您可以找到一个 SAS 程序来通过仅提供 SAS 数据集名称和变量名称来执行线性回归。

ui program tasks 8

Snippets

“片段”标签提供了编写 SAS 宏和从现有数据集生成文件的功能

ui program snippets 9

Program Libraries

SAS 将数据集存储在 SAS 库中。临时库仅适用于单个会话,它被命名为 WORK。但是永久库一直可用。

ui program libraries 10

File Shortcuts

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

ui program file shortcuts 11

SAS - Program Structure

SAS 编程涉及首先将数据集创建/读取到内存中,然后对该数据执行分析。我们需要了解按哪种流程编写程序才能实现这一点。

SAS Program Structure

下图显示了按给定顺序编写 SAS 程序所要执行的步骤。

ps flow 1

每个 SAS 程序都必须包含所有这些步骤才能完成读取输入数据、分析数据和给出分析输出。还需要在每一步的末尾添加 RUN 语句来完成该步骤的执行。

DATA Step

此步骤涉及将所需数据集加载到 SAS 内存并确定数据集的变量(也称为列)。它还捕获记录(也称为观察值或受试者)。DATA 语句的语法如下。

Syntax

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;

Example

以下示例显示了对数据集命名、定义变量、创建新变量和输入数据的简单情况。此处,字符串变量的末尾都有一个 $,而数字值则没有。

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 Step

此步骤涉及调用 SAS 内置过程来分析数据。

Syntax

PROC procedure_name options; #The name of the proc.
RUN;

Example

以下示例显示使用 MEANS 过程打印数据集中数字变量的平均值。

PROC MEANS;
RUN;

The OUTPUT Step

可以使用条件输出语句显示数据集的数据。

Syntax

PROC PRINT DATA = data_set;
OPTIONS;
RUN;

Example

以下示例显示在输出中使用 where 子句仅生成数据集中的一部分记录。

PROC PRINT DATA = TEMP;
WHERE SALARY > 700;
RUN;

The complete SAS Program

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

ps complete code

Program Output

ps program output

SAS - Basic Syntax

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

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

SAS Statements

  1. 语句可以在任意位置开始和结束。最后一行末尾的分号标记语句的结束。

  2. 多个 SAS 语句可以位于同一行上,每个语句都以分号结尾。

  3. 空格可用于分隔 SAS 程序语句中的各个部分。

  4. SAS 关键字不区分大小写。

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

SAS Variable Names

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

  1. 它最多可以包含 32 个字符。

  2. 不可包含空格。

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

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

  5. 变量名称不区分大小写。

Example

# 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 Set

DATA 语句标记为一个新 SAS 数据集的创建。数据集创建的规则如下。

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

  2. 数据集名称可以以库名称作为前缀,从而使其成为永久数据集。这意味着该数据集会在会话结束后继续存在。

  3. 如果省略 SAS 数据集名称,SAS 则会创建一个临时数据集,且该数据集名称由 SAS 生成,如 DATA1、DATA2 等。

Example

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

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

SAS File Extensions

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

  1. *.sas - 它代表 SAS 代码文件,可以使用 SAS 编辑器或任何文本编辑器对其进行编辑。

  2. *.log - 它代表 SAS 日志文件,其中包含有关已提交 SAS 程序的错误、警告和数据集详细信息等信息。

  3. *.mht / *.html - 它代表 SAS 结果文件。

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

Comments in SAS

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

*message; type comment

*message; 形式的注释不能包含分号或不匹配的引号。此外,此类注释中不允许有任何对宏语句的引用。它可以跨多行并且可以是任何长度。以下是单行注释示例:

* This is comment ;

以下是多行注释示例:

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

/message/ type comment

/*message /* 形式的注释使用更频繁,不能嵌套。但它可以跨多行并且可以是任何长度。以下是单行注释示例:

/* This is comment */

以下是多行注释示例:

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

SAS - Data Sets

可供 SAS 程序进行分析的数据称为 SAS 数据集。它使用 DATA 步骤创建。SAS 可以读取各种文件作为其数据源,如 CSV, Excel, Access, SPSS and also raw data 。它还有许多可供使用的内置数据源。

  1. 如果 SAS 程序使用数据集然后在会话运行后将其丢弃,则这些数据集称为 temporary Data Set

  2. 但是如果将其永久存储以供将来使用,则称为 permanent Data set 。所有永久数据集都存储在一个特定的库中。

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

SAS Built-In Data Sets

这些数据集已经内置在已安装的 SAS 软件中。在制定数据分析的示例表达式时,可以探索和使用它们。要探索这些数据集,请转到 Libraries → My Libraries → SASHELP 。展开它后,我们会看到所有可用的内置数据集的名称列表。

data sets 1 explore

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

data sets 2 CARS

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

data sets 3 CARS explore

Importing External Data Sets

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

data sets 4 1 loacl files to server

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

接下来,单击右侧导入数据程序下的 Select Files 按钮。以下是可以导入的文件类型列表。

data sets 5 import files

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

data sets 4 2 import utility

View the imported data

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

data sets 6 view imported data

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

SAS - Variables

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

SAS Variable Types

SAS 具有以下三种类型的变量:

Numeric Variables

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

Syntax

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

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

Example

INPUT ID SALARY COMM_PERCENT;

Character Variables

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

Syntax

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

在以上语法中,INPUT 语句显示了字符变量的声明。

Example

INPUT FNAME $ LNAME $ ADDRESS $;

Date Variables

这些变量只被视为日期且需要为有效的日期格式。通过在变量名称末尾添加带空格的日期格式,变量变为日期变量。

Syntax

INPUT VAR1 DATE11. VAR2 MMDDYY10. ; #Define date variables in the data set.

在以上语法中,INPUT 语句显示了日期变量的声明。

Example

INPUT DOB DATE11. START_DATE MMDDYY10. ;

Use of Variables in SAS Program

如以下示例中所示,上述变量用于 SAS 程序中。

Example

以下代码显示了如何声明并在 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

Using the Variables

变量在分析数据中非常有用。它们用于对统计分析应用的表达式中。我们来看一个示例,分析名为 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 - Strings

在 SAS 中,字符串是包含在一对单引号中的值。还需要在变量声明的末尾添加一个空格和 $ 符号,才能声明字符串变量。SAS 具有很多可以分析和操作字符串的强大函数。

Declaring String Variables

我们可以声明字符串变量及其值,如下所示。在下面的代码中,我们声明了两个长度分别为 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

String Functions

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

SUBSTRN

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

Syntax

SUBSTRN('stringval',p1,p2)

以下是所用参数的描述 -

  1. stringval 是字符串变量的值。

  2. p1 是提取的起始位置。

  3. p2 是提取的结束位置。

Example

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

此函数删除字符串中的结尾空格。

Syntax

TRIMN('stringval')

以下是所用参数的描述 -

  1. 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 - Arrays

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

Syntax

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

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

在以上语法中 −

  1. ARRAY 是用于声明数组的 SAS 关键字。

  2. ARRAY-NAME 是数组的名称,它遵循与变量名称相同的规则。

  3. SUBSCRIPT 是数组将存储的值的数量。

  4. ($) 是仅在数组将存储字符值时使用的可选参数。

  5. VARIABLE-LIST 是作为数组值占位符的可变变量的可选列表。

  6. ARRAY-VALUES 是存储在数组中的实际值。它们可以在这里声明,也可以从文件或文件行中读取。

Examples of Array Declaration

可以使用以上语法以多种方式声明数组。以下为示例。

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

Accessing Array Values

可以通过使用 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

Using the OF operator

当分析来自数组的数据以对数组的整行执行计算时,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

Using the IN operator

还可以使用 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 - Numeric Formats

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

Syntax

数值信息格式的语法为 −

Varname Formatnamew.d

以下是所用参数的描述 -

  1. Varname 是变量的名称。

  2. Formatname 是应用到变量的数值格式的名称。

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

  4. d 是小数点右边的位数。

Reading Numeric formats

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

Input Numeric Formats

Format

Use

n.

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

n.p

最大“n”列数,有“p”个小数点。

COMMAn.p

最大“n”列数,有“p”个小数位,并去除逗号或美元符号。

COMMAn.p

最大“n”列数,有“p”个小数位,并去除逗号或美元符号。

Displaying Numeric formats

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

Output Numeric Formats

Format

Use

n.

最多写入“n”个没有小数点的数字。

n.p

用 Gemini 最多写入 "n.p" 列 数,其中 "p" 为小数点位数。

DOLLARn.p

使用十进制位数 "n"、美元符号和大千分位逗号写入最大列数。

请注意−

  1. 如果小数点后面的数字少于格式说明符,那么将在末尾附加*零*。

  2. 如果小数点后面的数字多于格式说明符,则最后的数字将为 rounded off

Examples

以下示例说明了上述情况。

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 - Operators

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

下面是 SAS 运算符类别的列表。

  1. Arithmetic Operators

  2. Logical Operators

  3. Comparison Operators

  4. Minimum/Maximum Operators

  5. Concatenation Operator

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

Arithmetic Operators

下表描述了算术运算符的详细信息。我们假设两个数据变量 V1V2*with values *84

Operator

Description

Example

+

Addition

V1+V2=12

-

Subtraction

V1-V2=4

*

Multiplication

V1*V2=32

/

Division

V1/V2=2

**

Exponentiation

V1**V2=4096

Example

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

Logical Operators

下表描述了逻辑运算符的详细信息。这些运算符计算表达式的真值。因此,逻辑运算符的结果始终是 1 或 0。我们假设两个数据变量 V1V2*with values *84

Operator

Description

Example

&

AND 运算符。如果两个数据值都计算为真,则结果为 1,否则为 0。

(V1>2 & V2 > 3) 得 0。

OR 运算符。如果任何一个数据值求值为真,则结果为 1,否则为 0。

(V1>9 & V2 > 3) 为 1。

~

NOT 运算符。NOT 运算符的结果为虚假或缺失值的表达式的形式为 1,否则为 0。

Example

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

Comparison Operators

下表对比较运算符的详细信息进行了描述。这些运算符将变量的值进行比较,结果为真值,真为 1,假为 0。让我们假设两个数据变量分别为 V1V2*with values *84

Operator

Description

Example

=

EQUAL 运算符。如果两个数据值相等,则结果为 1,否则为 0。

(V1 = 8) 给出 1。

^=

NOT EQUAL 运算符。如果两个数据值不相等,则结果为 1,否则为 0。

(V1 ^= V2) 给出 1。

<

The LESS THAN Operator.

(V2 < V2) 给出 1。

小于或等于运算符。

(V2 ⇐ 4) 给出 1。

>

The GREATER THAN Operator.

(V2 > V1) 给出 1。

>=

大于或等于运算符。

(V2 >= V1) 给出 0。

IN

IN 运算符。如果变量的值等于给定值列表中的任何一个值,它返回 1,否则返回 0。

V1 in (5,7,9,8) 给出 1。

Example

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

Minimum/Maximum Operators

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

Operator

Description

Example

MIN

MIN 运算符。它返回行中值的列表中的最小值。

MIN(45.2,11.6,15.41) gives 11.6

MAX

MAX 运算符。它返回行中值的列表中的最大值。

MAX(45.2,11.6,15.41) gives 45.2

Example

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

Concatenation Operator

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

Operator

Description

Example

连接运算符。它返回两个或多个值的连接。

'Hello'

Example

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

通过运行以上代码,我们得到以下输出。

operators concate

Operators Precedence

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

Group

Order

Symbols

Group I

Right to Left

** + - NOT MIN MAX

Group II

Left to Right

* /

Group III

Left to Right

+ -

Group IV

Left to Right

Group V

SAS - Loops

在某些情况下,需要执行一个代码块多次。通常,语句顺序执行——函数中的第一个语句首先执行,接着执行第二个语句,依此类推。但是,当您希望同组语句重复执行时,我们需要循环的帮助。

在 SAS 中,使用 DO 语句进行循环。它也被称为 DO Loop 。下面给出了 SAS 中 DO 循环语句的常用形式。

Flow Diagram

SAS do while loop

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

Sr.No.

Loop Type & Description

1

DO Index. 循环从索引变量的起始值持续到终止值。

2

DO WHILE. 循环持续到 while 条件变为 false。

3

DO UNTIL. 循环持续到 UNTIL 条件变为 True。

SAS - Decision Making

决策结构要求程序员指定程序要评估或测试的一个或多个条件,以及在确定条件为 true 时要执行的语句或语句,而且在条件确定为 false 时可能还要执行其他一些语句。

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

decision making

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

Sr.No.

Statement Type & Description

1

IF Statement. if statement 包含一个条件。如果条件为真,则获取特定数据。

2

IF-THEN-ELSE Statement. if statement 后面跟 else 语句,该语句在布尔条件为假时执行。

3

IF-THEN-ELSE-IF Statement. if statement 后面跟 else 语句,而该语句后面又跟另一对 IF-THEN 语句。

4

IF-THEN-DELETE Statement. if statement 包含一个条件,当该条件为真时,从观察数据中删除特定数据。

SAS - Functions

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

Syntax

在 SAS 中使用函数的常规语法如下所示。

FUNCTIONNAME(argument1, argument2...argumentn)

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

Function Categories

根据其用途,SAS 中的函数被归类如下。

  1. Mathematical

  2. Date and Time

  3. Character

  4. Truncation

  5. Miscellaneous

Mathematical Functions

这些函数用来对变量值施加一些数学运算。

Examples

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

Date and Time Functions

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

Examples

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

Character Functions

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

Examples

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

Truncation Functions

这些函数用来截断数值。

Examples

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

Miscellaneous Functions

现在让我们了解一下 SAS 的其他一些函数,并提供一些示例。

Examples

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

输入方法用来读取原始数据。原始数据可能是来自外部源或来自流式数据线。输入语句用您分配给每个字段的名称创建一个变量。所以您必须在输入语句中创建一个变量。同一个变量将显示在 SAS 数据集的输出中。下面是 SAS 中提供给不同输入方法。

  1. List Input Method

  2. Named Input Method

  3. Column Input Method

  4. Formatted Input Method

下面介绍了每种输入方法的详细信息。

List Input Method

在这种方法中,变量被列出数据类型。原始数据被仔细分析,以便匹配声明变量的顺序和数据。分隔符(通常为空格)在任何相邻列的之间应该统一。任何缺失数据都会导致输出结果错误,从而产生问题。

Example

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

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

Named Input Method

在这种方法中,变量被列出数据类型。原始数据被修改,以便匹配数据之前声明的变量名。分隔符(通常为空格)在任何相邻列的之间应该统一。

Example

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

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

Column Input Method

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

Example

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

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

Formatted Input Method

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

Example

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

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 - Macros

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

Macro variables

这些变量包含将被 SAS 程序反复使用的值。它们在 SAS 程序的开头进行声明,并在程序主体中进行后期调用。它们在作用域中可以是全局的或局部的。

Global Macro variable

它们被称为全局宏变量,因为任何在 SAS 环境中可用的 SAS 程序都可以访问它们。一般而言,它们是由系统分配的变量,多个程序访问这些变量。系统日期就是一个通用的示例。

Example

下面是名为 SYSDATE 的 SAS 变量的一个示例,它表示系统日期。考虑这样一个情景,在每天生成的报表标题中打印系统日期。标题将显示当前日期和星期,而我们并不会为此对它们进行任何值编码。我们使用 SASHELP 库中可用的称为 CARS 的内置 SAS 数据集。

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

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

global macro result

Local Macro variable

SAS 程序可以通过声明这些变量作为程序的一部分来访问这些变量。它们通常用于为同一 SAS 语句提供不同的变量,以便对数据集的不同观测结果进行处理。

Syntax

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

% LET (Macro Variable Name) = Value;

此处,根据程序要求,值字段可以采用任何数字、文本或日期值。宏变量名称是任何有效的 SAS 变量。

Example

变量由 SAS 语句使用 & * character appended at the beginning of the variable name. Below program gets us all the observation of the make 'Audi' and type 'Sports'. In case we want the result of *different 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' 并运行同一程序。我们将得到以下结果。

local macro result

Macro Programs

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

Syntax

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

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

Macro Statements;

%MEND;

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

Example

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

Commonly Used Macros

SAS 编程语言中有许多内置的 SAS MACRO 语句。其他 SAS 程序可以使用它们,而不必显式声明它们。常见示例有 - 当满足某些条件时终止程序或者在程序日志中捕获变量的运行时值。以下是一些示例。

Macro %PUT

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

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

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

macro put

Macro %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

Macro %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 - Date & Times

在 SAS 中,日期是数值的一个特例。从 1960 年 1 月 1 日开始,每一天都会指定一个特定的数值。这一天的日期值被指定为 0,下一天的日期值被指定为 1,以此类推。此日期之前的日期用 -1、-2 等表示。通过此方法,SAS 可以表示未来的任何日期和过去的任何日期。

当 SAS 从源中读取数据时,它会将读取的数据转换为由日期格式指定特定的日期格式。用于存储日期值的变量使用所需的适当的信息声明。使用输出数据格式显示输出日期。

SAS Date Informat

可以使用特定的日期信息(如下所示)正确读取源数据。信息结尾的数字表示使用该信息完全读取日期字符串所需的最小宽度。宽度较小会产生错误的结果。在 SAS V9 中,有一个通用日期格式 anydtdte15. ,它可以处理任何日期输入。

Input Date

Date width

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.

Example

以下代码显示了读取不同日期格式。请注意,由于我们未对输出值应用任何格式语句,因此所有输出值都只是数字。

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 Date output format

读取日期后,可以将其转换为显示所需的另一种格式。这是通过使用日期类型的格式语句实现的。它们采用与信息相同格式。

Example

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

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 - Read Raw Data

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

  1. ASCII(Text) Data Set

  2. Delimited Data

  3. Excel Data

  4. Hierarchical Data

Reading ASCII(Text) Data Set

这些文件包含文本格式的数据。数据通常由空格分隔,但 SAS 还可以处理不同类型的分隔符。让我们考虑一个包含员工数据的 ASCII 文件。我们使用 SAS 中 Infile 语句读取这个文件。

Example

在下面的示例中,我们从本地环境读取名为 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

Reading Delimited Data

这些数据文件中的列值由逗号或管道等分隔符分隔。在这种情况下,我们在 infile 语句中使用 dlm 选项。

Example

在下面的示例中,我们从本地环境读取名为 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

Reading Excel Data

SAS 可以使用导入工具直接读取 Excel 文件。如在 SAS 数据集章节中看到的那样,它可以处理各种文件类型,包括 MS Excel。假设文件 emp.xls 在 SAS 环境中的本地可用。

Example

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 文件中读取数据,并给出与以上两个文件类型相同输出。

Reading Hierarchical Files

在这些文件中,数据以层次格式呈现。对于给定的观测值,有一个标题记录,在它下面提到了许多详细记录。详细记录的数量可以从一个观测值到另一个观测值而有所不同。下面是层次文件的说明。

在下面的文件中,列出了每个部门下每个员工的详细信息。第一条记录是标题记录,提到了部门,下一条记录以 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

Example

为了读取层次文件,我们在下面的代码中使用了 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 - Write Data Sets

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

PROC EXPORT

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

Syntax

在 SAS 中编写过程的基本语法是 −

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

以下是所用参数的描述 -

  1. SAS data-set 是要导出的数据集名称。SAS 可以通过创建不同操作系统可以读取的文件,从其环境与其他应用程序共享数据集。它使用内置导出函数将数据集文件输出为各种格式。在本章中,我们将看到如何使用 proc export 及其选项 dlm *and *dbms 编写 SAS 数据集。

  2. SAS data-set-options 用于指定要导出的列子集。

  3. filename 是将数据写入其中的文件的名称。

  4. identifier 用于指明要写入文件的分隔符。

  5. LABEL 选项用于指明写入文件中的变量名称。

Example

我们将使用 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

Writing a CSV file

为了写入逗号分隔文件,我们可以将 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

Writing a tab delimited file

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

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

数据也可以写入 HTML 文件,我们将在输出交付系统章节中对此进行介绍。

SAS - Concatenate Data Sets

多个 SAS 数据集可以使用 SET 语句连接,以提供单个数据集。连接的数据集中的观测总数是原始数据集中观测总数之和。观测顺序是顺序的。第一个数据集中的所有观测都紧跟第二个数据集中的所有观测,依此类推。

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

Syntax

SAS 中 SET 语句的基本语法是 −

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

以下是所用参数的描述 -

  1. data-set1,data-set2 是依次编写的DataSet名称。

Example

考虑一个组织的员工数据,该数据可在两个不同的数据集中获得,一个用于 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

Scenarios

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

Different number of variables

如果原始数据集之一具有比另一数据集更多的变量,则数据集仍然会被组合,但在较小的数据集中,这些变量显示为缺失。

Example

在以下示例中,第一个数据集有一个名为 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

Different variable name

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

Example

在以下示例中,数据集 ITDEPT 的变量名称为 ename ,而数据集 NON_ITDEPT *has the variable name *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

Different variable lengths

如果两个数据集中变量的长度不同,则连接的数据集中将包含一些数据被截断具有较小长度的变量。如果第一个数据集的长度较小,则会发生这种情况。为了解决此问题,我们对两个数据集都应用了更高的长度,如下所示。

Example

在以下示例中,变量 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 - Merge Data Sets

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

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

  1. 输入数据集必须至少有一个共同变量可用于合并。

  2. 必须根据用于合并的公共变量对输入数据集进行排序。

Syntax

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

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

以下是所用参数的描述 -

  1. Data-set1,Data-set2 是连续编写的多个数据集名称。

  2. Common Variable 是变量,数据集将根据其匹配值进行合并。

Data Merging

让我们借助示例了解数据合并。

Example

考虑两个 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 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;

Missing Values in the Matching Column

在某些情况下,公共变量的某些值在数据集中可能无法匹配。在这种情况下,数据集仍然可以合并,但在结果中会出现缺失值。

Example

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

Merging only the Matches

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

Example

在以下示例中, 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 - Subsetting Data Sets

SAS 数据集的子集是指通过选择较少的变量或较少的观测值,或者同时选择两者,来提取数据集的一部分。虽然通过使用 KEEPDROP 语句对变量进行子集设置,但对观测值进行子集设置是通过使用 DELETE 语句。

而且,子集设置操作产生的结果数据保存在可以用于进一步分析的新数据集中。子集设置主要用于分析数据集中的一部分,而不使用那些与分析无关的变量或观测值。

Subsetting Variables

在此方法中,我们只从整个数据集中提取少数变量。

Syntax

SAS 中子集设置变量的基本语法是:

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

以下是所用参数的描述 -

  1. var1 and var2 是需要保留或删除的数据集中的变量名。

Example

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

Subsetting Observations

在此方法中,我们只从整个数据集中提取少数观测值。

Syntax

我们使用 PROC FREQ,它跟踪为新数据集所选的观测值。

子集设置观测值语法是:

IF Var Condition THEN DELETE ;

以下是所用参数的描述 -

  1. Var 是变量的名称,观测值将根据其值通过指定条件删除。

Example

考虑下面的 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 Data Sets

有时我们希望以不同于数据集中已经存在的格式显示分析后的数据。例如,我们要给带有价格信息的变量添加美元符号和小数点后两位。或者,我们可能想要显示一个全部大写的文本变量。我们可以使用 FORMAT 应用内置 SAS 格式, PROC FORMAT 用于应用用户定义的格式。一个格式还可以应用于多个变量。

Syntax

应用内置 SAS 格式的语法基本语法为:

format variable name format name

以下是所用参数的描述 -

  1. variable name 是数据集中使用的变量名称。

  2. format name 是应用于变量的数据格式。

Example

让我们考虑下面的 SAS 数据集,其中包含某个组织的员工详细信息。我们希望以大写形式显示所有名称。使用 formatstatement 来实现此目的。

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

Using 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 表与变量。将针对所有这些场景提供示例,如下所示。

Syntax

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

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

以下是所用参数的描述 -

  1. SQL 查询写在了 PROC SQL 语句之后,然后是 QUIT 语句。

接下来,我们将看到如何将这个 SAS 过程用于在 SQL 中的 CRUD (创建、阅读、更新和删除)操作。

SQL Create Operation

使用 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 Read Operation

SQL 中的读取操作包括编写 SQL SELECT 查询,以从表中读取数据。在以下示例中,此程序查询位于 SASHELP 库中的名为 CARS 的 SAS 数据集。查询获取了此数据集的一些列。

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

在执行以上代码之后,我们将得到以下结果:

SQL1

SQL SELECT with WHERE Clause

以下此程序使用 where 子句查询 CARS 数据集。在结果中,我们只得到一个将制造商指定为“Audi”,且类型指定为“运动”的记录。

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

在执行以上代码之后,我们将得到以下结果:

SQL where clause

SQL UPDATE Operation

我们可以使用 SQL 更新语句来更新 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

SQL DELETE Operation

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

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

在执行以上代码之后,我们将得到以下结果:

proc sql delete

SAS - ODS

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

Syntax

在 SAS 中使用 ODS 语句的基本语法是 −

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

以下是所用参数的描述 -

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

  2. Style 代表 SAS 环境中可用的内置样式之一。

Creating HTML Output

我们使用 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

Creating PDF Output

在下面的示例中,我们在所需的路径中创建了一个 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

Creating TRF(Word) Output

在下面的示例中,我们在所需的路径中创建了一个 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 - Simulations

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

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

可对 SAS 模拟应用的不同类型的统计分布如下:

  1. 从连续分布中模拟数据

  2. 从离散分布中模拟数据

  3. 从混合分布中模拟数据

  4. 从复杂分布中模拟数据

  5. 从多元分布中模拟数据

  6. APPROXIMATE A SAMPLING DISTRIBUTION

  7. ASSESS REGRESSION ESTIMATES

SAS - Histograms

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

Syntax

在 SAS 中创建直方图的基本语法是 −

PROC UNIVARAITE DATA = DATASET;
HISTOGRAM variables;
RUN;
  1. DATASET 是所用数据集的名称。

  2. variables 是用于绘制直方图的值。

Simple Histogram

通过指定变量的名称以及将用于对这些值进行分组的范围来创建简单的直方图。

Example

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

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

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

histogram1

Histogram with Curve Fitting

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

Example

在下面的示例中,我们拟合了以 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 - Bar Charts

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

Syntax

创建柱状图的基本 SAS 语法为:

PROC SGPLOT DATA = DATASET;
VBAR variables;
RUN;
  1. DATASET − 是所用数据集的名称。

  2. variables − 是用于绘制直方图的值。

Simple Bar chart

简单的柱状图是一种其中数据集的变量表示为条形图的图表。

Example

下面的脚本会创建一个将汽车长度表示为条形图的柱状图。

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

Stacked Bar chart

堆积柱状图是一种其中数据集的一个变量根据另一个变量计算的柱状图。

Example

下面的脚本会创建一个堆积柱状图,其中各个汽车型号的长度都会进行计算。我们使用 group 选项来指定第二个变量。

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

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

barchart2

Clustered Bar chart

分簇柱状图用于展示变量值如何在一种文化中分布。

Example

下面的脚本会创建一个分簇柱状图,其中汽车长度围绕汽车型号进行分簇。我们看到两个长度为 191 的相邻条,一个是汽车型号“轿车”,另一个是汽车型号“旅行车”。

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

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

barchart3

SAS - Pie Charts

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

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

Syntax

在 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;
  1. variable 是我们为其创建饼图的值。

Simple Pie Chart

在此饼图中,我们从数据集中获取单个变量形式。饼图的创建方式是,切片的价值表示相对于变量的总价值的变量计数分数。

Example

在下面的示例中,每个切片表示来自汽车总数的汽车类型的分数。

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

Pie Chart with Data Labels

在此饼图中,我们同时表示每个切片的数值分数和百分比值。我们还将标签的位置更改为图表内部。通过使用 DATASKIN 选项修改图表的外观风格。它使用 SAS 环境中可用的其中一种内置风格。

Example

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

Grouped Pie Chart

在此饼图中,图表中显示的变量值根据同一数据集中另一个变量分组。每组成为一个圆圈,并且该图表拥有尽可能多的同心圆,就像可用组的数量一样。

Example

在下面的示例中,我们按照名为“Make”的变量对图表进行分组。由于有两个可用值(“奥迪”和“宝马”),所以我们会得到两个同心圆,每个同心圆都代表各自品牌中的汽车类型。

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 - Scatter Plots

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

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

Syntax

在 SAS 中创建散点图的基本语法是 −

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

以下是所用参数的描述 −

  1. DATASET 是数据集的名称。

  2. VARIABLE 是从数据集中使用的变量。

Simple Scatterplot

在简单的散点图中,我们从数据集中选择两个变量,并根据第三个变量将其分组。我们还可以标记这些数据。结果显示了两个变量在 Cartesian plane. 中的分散情况

Example

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

Scatterplot with Prediction

我们可以使用估算参数通过围绕数值绘制椭圆来预测相关性强度。在该过程中,我们使用以下所示附加选项来绘制椭圆。

Example

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

Scatter Matrix

通过将其分组为对对,我们也可以拥有涉及多个变量的散点图。在下例中,我们考虑了三个变量并绘制了散点矩阵。我们得到了 3 对结果矩阵。

Example

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 - Box Plots

箱形图是通过四分位数对数字数据集组的图形表示。箱形图还可能具有从箱形垂直延伸的线条(晶须),表示上下四分位数之外的可变性。箱体的底部和顶部始终是第一和第三四分位数,箱体内的带始终是第二四分位数(中位数)。在 SAS 中,使用 PROC SGPLOT 创建简单的箱形图,使用 PROC SGPANEL 创建面板箱形图。

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

Syntax

在 SAS 中创建箱形图的基本语法是 −

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

PROC SGPANEL  DATA = DATASET;;
PANELBY VARIABLE;
   VBOX VARIABLE> / category = VARIABLE;
RUN;
  1. DATASET − 是所用数据集的名称。

  2. VARIABLE − 是用于绘制箱形图的值。

Simple Boxplot

在简单的箱形图中,我们从数据集选择一个变量和另一个变量以形成一个类别。第一个变量的值根据第二个变量中不同值的数量分为许多组。

Example

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

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

Boxplot in Vertical Panels

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

Example

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

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

   title 'Horsepower of cars by types';
RUN;

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

box plot 2

Boxplot in Horizontal Panels

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

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

   VBOX horsepower   / category = type;

   title 'Horsepower of cars by types';
RUN;

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

box plot 3

SAS - Arithmetic Mean

算术平均值是通过对数字变量的值求和,然后将总和除以变量个数获得的值。它也称为平均值。在 SAS 中,算术平均值使用 PROC MEANS 计算。使用此 SAS 过程,我们可以找到所有变量或数据集的某些变量的平均值。我们还可以形成组并找到特定于该组的值的变量的平均值。

Syntax

在 SAS 中计算算术平均值的基本语法是 −

PROC MEANS DATA = DATASET;
CLASS Variables ;
VAR Variables;

以下是所用参数的描述 −

  1. DATASET − 是所用数据集的名称。

  2. Variables − 是数据集中变量的名称。

Mean of a Dataset

数据集中的每个数字变量的平均值是通过使用 PROC 计算的,仅提供数据集名称而不提供任何变量。

Example

在下面的示例中,我们找到名为 CARS 的 SAS 数据集中所有数字变量的平均值。我们将小数点后最多位数指定为 2,并找到这些变量的总和。

PROC MEANS DATA = sashelp.CARS Mean SUM MAXDEC=2;
RUN;

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

Mean

Mean of Select Variables

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

Example

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

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

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

Mean select variables

Mean by Class

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

Example

在下面的示例中,我们找到了每个汽车品牌的每个型号的变量马力的均值。

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

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

mean with class

SAS - Standard Deviation

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

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

Using PROC MEANS

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

Syntax

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

PROC means DATA = dataset STD;

以下是所用参数的描述 -

  1. Dataset - 是数据集的名称。

Example

在下面的示例中,我们从 SASHELP 库中的 CARS 数据集创建数据集 CARS1。我们使用 PROC 均值步骤选择 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

Using PROC SURVEYMEANS

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

Syntax

使用 PROC SURVEYMEANS 的语法是:

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

以下是所用参数的描述 -

  1. BY - 表示用于创建观察组的变量。

  2. CLASS − 表示用于分类变量的变量。

  3. VAR − 表示将计算其标准差的变量。

Example

以下示例描述了 class 选项的使用情况,该选项会为分类变量中的每个值创建统计信息。

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

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

SD 2

Using BY option

以下代码给出 BY 选项的示例。其中结果将针对 BY 选项中的每一个值进行分组。

Example

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

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

Result for make = "Audi"

SD 3

Result for make = "BMW"

SD 4

SAS - Frequency Distributions

频数分布是一个表,其中显示了数据集中的数据点的频数。表中的每个条目均包含某个特定群组或区间中的值出现的频数或计数,并且以这种方式,该表总结了样本中的值分布。

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

Syntax

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

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

以下是所用参数的描述 -

  1. Dataset 是数据集的名称。

  2. Variables_1 是其频数分布需要计算的数据集的变量名称。

  3. Variables_2 是对频数分布结果进行分类的变量。

Single Variable Frequency Distribution

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

Example

在以下示例中,我们找到名为 CARS1 的数据集的马力变量的频数分布,该数据集是从库 SASHELP.CARS. 创建的。我们可以看到结果划分为两类。一类是汽车的每个品牌。

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

Multiple Variable Frequency Distribution

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

Example

在以下示例中,我们计算汽车品牌的频数分布 grouped by car type 和每种汽车类型的频数分布 grouped by each make.

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

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

FREQ tables1

Frequency Distribution with Weight

使用 weight 选项,我们可以计算根据变量权重有偏差的频数分布。此处将变量的值视为观测数量,而不是值的计数。

Example

在以下示例中,我们计算变量品牌和类型在权重分配给马力的频数分布。

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

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

FREQ tables3

SAS - Cross Tabulations

交叉制表包括使用两个或更多变量的所有可能的组合来生成交叉表,也称为列联表。在 SAS 中,它是使用 PROC FREQTABLES 选项一起创建的。例如 - 如果我们需要每个车型类别中每个品牌的每种车型的频率,那么我们需要使用 PROC FREQ 的 TABLES 选项。

Syntax

在 SAS 中应用交叉制表的语法基本语法为:

PROC FREQ DATA = dataset;
TABLES variable_1*Variable_2;

以下是所用参数的描述 -

  1. Dataset 是数据集的名称。

  2. Variable_1 and Variable_2 是数据集的变量名称,需要计算频率分布。

Example

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

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

Cross tabulation of 3 Variables

当我们有三个变量时,我们可以将其中的 2 个分组,并用第三个变量交叉制表它们。因此,结果中有两个交叉表。

Example

在下面的示例中,我们找到了每种汽车品牌对于每种汽车类型和每种汽车型号的频率。我们还使用 nocol 和 norow 选项以避免总和和百分比值。

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

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

cross tab 2

Cross tabulation of 4 Variables

使用 4 个变量时,成对组合的数量增加至 4。组 1 中的每个变量都与组 2 的每个变量配对。

Example

在下面的示例中,我们找到了对于每个品牌和每个型号的汽车的长度频率。同样,对于每个品牌和每个型号的马力的频率。

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

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

cross tab 3

SAS - T Tests

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

Syntax

在 SAS 中应用 PROC TTEST 的基本语法是 −

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

以下是所用参数的描述 -

  1. Dataset 是数据集的名称。

  2. Variable_1 and Variable_2 是 t 检验中使用的数据集的变量名称。

Example

下面我们看到一个样本 t 检验,其中找到具有 95% 置信限度的变量马力的 t 检验估计值。

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

Paired T-test

成对 T 检验用于检验两个因变量在统计上是否彼此不同。

Example

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

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

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

t test 2

Two sample t-test

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

Example

在我们的案例中,我们比较了两款不同品牌的汽车(“奥迪”和“宝马”)的变量马力的均值。

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 - Correlation Analysis

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

Syntax

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

PROC CORR DATA = dataset options;
VAR variable;

以下是所用参数的描述 -

  1. Dataset 是数据集的名称。

  2. Options 是过程的其他选项,如绘图矩阵等。

  3. Variable 是在查找相关性时使用的数据集的变量名。

Example

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

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

Correlation Between All Variables

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

Example

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

proc corr data = cars1 ;
run;

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

corr ana 1

Correlation Matrix

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

Example

在下面的示例中,我们获得了马力和重量之间的矩阵。

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

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

corr ana 3

SAS - Linear Regression

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

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

Syntax

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

PROC REG DATA = dataset;
MODEL variable_1 = variable_2;

以下是所用参数的描述 -

  1. Dataset 是数据集的名称。

  2. *variable_1 和 variable_2 * 是用于发现相关性的数据集的变量名称。

Example

下面的示例演示了使用 PROC REG. 发现汽车马力和重量这两个变量之间的相关性的过程。在结果中,我们看到截距值,可以用它来形成回归方程式。

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 Analysis

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

Syntax

在 SAS 中应用 PROC SGPLOT 的基本语法是 −

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

以下是所用参数的描述 -

  1. Dataset 是数据集的名称。

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

  3. *REFLINE * 创建水平或垂直参考线。

Example

在以下示例中,我们采用由新旧两种方法产生的两个实验结果。我们计算变量值的差异以及相同观测值的变量均值。我们还计算标准差值,以用于计算的上限和下限。

结果显示 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

Enhanced Model

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

卡方检验用于检查两个分类变量之间的关联关系。它可以用来检验变量之间的独立性程度和相关性程度。SAS 将 PROC FREQ 与选项 chisq 一同使用,以确定卡方检验的结果。

Syntax

在 SAS 中,用于卡方检验的 PROC FREQ 的基本语法如下:

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

以下是所用参数的描述 -

  1. Dataset 是数据集的名称。

  2. Variables 是卡方检验中所用数据集的变量名称。

  3. TESTP 语句中的 Percentage Values 表示变量级别的百分比。

Example

在以下示例中,我们对名为 type 的、位于数据集 SASHELP.CARS. 中的变量进行卡方检验。此变量有 6 个级别,我们根据检验设计给每个级别都分配了一个百分比。

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

Two Way chi-square

双向卡方检验会应用于我们对数据集中的两个变量进行检验的情况。

Example

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

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

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

chi square 3

SAS - Fishers Exact Tests

Fisher 精确检验是一种统计检验,用于确定两个分类变量之间是否存在非随机关联。在 SAS 中,这是使用 PROC FREQ 执行的。我们使用表选项来使用经受 Fisher 精确检验的两个变量。

Syntax

在 SAS 中应用 Fisher 精确检验的基本语法是 −

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

以下是所用参数的描述 -

  1. dataset 是数据集的名称。

  2. Variable_1*Variable_2 是来自数据集的变量。

Applying Fisher Exact Test

要应用 Fisher 精确检验,我们要选择两个分类变量,分别命名为 Test1 和 Test2,并选择相应结果。我们使用 PROC FREQ 应用如下所示的检验。

Example

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 - Repeated Measure Analysis

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

你应该明确 repeated measures designsimple multivariate design. 之间的区别。对于这两种,都会多次对样本成员测量(或试验),但在重复测量设计中,每次试验都代表对相同特征在不同条件下的测量。

PROC GLM 在 SAS 中用来执行重复测量分析。

Syntax

PROC GLM 在 SAS 中的基本语法为 −

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

以下是所用参数的描述 -

  1. dataset 是数据集的名称。

  2. CLASS 给出变量;此变量用作分类变量。

  3. MODEL 使用数据集中的特定变量定义要拟合的模型。

  4. REPEATED 定义每个组的重复测量数来检验假设。

Example

看下面的例子,其中有两组人经受针对一种药物效果的测试。每次对每个人的反应时间都会记录下来,针对四种经过测试的药物类型。在这里,对每组每个人进行 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 - One Way Anova

ANOVA 表示方差分析。在 SAS 中,它通过使用 PROC ANOVA 完成。它分析来自各种实验设计的的数据。在此过程中,会测量在通过分类变量(也即自变量)识别的实验条件下的连续响应变量(也即因变量)。响应中的变异被认为归因于分类中的效应,随机误差解释了剩余的变异。

Syntax

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

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

以下是所用参数的描述 -

  1. dataset 是数据集的名称。

  2. CLASS 给出变量;此变量用作分类变量。

  3. MODEL 定义使用自数据集的特定变量拟合的模型。

  4. Variable_1 and Variable_2 是分析中使用的变量数据集的变量名。

  5. MEANS 定义了计算和均值比较的类型。

Applying ANOVA

现在我们了解一下在 SAS 中应用 ANOVA 的概念。

Example

我们考虑数据集 SASHELP.CARS。在这里,我们研究汽车类型和它们马力之间的关系。由于汽车类型是具有分类值的变量,我们将其作为分类变量并使用这两个变量进行建模。

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

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

anova 1

Applying ANOVA with MEANS

现在我们了解一下在 SAS 中用 MEANS 应用 ANOVA 的概念。

Example

我们还可以通过应用 MEANS 语句来扩展模型,在该语句中我们使用 Turkey 的学生化方法来比较不同汽车类型的均值。汽车类型的分类与每种分类中马力的均值以及某些其他值(如均方误差等)一起列出。

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

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

anova 3

SAS - Hypothesis Testing

假设检验是用统计数据确定给定假设为真的概率。假设检验的通常过程由以下四步组成。

Step-1

制定原假设 H0(通常为观测结果是纯粹机会的结果)和备择假设 H1(通常为观测结果显示真实的效应与机会变异组成)。

Step-2

识别可用于评估原假设真值的检验统计量。

Step-3

计算 P 值,即假设原假设为真的情况下得到一个至少与观测者一样重要的检验统计量的概率。P 值越小,对原假设的反证就越有力。

Step-4

将 p 值与可接受的显著性值 alpha(有时称为 alpha 值)比较。如果 p ⇐alpha,即观测效应具有统计显着性,则排除原假设,而备择假设有效。

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

Test

Description

SAS PROC

T-Test

当需要检验一个变量的均值是否显著不同于一个假设值时,使用 t检验。我们还确定两个独立组的均值是否存在显著差异,以及从属组或配对组的均值是否显著不同。

PROC TTEST

ANOVA

当存在一个独立分类变量时,它也会用于比较均值。在检验以确定间隔相关变量的均值是否根据独立分类变量而不同时,我们将使用单因素方差分析。

PROC ANOVA

Chi-Square

我们使用卡方优度拟合来评估分类变量的频率是否可能因偶然因素而发生。当分类变量的比例是假设值时,必须使用卡方检验。

PROC FREQ

Linear Regression

当想要检验一个变量如何预测另一个变量时,使用简单线性回归。多元线性回归允许检验多个变量如何预测感兴趣的变量。在使用多元线性回归时,我们另外还假设预测变量是独立的。

PROC REG