SAS – 快速指南
SAS – 快速指南
SAS – 概述
SAS代表统计分析软件。它由 SAS 研究所于 1960 年创建。从 1960 年 1 月 1 日起,SAS 被用于数据管理、商业智能、预测分析、描述性和规范性分析等。从那时起,软件中引入了许多新的统计程序和组件。
随着用于统计的 JMP(跳转)的引入,SAS 充分利用了 Macintosh 引入的图形用户界面。Jump 主要用于六西格码、设计、质量控制以及工程和科学分析等应用。
SAS 是独立于平台的,这意味着您可以在 Linux 或 Windows 的任何操作系统上运行 SAS。SAS 由 SAS 程序员驱动,他们在 SAS 数据集上使用多个操作序列来生成正确的数据分析报告。
多年来,SAS 为其产品组合添加了许多解决方案。它有数据治理、数据质量、大数据分析、文本挖掘、欺诈管理、健康科学等方面的解决方案。我们可以有把握地假设 SAS 有适用于每个业务领域的解决方案。
要查看可用产品列表,您可以访问SAS Components
为什么我们使用 SAS
SAS 基本上适用于大型数据集。在 SAS 软件的帮助下,您可以对数据执行各种操作,例如 –
- 数据管理
- 统计分析
- 具有完美图形的报表形成
- 商业计划
- 运筹学和项目管理
- 质量改进
- 应用开发
- 数据提取
- 数据转换
- 数据更新和修改
如果我们谈论 SAS 的组件,那么 SAS 中有 200 多个组件可用。
Sr.No. | SAS 组件及其使用 |
---|---|
1 |
Base SAS 它是包含数据管理工具和用于数据分析的编程语言的核心组件。它也是使用最广泛的。 |
2 |
SAS/GRAPH 创建图表、演示文稿以更好地理解并以适当的格式展示结果。 |
3 |
SAS/STAT 使用方差分析、回归、多变量分析、生存分析和心理测量分析、混合模型分析进行统计分析。 |
4 |
SAS/OR 行动调查。 |
5 |
SAS/ETS 计量经济学和时间序列分析。 |
6 |
SAS/IML C交互式矩阵语言。 |
7 |
SAS/AF 应用设施。 |
8 |
SAS/QC 质量控制。 |
9 |
SAS/INSIGHT 数据挖掘。 |
10 |
SAS/PH 临床试验分析。 |
11 |
SAS/Enterprise Miner 数据挖掘。 |
SAS 软件的类型
- Windows 或 PC SAS
- SAS EG(企业指南)
- SAS EM (Enterprise Miner ie for Predictive Analysis)
- SAS 均值
- SAS统计
大多数情况下,我们在组织和培训机构中使用 Window SAS。一些组织使用 Linux,但没有图形用户界面,因此您必须为每个查询编写代码。但是在 window SAS 中有很多实用程序可用,这对程序员非常有帮助,同时也减少了编写代码的时间。
SaS 窗口有 5 个部分。
Sr.No. | SAS 窗口及其用法 |
---|---|
1 |
Log Window 日志窗口就像一个执行窗口,我们可以在其中检查 SAS 程序的执行情况。在这个窗口中,我们也可以检查错误。每次运行程序后检查日志窗口非常重要。这样我们就可以对我们程序的执行有正确的理解。 |
2 |
编辑器窗口 编辑器窗口是我们编写所有代码的 SAS 部分。它就像一个记事本。 |
3 |
Output Window 输出窗口是我们可以看到程序输出的结果窗口。 |
4 |
Result Window 它就像所有输出的索引。我们在 SAS 的一个会话中运行的所有程序都列在那里,您可以通过单击输出结果来打开输出。但这些仅在 SAS 的一次会议中提及。如果我们关闭软件然后打开它,那么结果窗口将是空的。 |
5 |
Explore Window 这里列出了所有库。您还可以从这里浏览系统 SAS 支持的文件。 |
SAS 中的图书馆
库就像 SAS 中的存储。您可以创建一个库并将所有类似的程序保存在该库中。SAS 为您提供创建多个库的工具。SAS 逻辑库只有 8 个字符长。
SAS 中有两种类型的库 –
Sr.No. | SAS 窗口及其用法 |
---|---|
1 |
Temporary or Work Library 这是 SAS 的默认库。如果我们不为它们分配任何其他库,我们创建的所有程序都存储在这个工作库中。您可以在浏览窗口中查看此工作库。如果您创建了一个 SAS 程序并且没有为其分配任何永久库,那么如果您在此之后再次启动该软件结束会话,则该程序将不会在工作库中。因为只要会话继续,它就会只存在于工作库中。 |
2 |
Permanent Library 这些是 SAS 的永久库。我们可以通过使用 SAS 实用程序或通过在编辑器窗口中编写代码来创建新的 SAS 库。这些库被命名为永久库,因为如果我们在 SAS 中创建一个程序并将其保存在这些永久库中,那么只要我们需要它们就可以使用。 |
SAS – 环境
SAS Institute Inc. 发布了一个免费的SAS University Edition,它足以用于学习 SAS 编程。它提供了您在 BASE SAS 编程中需要学习的所有功能,从而使您能够学习任何其他 SAS 组件。
下载和安装 SAS University Edition 的过程非常简单。它可用作需要在虚拟环境中运行的虚拟机。您需要先在 PC 中安装虚拟化软件,然后才能运行 SAS 软件。在本教程中,我们将使用VMware。以下是下载、设置 SAS 环境和验证安装的步骤的详细信息。
下载 SAS 大学版
SAS University Edition可从 URL SAS University Edition下载。在开始下载之前,请向下滚动以阅读系统要求。访问此 URL 时会出现以下屏幕。
设置虚拟化软件
在同一页面上向下滚动以找到安装 stpe-1。此步骤提供了获取适合您的虚拟化软件的链接。如果您的系统中已经安装了这些软件中的任何一个,则可以跳过此步骤。
快速启动虚拟化软件
如果您完全不熟悉虚拟化环境,您可以通过浏览以下第 2 步提供的指南和视频来熟悉它。如果您已经熟悉,您可以再次跳过此步骤。
下载压缩文件
在第 3 步中,您可以选择与您拥有的虚拟化环境兼容的 SAS University Edition 的适当版本。它下载为名称类似于 unvbasicvapp__9411005__vmx__en__sp0__1.zip 的 zip 文件
解压缩 zip 文件
上面的 zip 文件需要解压缩并存储在适当的目录中。在我们的例子中,我们选择了 VMware zip 文件,解压后显示以下文件。
加载虚拟机
启动 VMware 播放器(或工作站)并打开以扩展名 .vmx 结尾的文件。出现以下画面。请注意分配给虚拟机的内存和硬盘空间等基本设置。
开启虚拟机
单击绿色箭头标记旁边的Power on this virtual machine以启动虚拟机。出现以下屏幕。
当 SAS vm 处于加载状态时,将出现以下屏幕,然后运行的 vm 提示转到将打开 SAS 环境的 URL 位置。
开始 SAS 工作室
打开一个新的浏览器选项卡并加载上述 URL(从一台 PC 到另一台不同)。出现以下屏幕表示 SAS 环境已准备就绪。
SAS 环境
单击Start SAS Studio 后,我们将获得 SAS 环境,该环境默认以可视化程序员模式打开,如下所示。
我们还可以通过单击下拉菜单将其更改为 SAS 程序员模式。
现在我们已准备好编写 SAS 程序。
SAS – 用户界面
SAS 程序是使用称为SAS Studio的用户界面创建的。
下面是对各种窗口及其用法的描述。
SAS 主窗口
这是您在进入 SAS 环境时看到的窗口。左侧是导航窗格,用于导航各种编程功能。右侧是工作区,用于编写代码和执行代码。
代码自动完成
这是一个非常强大的功能,有助于获取 SAS 关键字的正确语法,并提供指向该关键字文档的链接。
程序执行
代码的执行是通过按下运行图标来完成的,运行图标是左起第一个图标或 F3 按钮。
程序日志
执行代码的日志可在“日志”选项卡下找到。它描述了有关程序执行的错误、警告或注释。在此窗口中,您可以获得解决代码故障的所有线索。
计划结果
代码执行的结果显示在 RESULTS 选项卡中。默认情况下,它们被格式化为 html 表格。
程序选项卡
导航区包含创建和管理程序的功能。它还提供了与您的程序一起使用的预构建功能。
服务器文件和文件夹
在此选项卡下,我们可以创建附加程序、导入要分析的数据和查询现有数据。它还可用于创建文件夹快捷方式。
任务
任务选项卡通过仅提供输入变量来提供使用内置 SAS 程序的功能。例如,在 statistics 文件夹下,您可以找到一个 SAS 程序,只需提供 SAS 数据集名称和变量名称即可进行线性回归。
片段
片段选项卡提供了编写 SAS 宏和从现有数据集生成文件的功能
程序库
SAS 将数据集存储在 SAS 库中。临时库仅可用于单个会话,并命名为 WORK。但是永久图书馆总是可用的。
文件快捷方式
此选项卡用于访问存储在 SAS 环境之外的文件。此类文件的快捷方式存储在此选项卡下。
SAS – 程序结构
SAS 编程涉及首先创建/读取数据集到内存中,然后对这些数据进行分析。我们需要了解编写程序以实现这一目标的流程。
SAS 程序结构
下图显示了按给定顺序编写以创建 SAS 程序的步骤。
每个 SAS 程序都必须具备所有这些步骤才能完成读取输入数据、分析数据并给出分析结果。此外,每个步骤末尾的RUN语句也需要完成该步骤的执行。
数据步
此步骤涉及将所需数据集加载到 SAS 内存中并识别数据集的变量(也称为列)。它还捕获记录(也称为观察或主题)。DATA 语句的语法如下。
句法
DATA data_set_name; #Name the data set. INPUT var1,var2,var3; #Define the variables in this data set. NEW_VAR; #Create new variables. LABEL; #Assign labels to variables. DATALINES; #Enter the data. RUN;
例子
下面的示例显示了命名数据集、定义变量、创建新变量和输入数据的简单案例。这里字符串变量的末尾有一个 $,而数值没有它。
DATA TEMP; INPUT ID $ NAME $ SALARY DEPARTMENT $; comm = SALARY*0.25; LABEL ID = 'Employee ID' comm = 'COMMISION'; DATALINES; 1 Rick 623.3 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;
程序步骤
此步骤涉及调用 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 程序
以下是上述每个步骤的完整代码。
程序输出
上面代码的输出可以在RESULTS选项卡中看到。
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形式的评论;其中不能包含分号或不匹配的引号。此外,不应在此类注释中引用任何宏语句。它可以跨越多行并且可以是任意长度。以下是单行注释示例 –
* 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 数据集。它是使用数据步骤创建的。SAS 可以读取各种文件作为其数据源,如CSV、Excel、Access、SPSS 以及原始数据。它还具有许多可供使用的内置数据源。
-
如果 SAS 程序使用这些数据集,然后在会话运行后将其丢弃,则这些数据集称为临时数据集。
-
但是如果它被永久存储以备将来使用,那么它被称为永久数据集。所有永久数据集都存储在特定库下。
SAS 数据集以行和列的形式存储,也称为 SAS 数据表。下面我们将看到内置的永久数据集以及来自外部来源的红色数据集的示例。
SAS 内置数据集
这些数据集已在安装的 SAS 软件中可用。它们可以被探索和用于制定数据分析的示例表达式。要探索这些数据集,请转到Libraries -> My Libraries -> SASHELP。在展开它时,我们会看到所有可用的内置数据集的名称列表。
让我们向下滚动以找到名为CARS的数据集。双击此数据集将在右侧窗格中打开它,我们可以在其中进一步探索它。我们还可以使用右侧窗格下的最大化视图按钮最小化左侧窗格。
我们可以使用底部的滚动条向右滚动以浏览表中的所有列及其值。
导入外部数据集
我们可以使用 SAS Studio 中提供的导入功能将我们自己的文件导出为数据集。但这些文件必须在 SAS 服务器文件夹中可用。因此,我们必须使用Server Files and Folders下的上传选项将源数据文件上传到 SAS 文件夹。
接下来,我们通过导入在 SAS 程序中使用上述文件。为此,我们使用选项Tasks -> Utilities -> Import data,如下所示。双击打开右侧窗口的导入数据按钮,为数据集选择文件。
Next 单击右窗格中导入数据程序下的Select Files按钮。以下是可以导入的文件类型列表。
我们选择本地系统中存储的“employee.txt”文件,得到如下图导入的文件。
查看导入的数据
我们可以通过运行使用 Run 选项生成的默认导入代码来查看导入的数据
我们可以使用与上述相同的方法导入任何其他文件类型,并在各种 SAS 程序中使用它。
SAS – 变量
通常,SAS 中的变量表示它正在分析的数据表的列名。但它也可以用于其他目的,例如将其用作编程循环中的计数器。在当前章节中,我们将看到使用 SAS 变量作为 SAS 数据集的列名。
SAS 变量类型
SAS 具有以下三种类型的变量 –
数值变量
这是默认的变量类型。这些变量用于数学表达式。
句法
INPUT VAR1 VAR2 VAR3; #Define numeric variables in the data set.
在上面的语法中,INPUT 语句显示了数字变量的声明。
例子
INPUT ID SALARY COMM_PERCENT;
字符变量
字符变量用于数学表达式中未使用的值。它们被视为文本或字符串。通过在变量名的末尾添加一个带有空格的 $ sing,一个变量就变成了一个字符变量。
句法
INPUT VAR1 $ VAR2 $ VAR3 $; #Define character variables in the data set.
在上面的语法中,INPUT 语句显示了字符变量的声明。
例子
INPUT FNAME $ LNAME $ ADDRESS $;
日期变量
这些变量仅被视为日期,并且它们需要采用有效的日期格式。通过在变量名的末尾添加一个带有空格的日期格式,一个变量就变成了一个日期变量。
句法
INPUT VAR1 DATE11. VAR2 MMDDYY10. ; #Define date variables in the data set.
在上面的语法中,INPUT 语句显示了日期变量的声明。
例子
INPUT DOB DATE11. START_DATE MMDDYY10. ;
SAS程序中变量的使用
以上变量在SAS程序中使用,如下例所示。
例子
下面的代码显示了如何在 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;
在上面的示例中,所有字符变量都在声明后跟一个 $ 符号,日期变量在声明后跟一个日期格式。上述程序的输出如下。
使用变量
这些变量在分析数据时非常有用。它们用于应用统计分析的表达式中。让我们看一个分析名为CARS的内置数据集的示例,该数据集位于Libraries → My Libraries → SASHELP 下。双击它以探索变量及其数据类型。
接下来,我们可以使用 SAS Studio 中的“任务”选项生成其中一些变量的汇总统计信息。转到任务 -> 统计 -> 汇总统计并双击它以打开如下所示的窗口。选择 Data Set SASHELP.CARS并在 Analysis Variables 下选择三个变量 – MPG_CITY、MPG_Highway 和 Weight。通过单击选择变量的同时按住 Ctrl 键。点击运行。
完成上述步骤后,单击结果选项卡。它显示了所选三个变量的统计摘要。最后一列表示分析中使用的观察(记录)数量。
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;
在运行上面的代码时,我们得到了显示变量名称及其值的输出。
字符串函数
以下是一些经常使用的 SAS 函数的示例。
子字符串
此函数使用开始和结束位置提取子字符串。如果没有提到结束位置,它会提取所有字符直到字符串结束。
句法
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 函数结果的输出。
修剪
此函数从字符串中删除尾随空格。
句法
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 函数结果的输出。
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;
访问数组值
可以使用如下所示的打印过程访问存储在数组中的值。使用上述方法之一声明后,将使用 DATALINES 语句提供数据。
DATA array_example; INPUT a1 $ a2 $ a3 $ a4 $ a5 $; ARRAY colours(5) $ a1-a5; mix = a1||'+'||a2; DATALINES; yello pink orange green blue ; RUN; PROC PRINT DATA = array_example; RUN;
当我们执行上面的代码时,它会产生以下结果 –
使用 OF 运算符
OF 运算符用于分析数组中的数据以对数组的整行执行计算。在下面的示例中,我们在每行中应用值的总和和均值。
DATA array_example_OF; INPUT A1 A2 A3 A4; ARRAY A(4) A1-A4; A_SUM = SUM(OF A(*)); A_MEAN = MEAN(OF A(*)); A_MIN = MIN(OF A(*)); DATALINES; 21 4 52 11 96 25 42 6 ; RUN; PROC PRINT DATA = array_example_OF; RUN;
当我们执行上面的代码时,它会产生以下结果 –
使用 IN 运算符
也可以使用 IN 运算符访问数组中的值,该运算符检查数组行中是否存在值。在下面的示例中,我们检查数据中颜色“黄色”的可用性。该值区分大小写。
DATA array_in_example; INPUT A1 $ A2 $ A3 $ A4 $; ARRAY COLOURS(4) A1-A4; IF 'yellow' IN COLOURS THEN available = 'Yes';ELSE available = 'No'; DATALINES; Orange pink violet yellow ; RUN; PROC PRINT DATA = array_in_example; RUN;
当我们执行上面的代码时,它会产生以下结果 –
SAS – 数字格式
SAS 可以处理多种数字数据格式。它在变量名称的末尾使用这些格式将特定的数字格式应用于数据。SAS 使用两种数字格式。一种用于读取称为informat的数字数据的特定格式,另一种用于以称为输出格式的特定格式显示数字数据。
句法
数字信息的语法是 –
Varname Formatnamew.d
以下是所用参数的描述 –
-
Varname是变量的名称。
-
Formatname是应用于变量的数字格式的名称。
-
w是允许为变量存储的最大数据列数(包括小数点后的数字和小数点本身)。
-
d是小数点右边的位数。
读取数字格式
下面是用于将数据读入 SAS 的格式列表。
输入数字格式
Format | 采用 |
---|---|
n. |
无小数点的最大“n”列数。 |
n.p |
带有“p”个小数点的最大“n”列数。 |
COMMAn.p |
带有“p”小数位的最大“n”列数,可删除任何逗号或美元符号。 |
COMMAn.p |
带有“p”小数位的最大“n”列数,可删除任何逗号或美元符号。 |
显示数字格式
类似于在读取数据时应用格式,下面是用于在 SAS 程序的输出中显示数据的格式列表。
输出数字格式
Format | 采用 |
---|---|
n. |
写下最大“n”位数,不带小数点。 |
n.p |
用“p”个小数点写出最大“np”列数。 |
DOLLARn.p |
用 p 个小数位、前导美元符号和逗号在千位上写下最多“n”个列。 |
请注意 –
-
如果小数点后的位数少于格式说明符,则将在末尾附加零。
-
如果小数点后的位数大于格式说明符,则最后一位将被四舍五入。
例子
下面的例子说明了上述场景。
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 程序正在分析的数据的一部分。
算术运算符
下表描述了算术运算符的详细信息。让我们假设两个数据变量V1和V2的值分别为8和4。
Operator | 描述 | 例子 |
---|---|---|
+ | 添加 | 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;
运行上面的代码,我们得到以下输出。
逻辑运算符
下表描述了逻辑运算符的详细信息。这些运算符计算表达式的真值。因此逻辑运算符的结果始终为 1 或 0。让我们假设两个数据变量V1和V2的值分别为8和4。
Operator | 描述 | 例子 |
---|---|---|
& | 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;
运行上面的代码,我们得到以下输出。
比较运算符
下表描述了比较运算符的详细信息。这些运算符比较变量的值,结果是一个真值,由 1 表示 TRUE,0 表示 False。让我们假设两个数据变量V1和V2的值分别为8和4。
Operator | 描述 | 例子 |
---|---|---|
= | EQUAL 运算符。如果两个数据值相等,则结果为 1,否则为 0。 | (V1 = 8) 给出 1。 |
^= | NOT EQUAL 运算符。如果两个数据值不相等,则结果为 1,否则为 0。 | (V1 ^= V2) 给出 1。 |
< | LESS THAN 运算符。 | (V2 < V2) 给出 1。 |
<= | LESS THAN 或 EQUAL TO 运算符。 | (V2 <= 4) 给出 1。 |
> | GREATER THAN 运算符。 | (V2 > V1) 给出 1。 |
>= | GREATER THAN 或 EQUAL TO 运算符。 | (V2 >= V1) 给出 0。 |
IN | IN 运算符。如果变量的值等于给定值列表中的任何一个值,则返回 1,否则返回 0。 | (5,7,9,8) 中的 V1 给出 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;
运行上面的代码,我们得到以下输出。
最小/最大运算符
下表描述了最小值/最大值运算符的详细信息。这些运算符比较一行中变量的值,并返回行中值列表中的最小值或最大值。
Operator | 描述 | 例子 |
---|---|---|
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;
运行上面的代码,我们得到以下输出。
连接运算符
下表描述了连接运算符的详细信息。此运算符连接两个或多个字符串值。返回单个字符值。
Operator | 描述 | 例子 |
---|---|---|
|| | 连接运算符。它返回两个或多个值的串联。 | ‘你好’||’ 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;
运行上面的代码,我们得到以下输出。
运算符优先级
运算符优先级表示复杂表达式中存在的多个运算符的计算顺序。下表描述了一组运算符中的优先顺序。
Group | 命令 | 符号 |
---|---|---|
Group I | 右到左 | ** + – 不是最小最大值 |
Group II | 左到右 | * / |
Group III | 左到右 | + – |
Group IV | 左到右 | || |
Group V | 左到右 | < <= = >= > |
SAS – 循环
您可能会遇到需要多次执行代码块的情况。通常,语句是按顺序执行的 – 首先执行函数中的第一条语句,然后是第二条,依此类推。但是当你想要一遍又一遍地执行同一组语句时,我们需要循环的帮助。
在 SAS 中,循环是通过使用 DO 语句完成的。它也被称为DO 循环。下面给出的是 SAS 中 DO 循环语句的一般形式。
流程图
以下是 SAS 中的 DO 循环类型。
Sr.No. | 循环类型和描述 |
---|---|
1 | DO Index.
循环从起始值一直持续到索引变量的终止值。 |
2 | DO WHILE.
循环一直持续到 while 条件变为假。 |
3 | DO UNTIL.
循环继续直到 UNTIL 条件变为 True。 |
SAS – 决策制定
决策结构要求程序员指定一个或多个要由程序评估或测试的条件,以及在确定条件为真时要执行的一条或多条语句,以及可选地,如果条件成立则要执行的其他语句确定是假的。
以下是在大多数编程语言中发现的典型决策结构的一般形式 –
SAS 提供以下类型的决策声明。单击以下链接以检查其详细信息。
Sr.No. | 声明类型和描述 |
---|---|
1 | IF Statement.
一个if语句包含的条件。如果条件为真,则获取特定数据。 |
2 | IF-THEN-ELSE Statement.
一个if语句后面else语句,当布尔条件是假的,其执行。 |
3 | IF-THEN-ELSE-IF Statement.
一个if 语句后跟 else 语句,再后跟另一对 IF-THEN 语句。 |
4 | IF-THEN-DELETE Statement.
if 语句由一个条件组成,当为真时,它会从观察中删除特定数据。 |
SAS – 函数
SAS 具有多种内置功能,可帮助分析和处理数据。这些函数用作 DATA 语句的一部分。它们将数据变量作为参数并返回存储到另一个变量中的结果。根据函数的类型,它采用的参数数量可能会有所不同。一些函数接受零参数,而另一些函数接受固定数量的变量。以下是 SAS 提供的函数类型列表。
句法
在 SAS 中使用函数的一般语法如下。
FUNCTIONNAME(argument1, argument2...argumentn)
这里的参数可以是常量、变量、表达式或其他函数。
功能类别
SAS 中的函数根据其用途分类如下。
- 数学
- 日期和时间
- 特点
- 截断
- 各种各样的
数学函数
这些是用于对变量值应用一些数学计算的函数。
例子
下面的 SAS 程序显示了一些重要数学函数的使用。
数据 Math_functions;
v1=21; v2=42; v3=13; v4=10; v5=29; /* Get Maximum value */ max_val = MAX(v1,v2,v3,v4,v5); /* Get Minimum value */ min_val = MIN (v1,v2,v3,v4,v5); /* Get Median value */ med_val = MEDIAN (v1,v2,v3,v4,v5); /* Get a random number */ rand_val = RANUNI(0); /* Get Square root of sum of the values */ SR_val= SQRT(sum(v1,v2,v3,v4,v5)); proc print data = Math_functions noobs; run;
当上面的代码运行时,我们得到以下输出 –
日期和时间函数
这些是用于处理日期和时间值的函数。
例子
下面的 SAS 程序显示了日期和时间函数的使用。
data date_functions; INPUT @1 date1 date9. @11 date2 date9.; format date1 date9. date2 date9.; /* Get the interval between the dates in years*/ Years_ = INTCK('YEAR',date1,date2); /* Get the interval between the dates in months*/ months_ = INTCK('MONTH',date1,date2); /* Get the week day from the date*/ weekday_ = WEEKDAY(date1); /* Get Today's date in SAS date format */ today_ = TODAY(); /* Get current time in SAS time format */ time_ = time(); DATALINES; 21OCT2000 16AUG1998 01MAR2009 11JUL2012 ; proc print data = date_functions noobs; run;
当上面的代码运行时,我们得到以下输出 –
字符函数
这些是用于处理字符或文本值的函数。
例子
下面的 SAS 程序显示了字符函数的使用。
data character_functions; /* Convert the string into lower case */ lowcse_ = LOWCASE('HELLO'); /* Convert the string into upper case */ upcase_ = UPCASE('hello'); /* Reverse the string */ reverse_ = REVERSE('Hello'); /* Return the nth word */ nth_letter_ = SCAN('Learn SAS Now',2); run; proc print data = character_functions noobs; run;
当上面的代码运行时,我们得到以下输出 –
截断函数
这些是用于截断数值的函数。
例子
下面的 SAS 程序显示了截断函数的使用。
data trunc_functions; /* Nearest greatest integer */ ceil_ = CEIL(11.85); /* Nearest greatest integer */ floor_ = FLOOR(11.85); /* Integer portion of a number */ int_ = INT(32.41); /* Round off to nearest value */ round_ = ROUND(5621.78); run; proc print data = trunc_functions noobs; run;
当上面的代码运行时,我们得到以下输出 –
杂项功能
现在让我们通过一些例子来了解 SAS 的其他功能。
例子
下面的 SAS 程序显示了 Miscellaneous 函数的使用。
data misc_functions; /* Nearest greatest integer */ state2=zipstate('01040'); /* Amortization calculation */ payment = mort(50000, . , .10/12,30*12); proc print data = misc_functions noobs; run;
当上面的代码运行时,我们得到以下输出 –
SAS – 输入法
输入法用于读取原始数据。原始数据可能来自外部来源或来自流数据线。输入语句使用您分配给每个字段的名称创建一个变量。所以你必须在 Input Statement 中创建一个变量。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;
在运行上面的代码时,我们得到以下输出。
命名输入法
在此方法中,变量与数据类型一起列出。原始数据被修改为在匹配数据前声明变量名。任何一对相邻列之间的分隔符(通常是空格)应该是统一的。
例子
以下代码和输出显示了命名输入法的使用。
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;
在运行上面的代码时,我们得到以下输出。
列输入法
在此方法中,变量与指定单列数据值的列的数据类型和宽度一起列出。例如,如果员工姓名最多包含 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;
当我们执行上面的代码时,它会产生以下结果 –
格式化输入法
在此方法中,从固定起点读取变量,直到遇到空格。由于每个变量都有一个固定的起点,任何一对变量之间的列数成为第一个变量的宽度。字符“@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;
当我们执行上面的代码时,它会产生以下结果 –
SAS – 宏
SAS 有一个强大的编程功能,称为宏,它允许我们避免代码的重复部分,并在需要时一次又一次地使用它们。它还有助于在代码中创建动态变量,这些变量可以为同一代码的不同运行实例采用不同的值。也可以为代码块声明宏,这些代码块将以类似于宏变量的方式多次重用。我们将在下面的示例中看到这两种情况。
宏变量
这些是保存值的变量,SAS 程序会一次又一次地使用这些值。它们在 SAS 程序开始时声明,稍后在程序主体中调用。它们的范围可以是全局或本地。
全局宏变量
它们被称为全局宏变量,因为它们可以被 SAS 环境中可用的任何 SAS 程序访问。通常,它们是系统分配的变量,可被多个程序访问。一般示例是系统日期。
例子
下面是一个名为 SYSDATE 的 SAS 变量示例,它表示系统日期。考虑这样一种情况,即在生成报告的每一天在 SAS 报告的标题中打印系统日期。标题将显示当前日期和日期,无需我们为它们编码任何值。我们使用 SASHELP 库中可用的称为 CARS 的内置 SAS 数据集。
proc print data = sashelp.cars; where make = 'Audi' and type = 'Sports' ; TITLE "Sales as of &SYSDAY &SYSDATE"; run;
当上面的代码运行时,我们得到以下输出。
局部宏变量
这些变量可以被 SAS 程序访问,在这些程序中它们被声明为程序的一部分。它们通常用于为相同的 SAS 语句 sl 提供不同的变量,以便它们可以处理数据集的不同观察结果。
句法
局部变量使用以下语法进行标记。
% LET (Macro Variable Name) = Value;
这里的值字段可以根据程序的要求采用任何数字、文本或日期值。宏变量名称是任何有效的 SAS 变量。
例子
SAS 语句使用变量名开头附加的&字符来使用这些变量。下面的程序让我们对制造“奥迪”和类型“运动”进行了所有观察。如果我们想要不同 make的结果,我们需要改变变量make_name的值而不改变程序的任何其他部分。在引入程序的情况下,可以在任何 SAS 语句中一次又一次地引用该变量。
%LET make_name = 'Audi'; %LET type_name = 'Sports'; proc print data = sashelp.cars; where make = &make_name and type = &type_name ; TITLE "Sales as of &SYSDAY &SYSDATE"; run;
当上面的代码运行时,我们得到与前面程序相同的输出。但是让我们将类型名称更改为“Wagon”并运行相同的程序。我们将得到以下结果。
宏程序
宏是一组由名称引用的 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 staemnet 进行decalres;此宏正在被其他 SAS 语句调用。
%MACRO show_result(make_ , type_); proc print data = sashelp.cars; where make = "&make_" and type = "&type_" ; TITLE "Sales as of &SYSDAY &SYSDATE"; run; %MEND; %show_result(BMW,SUV);
当上面的代码运行时,我们得到以下输出。
常用宏
SAS 有许多内置在 SAS 编程语言中的 MACRO 语句。它们被其他 SAS 程序使用而没有明确声明它们。常见的例子是 – 在满足某些条件时终止程序或在程序日志中捕获变量的运行时值。下面是一些例子。
宏 %PUT
此宏语句将文本或宏变量信息写入 SAS 日志。在下面的示例中,变量“today”的值被写入程序日志。
data _null_; CALL SYMPUT ('today', TRIM(PUT("&sysdate"d,worddate22.))); run; %put &today;
当上面的代码运行时,我们得到以下输出。
宏 %RETURN
当某些条件评估为真时,此宏的执行会导致当前正在执行的宏正常终止。在下面的示例中,当变量“val”的值变为 10 时,宏终止,否则继续。
%macro check_condition(val); %if &val = 10 %then %return; data p; x = 34.2; run; %mend check_condition; %check_condition(11) ;
当上面的代码运行时,我们得到以下输出。
宏 %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)
当上面的代码运行时,我们得到以下输出。
SAS – 日期和时间
IN SAS 日期是数值的特殊情况。从 1960 年 1 月 1 日开始,每一天都被分配了一个特定的数值。这个日期被分配了日期值 0,下一个日期的日期值是 1,依此类推。到此日期的前几天由 -1 、 -2 等表示。通过这种方法,SAS 可以表示未来的任何日期和过去的任何日期。
当 SAS 从源读取数据时,它会将读取的数据转换为指定日期格式的特定日期格式。使用所需的正确信息声明存储日期值的变量。使用输出数据格式显示输出日期。
SAS 日期信息
通过使用特定的日期信息可以正确读取源数据,如下所示。informat 末尾的数字表示使用 informat 完整读取的日期字符串的最小宽度。较小的宽度会产生错误的结果。对于 SAS V9,有一个通用日期格式anydtdte15。它可以处理任何日期输入。
Input Date | 日期宽度 | 信息 |
---|---|---|
03/11/2014 | 10 | mmddyy10. |
03/11/14 | 8 | mmddyy8. |
December 11, 2012 | 20 | worddate20. |
14mar2011 | 9 | 日期 9. |
14-mar-2011 | 11 | 日期 11. |
14-mar-2011 | 15 | anydtdte15。 |
例子
下面的代码显示了不同日期格式的读取。请注意所有输出值都只是数字,因为我们没有对输出值应用任何格式声明。
DATA TEMP; INPUT @1 Date1 date11. @12 Date2 anydtdte15. @23 Date3 mmddyy10. ; DATALINES; 02-mar-2012 3/02/2012 3/02/2012 ; PROC PRINT DATA = TEMP; RUN;
执行上述代码后,我们得到以下输出。
SAS 日期输出格式
读取后的日期,可以根据显示需要转换成其他格式。这是使用日期类型的格式语句实现的。它们采用与信息格式相同的格式。
例子
在下面的示例中,日期以一种格式读取,但以另一种格式显示。
DATA TEMP; INPUT @1 DOJ1 mmddyy10. @12 DOJ2 mmddyy10.; format DOJ1 date11. DOJ2 worddate20. ; DATALINES; 01/12/2012 02/11/1998 ; PROC PRINT DATA = TEMP; RUN;
执行上述代码后,我们得到以下输出。
SAS – 读取原始数据
SAS 可以从包括多种文件格式的各种来源读取数据。下面讨论 SAS 环境中使用的文件格式。
- 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;
执行上述代码后,我们得到以下输出。
读取分隔数据
这些是数据文件,其中的列值由分隔字符(如逗号或管道等)分隔。在这种情况下,我们在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;
执行上述代码后,我们得到以下输出。
读取 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;
执行上述代码后,我们得到以下输出。
SAS – 写入数据集
与读取数据集类似,SAS 可以写入不同格式的数据集。它可以将数据从 SAS 文件写入普通文本文件。这些文件可以被其他软件程序读取。SAS 使用PROC EXPORT写入数据集。
程序导出
它是 SAS 内置程序,用于导出 SAS 数据集,以便将数据写入不同格式的文件中。
句法
在 SAS 中编写过程的基本语法是 –
PROC EXPORT DATA = libref.SAS data-set (SAS data-set-options) OUTFILE = "filename" DBMS = identifier LABEL(REPLACE);
以下是所用参数的描述 –
-
SAS data-set是要导出的数据集名称。SAS 可以通过创建可由不同操作系统读取的文件,与其他应用程序共享其环境中的数据集。它使用内置的 EXPORT 函数输出各种格式的数据集文件。在本章中,我们将看到使用proc export以及选项dlm和dbms写入 SAS 数据集。
-
SAS data-set-options用于指定要导出的列的子集。
-
filename是写入数据的文件的名称。
-
标识符用于提及将写入文件的分隔符。
-
LABEL选项用于提及写入文件的变量的名称。
例子
我们将使用SASHELP 库中可用的名为cars 的SAS 数据集。我们将其导出为空格分隔的文本文件,代码如下程序所示。
proc export data = sashelp.cars outfile = '/folders/myfolders/sasuser.v94/TutorialsPoint/car_data.txt' dbms = dlm; delimiter = ' '; run;
在执行上述代码时,我们可以看到输出为文本文件,然后右键单击它以查看其内容,如下所示。
写入 CSV 文件
为了写入逗号分隔的文件,我们可以使用值为“csv”的 dlm 选项。以下代码写入文件 car_data.csv。
proc export data = sashelp.cars outfile = '/folders/myfolders/sasuser.v94/TutorialsPoint/car_data.csv' dbms = csv; run;
在执行上面的代码时,我们得到下面的输出。
编写制表符分隔文件
为了编写制表符分隔的文件,我们可以使用值为“tab”的dlm选项。以下代码写入文件car_tab.txt。
proc export data = sashelp.cars outfile = '/folders/myfolders/sasuser.v94/TutorialsPoint/car_tab.txt' dbms = csv; run;
数据也可以写成 HTML 文件,我们将在输出传送系统章节下看到。
SAS – 连接数据集
可以使用SET语句连接多个 SAS 数据集以提供单个数据集。串联数据集中的观察总数是原始数据集中观察数的总和。观察的顺序是连续的。来自第一个数据集的所有观察结果之后是来自第二个数据集的所有观察结果,依此类推。
理想情况下,所有组合数据集都具有相同的变量,但如果它们具有不同数量的变量,则结果中会出现所有变量,而较小数据集的缺失值。
句法
SAS 中 SET 语句的基本语法是 –
SET data-set 1 data-set 2 data-set 3.....;
以下是所用参数的描述 –
-
data-set1,data-set2是依次写入的数据集名称。
例子
考虑一个组织的员工数据,它在两个不同的数据集中可用,一个用于 IT 部门,另一个用于非 IT 部门。为了获得所有员工的完整详细信息,我们使用如下所示的 SET 语句连接两个数据集。
DATA ITDEPT; INPUT empid name $ salary ; DATALINES; 1 Rick 623.3 3 Mike 611.5 6 Tusar 578.6 ; RUN; DATA NON_ITDEPT; INPUT empid name $ salary ; DATALINES; 2 Dan 515.2 4 Ryan 729.1 5 Gary 843.25 7 Pranab 632.8 8 Rasmi 722.5 RUN; DATA All_Dept; SET ITDEPT NON_ITDEPT; RUN; PROC PRINT DATA = All_Dept; RUN;
执行上述代码后,我们得到以下输出。
场景
当我们在串联数据集中有许多变化时,变量的结果可能不同,但串联数据集中的观察总数始终是每个数据集中观察的总和。我们将在下面考虑这种变化的许多场景。
不同数量的变量
如果原始数据集之一的变量数多于另一个,则数据集仍会合并,但在较小的数据集中,这些变量似乎缺失。
例子
在下面的示例中,第一个数据集有一个名为 DOJ 的额外变量。在结果中,第二个数据集的 DOJ 值将显示为缺失。
DATA ITDEPT; INPUT empid name $ salary DOJ date9. ; DATALINES; 1 Rick 623.3 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;
执行上述代码后,我们得到以下输出。
不同的变量名
在这种情况下,数据集具有相同数量的变量,但它们之间的变量名称不同。在这种情况下,正常串联将产生结果集中的所有变量,并为两个不同的变量提供缺失的结果。虽然我们可能不会更改原始数据集中的变量名称,但我们可以在我们创建的连接数据集中应用 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;
执行上述代码后,我们得到以下输出。
不同的可变长度
如果两个数据集中的变量长度与连接的数据集不同,则连接的数据集中的值会为长度较小的变量截断一些数据。如果第一个数据集的长度较小,就会发生这种情况。为了解决这个问题,我们将更高的长度应用于两个数据集,如下所示。
例子
在下面的示例中,变量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;
执行上述代码后,我们得到以下输出。
SAS – 合并数据集
多个 SAS 数据集可以基于特定的公共变量合并以提供单个数据集。这是使用MERGE语句和BY语句完成的。合并数据集中的观察总数往往小于原始数据集中的观察总数。这是因为当公共变量的值匹配时,来自两个数据集的变量会合并为一个记录。
下面给出了合并数据集的两个先决条件 –
- 输入数据集必须至少有一个要合并的公共变量。
- 输入数据集必须按将用于合并的公共变量排序。
句法
SAS 中 MERGE 和 BY 语句的基本语法是 –
MERGE Data-Set 1 Data-Set 2 BY Common Variable
以下是所用参数的描述 –
-
Data-set1、Data-set2是依次写入的数据集名称。
-
公共变量是基于其匹配值合并数据集的变量。
数据合并
让我们通过一个例子来理解数据合并。
例子
考虑两个 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;
匹配列中的缺失值
可能存在公共变量的某些值在数据集之间不匹配的情况。在这种情况下,数据集仍然会合并,但在结果中会给出缺失值。
例子
考虑数据集工资中缺少员工 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 = 值仅保留数据集SALARY和DEPT中的值匹配的观测值。
DATA All_details; MERGE SALARY(IN = a) DEPT(IN = b); BY (empid); IF a = 1 and b = 1; RUN; PROC PRINT DATA = All_details; RUN;
使用上述更改部分执行上述 SAS 程序后,我们得到以下输出。
1 Rick 623.3 IT 2 Dan 515.2 OPS 4 Ryan 729.1 HR 5 Gary 843.25 FIN 7 Pranab 632.8 OPS 8 Rasmi 722.5 FIN
SAS – 子集数据集
对 SAS 数据集进行子集化意味着通过选择较少数量的变量或较少数量的观察或两者来提取数据集的一部分。变量的子集设置是通过使用KEEP和DROP语句完成的,而观察值的子集设置是使用DELETE语句完成的。
此外,子集操作的结果数据保存在可用于进一步分析的新数据集中。子设置主要用于分析数据集的一部分,而不使用那些可能与分析无关的变量或观察值。
子集变量
在这种方法中,我们只从整个数据集中提取了几个变量。
句法
SAS 中子设置变量的基本语法是 –
KEEP var1 var2 ... ; DROP var1 var2 ... ;
以下是所用参数的描述 –
-
var1 和 var2是数据集中需要保留或删除的变量名称。
例子
考虑以下包含组织员工详细信息的 SAS 数据集。如果我们只对从数据集中获取 Name 和 Department 值感兴趣,那么我们可以使用以下代码。
DATA Employee; INPUT empid ename $ salary DEPT $ ; DATALINES; 1 Rick 623.3 IT 2 Dan 515.2 OPS 3 Mike 611.5 IT 4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 IT 7 Pranab 632.8 OPS 8 Rasmi 722.5 FIN ; RUN; DATA OnlyDept; SET Employee; KEEP ename DEPT; RUN; PROC PRINT DATA = OnlyDept; RUN;
执行上述代码后,我们得到以下输出。
通过删除不需要的变量可以获得相同的结果。下面的代码说明了这一点。
DATA Employee; INPUT empid ename $ salary DEPT $ ; DATALINES; 1 Rick 623.3 IT 2 Dan 515.2 OPS 3 Mike 611.5 IT 4 Ryan 729.1 HR 5 Gary 843.25 FIN 6 Tusar 578.6 IT 7 Pranab 632.8 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;
执行上述代码后,我们得到以下输出。
SAS – 格式化数据集
有时我们更喜欢以不同于数据集中已经存在的格式的格式显示分析的数据。例如,我们想将美元符号和两位小数添加到具有价格信息的变量中。或者我们可能想要显示一个文本变量,全部为大写。我们可以使用FORMAT来应用内置的 SAS 格式,而PROC FORMAT是应用用户定义的格式。也可以将单一格式应用于多个变量。
句法
应用内置 SAS 格式的基本语法是 –
format variable name format name
以下是所用参数的描述 –
-
变量名是数据集中使用的变量名。
-
格式名称是要应用于变量的数据格式。
例子
让我们考虑以下包含组织员工详细信息的 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;
执行上述代码后,我们得到以下输出。
使用程序格式
我们也可以使用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;
执行上述代码后,我们得到以下输出。
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 语句。
下面我们将看到这个 SAS 过程如何用于SQL 中的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 读操作
SQL 中的读取操作涉及编写 SQL SELECT 查询以从表中读取数据。在下面的程序中查询 SASHELP 库中可用的名为 CARS 的 SAS 数据集。该查询获取数据集的一些列。
PROC SQL; SELECT make,model,type,invoice,horsepower FROM SASHELP.CARS ; QUIT;
执行上述代码时,我们得到以下结果 –
带有 WHERE 子句的 SQL SELECT
下面的程序使用where子句查询 CARS 数据集。在结果中,我们只得到了 make 为“Audi”并输入为“Sports”的观察结果。
PROC SQL; SELECT make,model,type,invoice,horsepower FROM SASHELP.CARS Where make = 'Audi' and Type = 'Sports' ; QUIT;
执行上述代码时,我们得到以下结果 –
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;
执行上述代码时,我们得到以下结果 –
SQL DELETE 操作
SQL 中的删除操作涉及使用 SQL DELETE 语句从表中删除某些值。我们继续使用上面例子中的数据,从表中删除员工工资大于900的行。
PROC SQL; DELETE FROM EMPLOYEES2 WHERE SALARY > 900; QUIT; PROC PRINT data = EMPLOYEES2; RUN;
执行上述代码时,我们得到以下结果 –
SAS – 消耗臭氧层物质
SAS 程序的输出可以转换为更易于使用的格式,如.html或PDF。这是通过使用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 输出情况下使用的语句。在其他类型的输出中,我们在文件名中包含路径。
-
样式表示 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;
执行上述代码时,我们得到以下结果 –
创建 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;
执行上述代码时,我们得到以下结果 –
创建 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;
执行上述代码时,我们得到以下结果 –
SAS – 模拟
模拟是一种计算技术,它对许多不同的随机样本使用重复计算以估计统计量。使用 SAS,我们可以模拟在现实世界系统中具有指定统计属性的复杂数据。我们使用软件来构建系统模型并以数值方式生成数据,您可以使用这些数据更好地了解现实世界系统的行为。设计计算机模拟模型的部分艺术是决定现实生活系统的哪些方面需要包含在模型中,以便模型生成的数据可用于做出有效的决策。由于这种复杂性,SAS 具有用于仿真的专用软件组件。
用于创建 SAS 模拟的 SAS 软件组件称为SAS Simulation Studio。其图形用户界面提供了一整套用于构建、执行和分析离散事件仿真模型结果的工具。
下面列出了可以应用 SAS 模拟的不同类型的统计分布。
- 模拟来自连续分布的数据
- 模拟离散分布的数据
- 模拟分布混合中的数据
- 模拟来自复杂分布的数据
- 模拟来自多变量分布的数据
- 近似采样分布
- 评估回归估计
SAS – 直方图
直方图是使用不同高度的条形图来显示数据。它将数据集中的各种数字分组到许多范围内。它还表示对连续变量分布概率的估计。在 SAS 中,PROC UNIVARIATE 用于创建具有以下选项的直方图。
句法
在 SAS 中创建直方图的基本语法是 –
PROC UNIVARAITE DATA = DATASET; HISTOGRAM variables; RUN;
以下是所用参数的描述 –
-
DATASET是使用的数据集的名称。
-
变量是用于绘制直方图的值。
简单直方图
通过指定变量的名称和要考虑对值进行分组的范围来创建一个简单的直方图。
例子
在下面的例子中,我们考虑变量马力的最小值和最大值,取范围为 50。因此这些值以 50 为步长形成一个组。
proc univariate data = sashelp.cars; histogram horsepower / midpoints = 176 to 350 by 50; run;
当我们执行上面的代码时,我们得到以下输出 –
带曲线拟合的直方图
我们可以使用其他选项将一些分布曲线拟合到直方图中。
例子
在下面的示例中,我们拟合了一条分布曲线,其中均值和标准差值被称为 EST。此选项使用和估计参数。
proc univariate data = sashelp.cars noprint; histogram horsepower / normal ( mu = est sigma = est color = blue w = 2.5 ) barlabel = percent midpoints = 70 to 550 by 50; run;
当我们执行上面的代码时,我们得到以下输出 –
SAS – 条形图
条形图表示矩形条中的数据,条的长度与变量的值成正比。SAS 使用过程PROC SGPLOT创建条形图。我们可以在条形图中绘制简单条形和堆叠条形。在条形图中,每个条形都可以被赋予不同的颜色。
句法
在 SAS 中创建条形图的基本语法是 –
PROC SGPLOT DATA = DATASET; VBAR variables; RUN;
以下是所用参数的描述 –
-
DATASET – 是使用的数据集的名称。
-
变量– 是用于绘制直方图的值。
简单条形图
简单条形图是一种条形图,其中数据集中的变量表示为条形。
例子
下面的脚本将创建一个条形图,将汽车的长度表示为条形。
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;
当我们执行上面的代码时,我们得到以下输出 –
堆积条形图
堆积条形图是一种条形图,其中数据集中的变量相对于另一个变量进行计算。
例子
下面的脚本将创建一个堆叠条形图,其中为每种汽车类型计算汽车的长度。我们使用 group 选项来指定第二个变量。
proc SGPLOT data = work.cars1; vbar length /group = type ; title 'Lengths of Cars by Types'; run; quit;
当我们执行上面的代码时,我们得到以下输出 –
簇状条形图
创建簇状条形图以显示变量值如何在文化中分布。
例子
下面的脚本将创建一个聚集条形图,其中汽车的长度围绕汽车类型聚集。所以我们看到两个相邻的条形长度为 191,一个用于汽车类型“轿车”,另一个用于汽车类型“货车” .
proc SGPLOT data = work.cars1; vbar length /group = type GROUPDISPLAY = CLUSTER; title 'Cluster of Cars by Types'; run; quit;
当我们执行上面的代码时,我们得到以下输出 –
SAS – 饼图
饼图将值表示为具有不同颜色的圆的切片。切片被标记并且与每个切片对应的数字也在图表中表示。
在 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;
当我们执行上面的代码时,我们得到以下输出 –
带有数据标签的饼图
在此饼图中,我们表示每个切片的分数值和百分比值。我们还将标签的位置更改为图表内。图表的外观样式通过使用 DATASKIN 选项进行修改。它使用 SAS 环境中可用的内置样式之一。
例子
PROC TEMPLATE; DEFINE STATGRAPH pie; BEGINGRAPH; LAYOUT REGION; PIECHART CATEGORY = type / DATALABELLOCATION = INSIDE DATALABELCONTENT = ALL CATEGORYDIRECTION = CLOCKWISE DATASKIN = SHEEN START = 180 NAME = 'pie'; DISCRETELEGEND 'pie' / TITLE = 'Car Types'; ENDLAYOUT; ENDGRAPH; END; RUN; PROC SGRENDER DATA = cars1 TEMPLATE = pie; RUN;
当我们执行上面的代码时,我们得到以下输出 –
分组饼图
在此饼图中,图中显示的变量值相对于同一数据集的另一个变量进行分组。每个组变成一个圆圈,图表中的同心圆与可用组的数量一样多。
例子
在下面的示例中,我们根据名为“Make”的变量对图表进行分组。由于有两个值(“奥迪”和“宝马”),因此我们得到两个同心圆,每个同心圆代表各自品牌的汽车类型。
PROC TEMPLATE; DEFINE STATGRAPH pie; BEGINGRAPH; LAYOUT REGION; PIECHART CATEGORY = type / Group = make DATALABELLOCATION = INSIDE DATALABELCONTENT = ALL CATEGORYDIRECTION = CLOCKWISE DATASKIN = SHEEN START = 180 NAME = 'pie'; DISCRETELEGEND 'pie' / TITLE = 'Car Types'; ENDLAYOUT; ENDGRAPH; END; RUN; PROC SGRENDER DATA = cars1 TEMPLATE = pie; RUN;
当我们执行上面的代码时,我们得到以下输出 –
SAS – 散点图
散点图是一种图形,它使用绘制在笛卡尔平面上的两个变量的值。它通常用于找出两个变量之间的关系。在 SAS 中,我们使用PROC SGSCATTER来创建散点图。
请注意,我们在第一个示例中创建了名为 CARS1 的数据集,并为所有后续数据集使用相同的数据集。该数据集保留在工作逻辑库中,直到 SAS 会话结束。
句法
在 SAS 中创建散点图的基本语法是 –
PROC sgscatter DATA = DATASET; PLOT VARIABLE_1 * VARIABLE_2 / datalabel = VARIABLE group = VARIABLE; RUN;
以下是所用参数的描述 –
-
DATASET是数据集的名称。
-
VARIABLE是数据集中使用的变量。
简单散点图
在一个简单的散点图中,我们从数据集中选择两个变量,并根据第三个变量对它们进行分组。我们还可以标记数据。结果显示了两个变量在笛卡尔平面中的分布情况。
例子
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;
当我们执行上面的代码时,我们得到以下输出 –
带预测的散点图
我们可以使用估计参数通过在值周围绘制椭圆来预测它们之间的相关强度。我们使用程序中的附加选项来绘制椭圆,如下所示。
例子
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;
当我们执行上面的代码时,我们得到以下输出 –
散点矩阵
我们还可以通过将它们分组为两个以上变量的散点图。在下面的示例中,我们考虑三个变量并绘制散点图矩阵。我们得到 3 对结果矩阵。
例子
PROC sgscatter DATA = CARS1; matrix horsepower invoice length / group = type; title 'Horsepower vs. Invoice vs. Length for car makers by types'; RUN;
当我们执行上面的代码时,我们得到以下输出 –
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;
以下是所用参数的描述 –
-
DATASET – 是使用的数据集的名称。
-
VARIABLE – 是用于绘制箱线图的值。
简单箱线图
在一个简单的箱线图中,我们从数据集中选择一个变量,然后选择另一个来形成一个类别。第一个变量的值被分类到与第二个变量中不同值的数量一样多的组中。
例子
在下面的示例中,我们选择变量马力作为第一个变量并键入作为类别变量。所以我们得到了每种汽车马力值分布的箱线图。
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;
当我们执行上面的代码时,我们得到以下输出 –
垂直面板中的箱线图
我们可以将变量的箱线图划分为许多垂直面板(列)。每个面板都包含所有分类变量的箱线图。但是箱线图使用另一个第三个变量进一步分组,该变量将图形划分为多个面板。
例子
在下面的示例中,我们使用变量“make”对图形进行了面板化。由于 ‘make’ 有两个不同的值,所以我们得到两个垂直面板。
PROC SGPANEL DATA = CARS1; PANELBY MAKE; VBOX horsepower / category = type; title 'Horsepower of cars by types'; RUN;
当我们执行上面的代码时,我们得到以下输出 –
水平面板中的箱线图
我们可以将变量的箱线图划分为许多水平面板(行)。每个面板都包含所有分类变量的箱线图。但是箱线图使用另一个第三个变量进一步分组,该变量将图形划分为多个面板。在下面的示例中,我们使用变量“make”对图形进行了面板化。由于 ‘make’ 有两个不同的值,所以我们得到两个水平面板。
PROC SGPANEL DATA = CARS1; PANELBY MAKE / columns = 1 novarname; VBOX horsepower / category = type; title 'Horsepower of cars by types'; RUN;
当我们执行上面的代码时,我们得到以下输出 –
SAS – 算术平均值
算术平均值是将数值变量的值相加,然后除以变量数所得到的值。它也被称为平均。在 SAS 算术平均值是使用PROC MEANS计算的。使用此 SAS 程序,我们可以找到数据集所有变量或某些变量的平均值。我们还可以形成组并找到特定于该组的值的变量的平均值。
句法
在 SAS 中计算算术平均值的基本语法是 –
PROC MEANS DATA = DATASET; CLASS Variables ; VAR Variables;
以下是所用参数的描述 –
-
DATASET – 是使用的数据集的名称。
-
变量– 是数据集中变量的名称。
数据集的均值
数据集中每个数值变量的平均值是通过使用 PROC 计算的,只提供数据集名称而不提供任何变量。
例子
在下面的示例中,我们找到名为 CARS 的 SAS 数据集中所有数值变量的平均值。我们将小数点后的最大位数指定为 2,并计算这些变量的总和。
PROC MEANS DATA = sashelp.CARS Mean SUM MAXDEC=2; RUN;
执行上述代码时,我们得到以下输出 –
选择变量的均值
我们可以通过在var选项中提供它们的名称来获得一些变量的平均值。
例子
下面我们计算三个变量的平均值。
PROC MEANS DATA = sashelp.CARS mean SUM MAXDEC=2 ; var horsepower invoice EngineSize; RUN;
执行上述代码时,我们得到以下输出 –
按类别平均
我们可以通过使用其他一些变量将它们组织到组中来找到数值变量的平均值。
例子
在下面的示例中,我们找到了每种汽车品牌下每种类型的可变马力的平均值。
PROC MEANS DATA = sashelp.CARS mean SUM MAXDEC=2; class make type; var horsepower; RUN;
执行上述代码时,我们得到以下输出 –
SAS – 标准差
标准差 (SD) 是衡量数据集中的数据变化程度的指标。从数学上讲,它测量每个值与数据集平均值的距离或接近程度。接近 0 的标准差值表示数据点往往非常接近数据集的平均值,高标准差值表示数据点分布在更广泛的值范围内
在 SAS 中,使用 PROC MEAN 和 PROC SURVEYMEANS 测量 SD 值。
使用 PROC 手段
使用proc测量 SD意味着我们在 PROC 步骤中选择 STD 选项。它显示了数据集中存在的每个数值变量的 SD 值。
句法
在 SAS 中计算标准偏差的基本语法是 –
PROC means DATA = dataset STD;
以下是所用参数的描述 –
-
数据集– 是数据集的名称。
例子
在下面的示例中,我们从 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;
当我们执行上面的代码时,它会给出以下输出 –
使用 PROC SURVEYMEANS
此过程还用于测量 SD 以及一些高级功能,例如测量分类变量的 SD 以及提供方差估计。
句法
使用 PROC SURVEYMEANS 的语法是 –
PROC SURVEYMEANS options statistic-keywords ; BY variables ; CLASS variables ; VAR variables ;
以下是所用参数的描述 –
-
BY – 表示用于创建观察组的变量。
-
CLASS – 表示用于分类变量的变量。
-
VAR – 表示将为其计算 SD 的变量。
例子
下面的示例描述了class选项的使用,它为 class 变量中的每个值创建统计信息。
proc surveymeans data = CARS1 STD; class type; var type horsepower; ods output statistics = rectangle; run; proc print data = rectangle; run;
当我们执行上面的代码时,它会给出以下输出 –
使用 BY 选项
下面的代码给出了 BY 选项的示例。在其中,结果针对 BY 选项中的每个值进行分组。
例子
proc surveymeans data = CARS1 STD; var horsepower; BY make; ods output statistics = rectangle; run; proc print data = rectangle; run;
当我们执行上面的代码时,它会给出以下输出 –
make = “Audi” 的结果
make = “BMW” 的结果
SAS – 频率分布
频率分布是显示数据集中数据点频率的表格。表中的每个条目都包含特定组或区间内值出现的频率或计数,这样,该表总结了样本中值的分布。
SAS 提供了一个称为PROC FREQ的过程来计算数据集中数据点的频率分布。
句法
在 SAS 中计算频率分布的基本语法是 –
PROC FREQ DATA = Dataset ; TABLES Variable_1 ; BY Variable_2 ;
以下是所用参数的描述 –
-
数据集是数据集的名称。
-
Variables_1是需要计算频率分布的数据集的变量名称。
-
Variables_2是对频率分布结果进行分类的变量。
单变频分布
我们可以使用PROC FREQ来确定单个变量的频率分布。在这种情况下,结果将显示变量的每个值的频率。结果还显示百分比分布、累积频率和累积百分比。
例子
在下面的示例中,我们找到名为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;
执行上述代码时,我们得到以下结果 –
多变量频率分布
我们可以找到多个变量的频率分布,将它们分组为所有可能的组合。
例子
在下面的示例中,我们计算按车型分组的汽车品牌的频率分布以及按每个品牌分组的每种汽车类型的频率分布。
proc FREQ data = CARS1 ; tables make type; run;
执行上述代码时,我们得到以下结果 –
带权重的频率分布
使用权重选项,我们可以计算受变量权重影响的频率分布。这里变量的值被视为观察的数量而不是值的计数。
例子
在下面的例子中,我们计算变量 make 和 type 的频率分布,权重分配给马力。
proc FREQ data = CARS1 ; tables make type; weight horsepower; run;
执行上述代码时,我们得到以下结果 –
SAS – 交叉表
交叉表涉及使用两个或多个变量的所有可能组合来生成交叉表,也称为条件表。在 SAS 中,它是使用PROC FREQ和TABLES选项创建的。例如 – 如果我们需要每个车型类别中每个品牌的每个型号的频率,那么我们需要使用 PROC FREQ 的 TABLES 选项。
句法
在 SAS 中应用交叉表的基本语法是 –
PROC FREQ DATA = dataset; TABLES variable_1*Variable_2;
以下是所用参数的描述 –
-
数据集是数据集的名称。
-
Variable_1 和 Variable_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;
执行上述代码时,我们得到以下结果 –
3 个变量的交叉表
当我们有三个变量时,我们可以将其中的 2 个分组,并将这两个变量中的每一个与第三个变量进行交叉制表。所以在结果中我们有两个交叉表。
例子
在下面的示例中,我们找到了每种类型的汽车和每种汽车型号相对于汽车品牌的频率。我们还使用 nocol 和 norow 选项来避免总和和百分比值。
proc FREQ data = CARS2 ; tables make * (type model) / nocol norow nopercent; run;
执行上述代码时,我们得到以下结果 –
4 个变量的交叉表
对于 4 个变量,配对组合的数量增加到 4。组 1 中的每个变量与组 2 中的每个变量配对。
例子
在下面的示例中,我们找到每个品牌和每个型号的汽车长度频率。同样,每个品牌和每个型号的马力频率。
proc FREQ data = CARS2 ; tables (make model) * (length horsepower) / nocol norow nopercent; run;
执行上述代码时,我们得到以下结果 –
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 检验,其中找到具有 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 检验
配对 T 检验用于检验两个因变量是否在统计上彼此不同。
例子
由于汽车的长度和重量相互依赖,因此我们应用配对 T 检验,如下所示。
proc ttest data = cars1 ; paired weight*length; run;
执行上述代码时,我们得到以下结果 –
两个样本 t 检验
此 t 检验旨在比较两组之间相同变量的均值。
例子
在我们的例子中,我们比较了两种不同品牌汽车(“奥迪”和“宝马”)之间可变马力的平均值。
proc ttest data = cars1 sides = 2 alpha = 0.05 h0 = 0; title "Two sample t-test example"; class make; var horsepower; run;
执行上述代码时,我们得到以下结果 –
SAS – 相关分析
相关分析处理变量之间的关系。相关系数是衡量两个变量之间线性关联的指标。相关系数的值始终介于 -1 和 +1 之间。SAS 提供过程PROC CORR来查找数据集中一对变量之间的相关系数。
句法
在 SAS 中应用 PROC CORR 的基本语法是 –
PROC CORR DATA = dataset options; VAR variable;
以下是所用参数的描述 –
-
数据集是数据集的名称。
-
选项是带有绘制矩阵等程序的附加选项。
-
变量是用于查找相关性的数据集的变量名称。
例子
数据集中可用的一对变量之间的相关系数可以通过在 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;
执行上述代码时,我们得到以下结果 –
所有变量之间的相关性
可以通过简单地应用具有数据集名称的过程来获得数据集中所有可用变量之间的相关系数。
例子
在下面的示例中,我们使用数据集 CARS1 并获得显示每对变量之间相关系数的结果。
proc corr data = cars1 ; run;
执行上述代码时,我们得到以下结果 –
相关矩阵
我们可以通过在PROC语句中选择绘制矩阵的选项来获得变量之间的散点图矩阵。
例子
在下面的例子中,我们得到了马力和重量之间的矩阵。
proc corr data = cars1 plots = matrix ; VAR horsepower weight ; run;
执行上述代码时,我们得到以下结果 –
SAS – 线性回归
线性回归用于识别因变量与一个或多个自变量之间的关系。提出了一种关系模型,并使用参数值的估计来开发估计的回归方程。
然后使用各种测试来确定模型是否令人满意。如果是,则估计的回归方程可用于预测因变量的值,给定自变量的值。在 SAS 中,过程PROC REG用于找到两个变量之间的线性回归模型。
句法
在 SAS 中应用 PROC REG 的基本语法是 –
PROC REG DATA = dataset; MODEL variable_1 = variable_2;
以下是所用参数的描述 –
-
数据集是数据集的名称。
-
variable_1 和 variable_2是用于查找相关性的数据集的变量名称。
例子
以下示例显示了使用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;
执行上述代码时,我们得到以下结果 –
上面的代码还给出了模型的各种估计的图形视图,如下所示。作为一个先进的 SAS 程序,它不会仅仅停留在给出截距值作为输出。
SAS – 温和的奥特曼分析
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 ;
执行上述代码时,我们得到以下结果 –
增强型
在上述程序的增强模型中,我们得到了 95% 的置信水平曲线拟合。
proc sgplot data = diffs ; reg x = new y = diff/clm clmtransparency = .5; needle x = new y = diff/baseline = 0; refline 0 / LABEL = ('No diff line'); TITLE 'Enhanced Bland-Altman Plot'; footnote 'Accurate prediction with 10% homogeneous error'; run ; quit ;
执行上述代码时,我们得到以下结果 –
SAS – 卡方
卡方检验用于检查两个分类变量之间的关联。它可用于测试变量之间的依赖程度和独立程度。SAS 使用PROC FREQ和选项chisq来确定卡方检验的结果。
句法
在 SAS 中应用 PROC FREQ 进行卡方检验的基本语法是 –
PROC FREQ DATA = dataset; TABLES variables /CHISQ TESTP = (percentage values);
以下是所用参数的描述 –
-
数据集是数据集的名称。
-
变量是卡方检验中使用的数据集的变量名称。
-
TESTP 语句中的百分比值表示变量水平的百分比。
例子
在下面的示例中,我们考虑对数据集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;
执行上述代码时,我们得到以下结果 –
我们还得到了显示变量类型偏差的条形图,如下面的屏幕截图所示。
双向卡方
当我们将测试应用于数据集的两个变量时,使用双向卡方测试。
例子
在下面的示例中,我们对名为 type 和 origin 的两个变量应用卡方检验。结果显示了这两个变量的所有组合的表格形式。
proc freq data = sashelp.cars; tables type*origin /chisq ; run;
执行上述代码时,我们得到以下结果 –
SAS – Fishers 精确检验
Fisher 精确检验是一种统计检验,用于确定两个分类变量之间是否存在非随机关联。在 SAS 中,这是使用PROC FREQ 进行的。我们使用 Tables 选项来使用经过 Fisher Exact 检验的两个变量。
句法
在 SAS 中应用 Fisher Exact 检验的基本语法是 –
PROC FREQ DATA = dataset ; TABLES Variable_1*Variable_2 / fisher;
以下是所用参数的描述 –
-
dataset是数据集的名称。
-
Variable_1*Variable_2是数据集的变量。
应用 Fisher Exact 检验
为了应用 Fisher 精确检验,我们选择了两个名为 Test1 和 Test2 的分类变量及其结果。我们使用 PROC FREQ 来应用如下所示的检验。
例子
data temp; input Test1 Test2 Result @@; datalines; 1 1 3 1 2 1 2 1 1 2 2 3 ; proc freq; tables Test1*Test2 / fisher; run;
执行上述代码时,我们得到以下结果 –
SAS – 重复测量分析
当随机样本的所有成员在许多不同条件下进行测量时,将使用重复测量分析。当样品依次暴露于每个条件时,重复因变量的测量。在这种情况下使用标准方差分析是不合适的,因为它无法对重复测量之间的相关性进行建模。
人们应该清楚重复测量设计和简单的多变量设计之间的区别。对于这两种情况,样本成员都经过多次测量或试验,但在重复测量设计中,每次试验都代表在不同条件下对相同特性的测量。
在 SAS PROC GLM中用于进行重复测量分析。
句法
SAS 中 PROC GLM 的基本语法是 –
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;
执行上述代码时,我们得到以下结果 –
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 中应用 ANOVA 的概念。
例子
让我们考虑数据集 SASHELP.CARS。在这里,我们研究变量汽车类型与其马力之间的相关性。由于汽车类型是具有分类值的变量,我们将其作为类变量并在模型中使用这两个变量。
PROC ANOVA DATA = SASHELPS.CARS; CLASS type; MODEL horsepower = type; RUN;
执行上述代码时,我们得到以下结果 –
使用 MEANS 应用方差分析
现在让我们了解在 SAS 中应用带有均值的方差分析的概念。
例子
我们还可以通过应用 MEANS 语句来扩展模型,其中我们使用土耳其的学生化方法来比较各种汽车类型的平均值。 汽车类型的类别列出了每个类别中马力的平均值以及一些附加值,例如误差均方等
PROC ANOVA DATA = SASHELPS.CARS; CLASS type; MODEL horsepower = type; MEANS type / tukey lines; RUN;
执行上述代码时,我们得到以下结果 –
SAS – 假设检验
假设检验是使用统计数据来确定给定假设为真的概率。假设检验的通常过程包括如下所示的四个步骤。
第1步
制定原假设 H0(通常,观测是纯偶然的结果)和备择假设 H1(通常,观测显示真实效果与机会变异的分量相结合)。
第2步
确定可用于评估原假设真实性的检验统计量。
步骤 3
计算 P 值,即假设原假设为真,获得至少与观察到的数据一样显着的检验统计量的概率。P 值越小,反对原假设的证据就越强。
第四步
将 p 值与可接受的显着性值 alpha(有时称为 alpha 值)进行比较。如果 p <= alpha,则表示观察到的效果在统计上显着,则排除原假设,替代假设有效。
SAS 编程语言具有执行各种类型的假设检验的功能,如下所示。
Test | 描述 | SAS程序 |
---|---|---|
T-Test | t 检验用于检验一个变量的均值是否与假设值显着不同。我们还确定两个独立组的均值是否显着不同,以及依赖组或配对组的均值是否显着不同。 | 程序测试 |
ANOVA | 当存在一个独立的分类变量时,它还用于比较均值。我们希望在测试时使用单向方差分析,以查看区间因变量的均值是否根据自分类变量不同。 | 方差分析 |
Chi-Square | 我们使用卡方拟合优度来评估分类变量的频率是否可能由于偶然而发生。无论分类变量的比例是否为假设值,都必须使用卡方检验。 | 程序频率 |
Linear Regression | 当想要测试一个变量对另一个变量的预测效果时,可以使用简单线性回归。多重线性回归允许测试多个变量预测感兴趣变量的程度。使用多元线性回归时,我们还假设预测变量是独立的。 | 程序注册 |