i统计软件和数学应用软件课程讲稿原著:李东风课件制作:李东风2016年11月29日ii目录第一章SAS初阶31.
1初识SAS41.
2SAS基本概念61.
3SAS/INSIGHT81.
3.
1SAS/INSIGHT简介81.
3.
2SAS/INSIGHT的数据窗口81.
3.
3一维数据探索91.
3.
4二维数据探索141.
3.
5三维数据探索171.
3.
6图形的调整171.
3.
7分布研究18第二章SAS语言与数据管理232.
1SAS语言构成242.
1.
1SAS语句242.
1.
2SAS表达式252.
1.
3SAS程序规则282.
1.
4全局语句292.
2SAS用作一般高级语言312.
2.
1赋值语句312.
2.
2输出语句322.
2.
3分支结构352.
2.
4循环结构382.
2.
5数组412.
2.
6函数462.
2.
7SAS/IML矩阵功能简介572.
3SAS语言的数据管理功能64iiiiv目录2.
3.
1SAS数据步的运行机制642.
3.
2用input语句输入数据672.
3.
3变量属性872.
3.
4读入外部数据882.
3.
5数据集的复制与修改962.
3.
6用set和output语句拆分数据集1012.
3.
7SET语句其他选项1032.
3.
8数据集的纵向合并1052.
3.
9数据集的横向合并1072.
3.
10用update语句更新数据集1112.
4SAS宏介绍1142.
4.
1实例1142.
4.
2宏变量1152.
4.
3宏子程序1202.
4.
4流程控制结构1272.
4.
5宏程序调试1322.
4.
6宏程序库1332.
4.
7宏引文函数1352.
4.
8宏函数1402.
4.
9自定义宏函数1462.
4.
10宏与数据步的信息交换1482.
4.
11读取多个文件的例子1522.
4.
12动态程序1542.
4.
13用PROCSQL生成宏变量组1592.
5用procsql管理数据1622.
5.
1简单查询1622.
5.
2分组汇总1652.
5.
3生成和删除数据集1662.
5.
4连接1672.
5.
5一些技巧1732.
5.
6高级技巧示例174第三章SAS功能基础1793.
1SAS过程初步1803.
1.
1SAS过程用法1803.
1.
2SAS过程步常用语句1813.
2列表报告185目录v3.
2.
1PROCPRINT基本使用1853.
2.
2SAS界面中的输出管理1873.
2.
3SASODS介绍1883.
2.
4标题和全局语句1923.
2.
5分组与总计1943.
3汇总表格1973.
4数据排序2033.
5数据集转置2053.
6描述统计2103.
7相关系数计算2183.
8用SAS/GRAPH绘图2203.
8.
1散点图和曲线图2203.
8.
2直方图和扇形图2223.
8.
3图形的调整与输出2273.
9分析员模块介绍2283.
9.
1数据管理2283.
9.
2报表2313.
9.
3描述统计2313.
9.
4画图2323.
10补充2343.
10.
1程序纠错2343.
10.
2DATASETS过程2353.
10.
3RANK过程2403.
10.
4STANDARD过程2413.
10.
5FORMAT过程2423.
10.
6REPORT过程247第四章SAS的基本统计分析功能2614.
1几种假设检验2624.
1.
1单总体t检验和p值2624.
1.
2正态性检验2644.
1.
3两独立样本的均值检验2654.
1.
4成对总体均值检验2674.
2回归分析2694.
2.
1用SAS/INSIGHT进行曲线拟合2694.
2.
2用SAS/INSIGHT进行线性回归分析2704.
2.
3用SAS/INSIGHT拟合广义线性模型278vi目录4.
2.
4用REG过程进行回归分析2804.
2.
5用Analyst进行回归分析2874.
3方差分析入门2884.
3.
1用ANOVA过程进行单因素方差分析2884.
3.
2用NPAR1WAY进行非参数单因素方差分析2904.
3.
3多重比较2904.
3.
4多因素方差分析2924.
3.
5用Analyst作方差分析2954.
4属性数据分析2964.
4.
1拟合优度的卡方检验2964.
4.
2列联表的输入与制表2984.
4.
3列联表独立性检验2994.
4.
4属性变量关联度计算301第五章SAS多元统计分析3035.
1多变量分析3045.
1.
1主分量分析3045.
1.
2因子分析3075.
2判别分析3105.
2.
1统计背景3105.
2.
2PROCDISCRIM用法3125.
2.
3因子分析例子3125.
3聚类分析3135.
3.
1谱系聚类方法介绍3135.
3.
2谱系聚类类数的确定3145.
3.
3谱系聚类类数的确定3165.
3.
4聚类分析例子317第六章S语言介绍3196.
1S快速入门3206.
2S向量3256.
2.
1常量3256.
2.
2向量与赋值3256.
2.
3向量运算3266.
2.
4产生有规律的数列3286.
2.
5逻辑向量3296.
2.
6字符型向量329目录vii6.
2.
7复数向量3306.
2.
8向量下标330viii目录目录1前言课程介绍—目的掌握用统计软件处理实际统计问题的能力.
–学会SAS软件和R软件.
–基本数据整理能力.
–典型统计问题的计算及输出结果的分析.
–基本统计计算编程能力.
复习巩固基础统计课程知识.
SAS系统介绍国际上公认的权威统计软件系统;统计专业求职的有力武器;大型、复杂、专业、难学.
本课程采用深入浅出讲法.
功能包括:–数据管理,包括高效、方便地访问大型数据库;–统计分析;–报表图形;–信息系统开发.
S语言介绍统计计算编程的强大工具;包括商业版本S-Plus和自由软件R;自由软件R在全世界统计界得到广泛支持,很多新的统计方法采用S编程并发表为R的软件包.
统计科研机构求职的有力武器.
功能:2目录–强大的交互分析能力和图形功能;–容易学习的统计计算编程;–丰富的编程支持:向量、矩阵、对象等;–常用的统计分析方法及许多最新的实验性的统计方法.
第一章SAS初阶34第一章SAS初阶1.
1初识SASSAS界面启动:–从桌面程序快捷方式图标;–从开始菜单;–从安装的文件夹中的SAS.
EXE程序.
SASAWS界面:–窗口:程序(ProgramEditor)、运行记录(Log)、文本输出(Output);文件管理(Explorer);结果管理(Results).
–菜单、工具栏、状态栏.
从启动到退出称为一个SAS会话.
SAS还可以有命令行交互、批运行、远程提交等运行方式.
SAS快捷方式不同的工作项目使用不同的子目录(文件夹)保存程序和数据.
设某个工作项目的目录为"C:\sub",在此子目录中建立一个SAS快捷方式.
在资源管理器中用右键菜单"属性"打开属性对话框,把"起始位置"栏清空.
为了能够在中文版和英文版之间选择,对于中文版,把快捷方式属性的"目标"栏改为"C:\ProgramFiles\SAS\SAS9.
1\sas.
exe"-config"C:\ProgramFiles\SAS\SAS9.
1\nls\zh\sasv9.
cfg"(如果SAS安装位置和安装版本有差别请相应更改)对于英文版,把快捷方式属性的"目标"栏改为"C:\ProgramFiles\SAS\SAS9.
1\sas.
exe"-config"C:\ProgramFiles\SAS\SAS9.
1\nls\en\sasv9.
cfg"1.
1初识SAS5简单运行样例一个班学生的数学成绩(满分100)和语文成绩(满分120)数据,包括姓名和性别.
输入并计算平均分、显示数据、排序后显示.
从程序例子看SAS程序特点:–以分号结尾;–自由空白;–大小写不区分;–由"数据步"和"过程步"组成.
实际运行.
Log窗口的作用:显示运行情况和可能的错误.
程序有错时的表现.
不论Output有无显示都要看Log窗口.
6第一章SAS初阶1.
2SAS基本概念SAS数据集逻辑概念:行、列结构的表格,每行称为一个观测,每列称为一个变量.
类似于矩阵,但可以整列都取字符型值,并且变量名也是数据集的一部分.
等同于数据库术语"表(table)".
物理存储:操作系统中的文件.
包括描述部分(文件创建信息、变量名、变量的类型等属性)和数据部分.
名字(变量名、数据集名等):大小写不区分,其它规定与一般的高级语言相同(由字母、下划线、数字组成,第一个字符必须是字母或下划线,不允许使用汉字以及小数点、空格、减号等特殊字符),不超过32个字符长.
SAS逻辑库库SAS逻辑库(library,也称数据库)与SAS数据集的关系,基本等同于操作系统中子目录与子目录中文件的关系.
SAS逻辑库有一个"库名(libref)",可以认做是操作系统中子目录的一个SAS中使用的别名.
库名长度不超过8个字符.
建立SAS逻辑库,实际是指把一个操作系统子目录与一个库名联系起来.
用libname语句或快捷图标中的"Newlibrary"图标.
如libnamesamp'c:\work\sas\sampled';用仅有库名的LIBNAME语句取消一个库名:libnamesamp;为了查看逻辑库SAMP中的所有数据集的列表,可以运行如下的程序:PROCDATASETSLIBRARY=sampMEMTYPE=DATANOLIST;CONTENTSDATA=_all_NODS;RUN;QUIT;1.
2SAS基本概念7三个预定义的库:WORK、SASUSER、SASHELP.
数据集的访问格式为"库名.
数据集名"格式,比如SASHELP库中的CLASS数据集写成SASHELP.
CLASS.
WORK库是"临时库":其中的SAS文件在退出SAS系统时自动删除.
另外,WORK库中的数据集可以用"一水平名"访问,即可以省略"WORK.
".
SAS资源管理器(Explorer)管理SAS文件.
除数据集外,SAS数据库中还可以包含叫做"SAS目录簿"(SAScatalog)的SAS文件,主要用来保存设置、程序代码、图形这样的非规整数据.
在SAS资源管理器中双击某一数据集进入VIEWTABLE数据管理界面.
8第一章SAS初阶1.
3SAS/INSIGHT1.
3.
1SAS/INSIGHT简介SAS/INSIGHT简介不需编程的图形操作模块.
功能:数据交互输入、数据探索、分布研究、相关分析、图形.
强大的探索性数据分析能力.
探索性数据分析的重要意义.
1.
3.
2SAS/INSIGHT的数据窗口数据窗口启动:Solutions—Analysis—InteractiveDataAnalysis.
打开SASUSER.
CLASS.
数据窗口组成:数据单元格、变量名、变量类型(区间型或名义型)、变量用途、变量个数;观测序号、观测个数、观测绘点符号;数据窗口菜单.
新建数据集.
用"DeneVariables"修改变量属性.
从"DataOptions"中选回车后的方向.
保存数据集.
编辑数据集.
修改可以体现在分析中但需要保存数据集才能影响到保存在磁盘中的数据集.
选中方式:点击变量名、Shift点击、Control点击;点击观测号、Shift点击、Control点击;选中部分列后用Control点击选行,或选中部分行后用Control点击选列.
删除选定的行或列:主菜单中的"Edit—Delete".
1.
3SAS/INSIGHT9数据窗口菜单FindNext—显示第一个被选定的观测在窗口第一行的位置.
MovetoFirst—把选定的行或列移到最前.
MovetoLast—把选定的行或列移到最后.
Sort—排序.
按选定列排序(缺省升序).
没有选定列时出现对话框选择,可以选择降序、按输出格式结果排序等.
NewObservations—用于快速添加若干个空数据行.
NewVariables—用于快速添加若干个新变量.
DeneVariables—设定变量的名字、标签、量测水平、缺省分析用途等.
可以在生成新数据集时定义变量,也可以对已有数据集的变量属性进行修改.
FillValues—用于自动生成一个等差数列变量.
Extract—把选定的部分取出到另一个窗口.
保存后得到数据子集的数据集.
DataOptions—本数据窗口的一些设置.
计算新变量主菜单的"Edit—Variables"可以计算新变量加入到数据窗口中.
1.
3.
3一维数据探索数据探索的图形方法直方图(Histogram)盒形图(Boxplot)马赛克图(Mosaicplot)散点图(Scatterplot)曲线图(Curves)散点图矩阵(Scatterplotmatrix)三维散点图(Rotatingplot)10第一章SAS初阶直方图直方图用以反映数据的分布情况,既可以针对连续型数据,也可以针对离散数据.
直方图制作以SASUSER.
CLASS数据集为例.
先选定变量height然后点击菜单"Analyze—Histogram/BarCharts(Y)".
也可以不预先选定变量而在随后的对话框中选.
每个条形是一个组,两侧的值是区间端点,高度代表人数(观测个数,Frequency).
点击条形选定这个组(在数据窗口和其它窗口同时选定).
作一个散点图以说明此点.
双击条形可以查看这部分观测.
取消选定:单击空白处.
改变图形大小、位置和角度:选定边框后拖动一个角或一个边.
设置菜单设置菜单:图形中左下角的向右箭头或右键菜单.
1.
3SAS/INSIGHT11Ticks:坐标轴刻度设定;Axes:有没有坐标轴;Observations:是画出所有观测还是只画选定的观测;Values:标出纵坐标的具体值.
保存图形选定图形后用菜单"File—Save—Graphics".
可保存为:–BMP–GIF–PBM–PS–TIFF扩展名自己提供.
保存在当前目录.
离散数据的直方图(条形图)以SEX变量为例.
反映每个类的观测数.
单击一个条形可以快速选定一个类,包括在数据窗口和其它图形中,如直方图和散点图中.
双击条形查看相应观测.
分组直方图打开SASUSER.
GPA,不选中变量,用"Analyze—Histogram/BarCharts(Y)"菜单弹出对话框,选GPA为Y变量,SEX为分组变量.
得到男女生分别的直方图.
要达到同样效果,也可以:–作SEX的条形图,选中女生的条形(值为F).
–作GPA的条形图,然后在图形窗口菜单中去掉"Observation"的勾选.
这样得到女生的GPA分数的直方图.
–类似得到男生的GPA分数的直方图.
12第一章SAS初阶盒形图(Boxplot)盒形图是另外一种表现连续型变量取值分布的图形,比直方图给出的信息更为精简.
直方图是分布密度的一种估计,可以直观看出分布密度形状,以及各不同取值区间的比例;盒形图直观地画出各重要分位点及边缘值,也能对分布大致形状有概要的了解.
盒形图较为简单,所以可以同时绘制多个盒形图以比较不同变量或不同组的分布.
盒形图的解释演示:以SASUSER.
CLASS中height和SASUSER.
GPA中的GPA的盒形图为例.
调用菜单"Analyze—BoxPlot/MosaicPlot".
纵轴代表身高的取值范围;中间的粗线为身高分布的中位数的位置;概括分布位置信息;盒子上边线是分布的四分之三分位数;盒子下边线是分布的四分之一分位数;盒子上下边线包含了分布的中间50%的观测,这个长度叫做"四分位间距"(IQR).
可以反映数据分布分散程度.
从盒子边线向外画了两条线叫做触须线,最长可以延伸到四分位间距的1.
5倍,但是如果已经到了数据的最小值或最大值处就不再延伸.
触须线外如果有单独的点则怀疑是分布的异常值(按照正态分布的经验).
盒形图的解释(续)从盒形图可以看出数据的偏斜情况和重尾情况:–上触须线长而下触须线短,分布右偏;–下触须线长而上触须线短,分布左偏;–任何触须线外有较多点则有重尾现象.
例如,GPA分数有左偏和重尾问题.
1.
3SAS/INSIGHT13用盒形图菜单中的"Means"选项可以在盒形图上加画一个菱形,菱形的中间代表分布的平均值,菱形端点到中间距离为两倍标准差.
如果是变量服从正态分布,菱形上下端点之间应该包含大约95%的观测.
单击或双击盒形图的一部分照样可以选定观测或查看观测.
盒形图的图形菜单Ticks:控制坐标轴画法;Axes:是否画坐标轴;Observations:是画出所有观测还是只画选定的观测;Means:在盒形图上加画一个菱形,菱形的中间代表分布的平均值,菱形端点到中间距离为两倍标准差.
Serifs:在触须线两端画小横线;Values:标出各关键点的值;ReferenceLines:画坐标轴主要刻度的参考线.
MarkerSizes:散点的大小.
并排盒形图盒形图较为简单,所以可以同时绘制多个盒形图以比较不同变量或不同组的分布.
以SASUSER.
GPA数据集为例.
不选定任何变量调用"Analyze—BoxPlot/MosaicPlot"弹出对话框.
选定"HSM、HSS、HSE"三个变量为Y变量,可以画出这三门成绩的并排的盒形图.
这样可以直观比较这三个变量的分布.
选GPA为Y变量,选SEX为X变量,可以并排画出女生和男生的GPA分数的盒形图.
即使有十几个组或十几个变量(如果可比)也能用这种方法粗略地概括其分布.
14第一章SAS初阶马赛克图马赛克图(MosaicPlot)描述离散变量分布.
用菜单"Analyze—BoxPlot/MosaicPlot".
如:SASUSER.
GPA中SEX的马赛克图.
如:SASUSER.
CLASS中SEX和AGE的交叉分组的马赛克图.
选SEX为Y变量,AGE为X变量.
单击某一组选定这一组并显示这一组的观测个数和占总观测数的百分比.
这是选定交叉分组中的某一组的简便办法.
1.
3.
4二维数据探索二维数据探索曲线图;散点图;散点图矩阵.
曲线图以SASUSER.
AIR为例.
曲线图描述一个或几个变量随另一个变量(如时间)变化而变化的情况.
用"Analyze—LinePlot"菜单绘制.
如:CO对DATETIME的曲线图.
图形窗口菜单中的"Observations"这里用来选择曲线上是否显示中间实际存在观测的散点,不再用来选择是否使用所有观测绘图.
单击曲线上一个点选定此点.
拖动出一个矩形可以选定此范围内的观测点.
双击曲线上一个点查看此点对应观测.
在数据窗口中把HOUR的用途改为"Label"(标签),重新绘制CO对DATETIME的曲线图,单击曲线上点时看到此观测点的时间.
可以看出,CO在中午最低,上下班高峰时最高.
1.
3SAS/INSIGHT15以CO、O3、SO2、NO、DUST、WIND为Y变量,DATETIME为X变量画曲线图.
不同颜色代表不同总坐标变量.
选定一个名字或点击一条曲线可以选中一条曲线加亮显示.
可以看出风速增大对污染有抑制作用.
可以用散点图来验证.
散点图散点图可以用来描述两个变量之间的相互关系.
先选中纵坐标变量再选中横坐标变量,然后用菜单"Analyze—ScatterPlot"作散点图;或者不选中任何变量直接调用菜单"Analyze—ScatterPlot"然后在弹出的对话框中指定纵坐标变量和横坐标变量.
演示:SASUSER.
AIR中CO对WIND的散点图(先选中变量);SASUSER.
CLASS中WEIGHT对HEIGHT的散点图(不先选变量).
CO对WIND的图中看出有非线性的相关关系.
WEIGHT对HEIGHT的图中看出有线性相关关系.
对散点图的操作点击一个点可以显示这个点的序号并在数据窗口中选中这个观测.
如果在作散点图的对话框中选了NAME为Label变量,则点击一个点可以显示该点对应的学生名字.
双击一个点可以查看对应观测.
可以用Shift或Ctrl点击选中更多的点.
在散点图中拖出一个矩形可以选中其中的点;拖动这个选择框可以改变选中的范围,这种技术称为"刷亮(Brushing)".
双击选择框可以查看选中的观测.
"投出"选择框可以自动往复移动.
演示:在体重对身高散点图中刷亮并观察数据窗口和性别分布条形图中的变化.
16第一章SAS初阶散点图矩阵散点图矩阵画出多个变量两两间的散点图以考察多变量关系.
只要选中多个变量后用菜单"Analyze—ScatterPlot"就可以作散点图矩阵.
未选中变量时用菜单"Analyze—ScatterPlot"调出对话框然后选多个Y变量和多个X变量可以作出散点图矩阵.
用刷亮的方法可以观察多个变量的互相影响.
CLASS数据集散点图矩阵分析演示:SASUSER.
CLASS中体重、身高、年龄;三者有正向的线性相关关系.
体重与身高关系较明显,年龄的影响稍弱.
年龄取值是离散的.
演示:刷亮观察.
GPA数据集散点图矩阵分析演示:SASUSER.
GPA中各分数.
HSM、HSS、HSE取值离散.
各分数基本呈正向的相关.
SATM和SATV的相关较明显.
演示:刷亮观察.
AIR数据集散点图矩阵分析演示:SASUSER.
AIR中各测量值.
CO、NO、DUST同方向且关系为线性相关,我们称这三者为主要污染;WIND与这三个主要污染反方向变化且关系为非线性.
O3的变量与主要污染有关但是可以看出有一个外在因素的影响;风可以增加O3污染.
SO2也受外在因素的影响,风可以增加SO2污染.
演示:刷亮观察.
1.
3SAS/INSIGHT171.
3.
5三维数据探索旋转图(三维散点图)SAS/INSIGHT提供了绘制旋转图(RotatingPlot)的功能.
旋转图实际是一个三维坐标的散点图,可以拖动旋转.
演示:SASUSER.
CLUS的旋转图.
可以拖动旋转或用图形窗口中的图标控制.
演示:SASUSER.
CLASS中身高、体重、年龄的旋转图.
演示:SASUSER.
AIR中CO、NO、DUST的旋转图.
曲面图SAS/INSIGHT可以绘制曲面图.
设数据集中每一行有曲面上点的x,y坐标和相应的z坐标,数据集中的x,y坐标构成了一个网格.
以SAMP.
DNORM2数据集为例.
选"分析—旋转图"菜单,把变量X,Y,Z选入相应的变量框内.
点击"输出"按钮,在弹出的对话框中勾选"拟合曲面".
按"确定"后出现图形,适当旋转,在图形的局部菜单去掉"观测"的勾选,并选"绘图模式"为"渐变颜色".
如果需要加密网格,可以在初始的对话框中按"方法"按钮加大"水平网格大小"和"垂直网格大小".
1.
3.
6图形的调整图形的调整可以调整坐标轴画法,点的大小、符号、颜色,线型、粗细、颜色,等等.
用"Edit—Window—Tools"调出图形工具窗口.
演示:用SASUSER.
IRIS.
–species:三种类型Virginica,Versicolor,Setosa.
用BarPlot显示.
18第一章SAS初阶–四个测量值petalwid(花瓣宽),petallen(花瓣长),sepalwid(花萼宽),sepallen(花萼长).
作散点图.
–给不同种类使用不同颜色和不同符号.
可以自动赋值或在条形图中选定每类后手工赋值.
演示:SASUSER.
AIR的曲线图中改变线型、颜色、粗细.
1.
3.
7分布研究分布研究分布研究是探索性数据分析的重要方面.
关心:取值类型–连续型–名义型–有序型对于离散型,分布包括:–取哪些值;–各个值出现的次数和比例.
对于连续型,分布包括–可取值的集合;–位置信息,如均值、中位数、众数;–分散程度信息,如标准差、四分位间距、极差、最小值和最大值;–分布形状是否偏斜;–分布是否重尾;–更详细的分布密度形状.
SAS/INSIGHT的一维分布研究功能直方图、盒形图、密度估计图、分布函数估计图;统计量表,包括各阶矩的估计,重要分位数的估计;分布的拟合优度检验.
离散分布的条形图、马赛克图、累计分布表.
1.
3SAS/INSIGHT19数字特征演示:SASUSER.
CLASS中身高分布,用菜单"Analyze—Distribu-tion(Y)".
详细解释各统计量和图形,定义和作用.
统计量定义N—观测个数n;Mean—均值y=1nn∑i=1yi;Sum—总和n∑i=1yi;StdDev—标准差s=√1n1n∑i=1(yiy)2;Variance—方差s2=1n1n∑i=1(yiy)2;Skewness—偏度n(n1)(n2)∑(yiys)3;Kurtosis—峰度n(n+1)(n1)(n2)(n3)∑(yiy)4s43(n1)2(n2)(n3);CV—变异系数sy·100;StdMean—均值的标准误差s/√n.
偏度和峰度理论偏度:偏度=E(X)3σ3其中为均值,σ为标准差.
偏度的正负代表分布偏斜的方向.
理论峰度:峰度=E(X)4σ43正态分布的峰度为0.
峰度的数值代表重尾的情况.
正的峰度表示重尾.
样本偏度和样本峰度有渐近的正态分布.
20第一章SAS初阶标准误差标准误差是统计软件结果中重要的指标.
以正态分布XN(,σ2)中的估计为例,X1,X2,Xn是独立同分布样本.
的估计为=1n∑iXi.
也是一个随机变量,分布为N(,σ2/n),称为抽样分布(Samplingdistribution).
作为无偏估计量,的抽样分布越集中,说明估计越精确;抽样分布的标准差大小可以反映估计的精确程度.
抽样分布的标准差的估计叫做估计量的"标准误差".
比如,估计量的标准误差为σ/√n.
其它估计量也可以类似地估计标准误差以反映估计的精度.
估计量抽样分布经常是正态分布或渐近正态分布,这时估计量加减两倍标准误差可以作为参数的近似95%置信区间,估计量除以标准误差可以作为检验参数是否为零的Z统计量或t统计量.
分位数表Med:中位数;Min,Max:最小值和最大值;Q1,Q3:四分之一和四分之三分位数;Range:极差,为最大值减去最小值的差;Q3-Q1:四分位间距,分布分散程度的指标;Mode:众数.
添加统计表分布研究窗口中Tables、Graphs、Curves菜单被激活.
Tables菜单可以选加一些统计表或统计结果.
1.
3SAS/INSIGHT21BasicCondenceIntervals—计算均值、标准差、方差的各种置信度的置信区间(假定正态分布);TestsforLocation—检验均值是否某一特定值;FrequencyCounts—频数表,包括每一观测值的频数(出现次数)、百分比和累计频数.
RobustMeasuresofScale—变量分散程度的五种稳健估计,及稳健的标准差估计.
TestsforNormality—正态性的检验;Trimmed/WinsorizedMean—截尾的或削平的均值,为稳健的均值估计.
QQ图在Graphs菜单中选"QQPlot".
常用的是关于正态分布的QQ图.
设有n个观测y1,y2,…,yn,并已从小到大排列,则yi是总体的i/n分位数的估计;设xi是标准正态分布的i/n分位数,则在样本来自正态N(,σ2)的情况下,记N(,σ2)的分布函数为F(x),有yi≈F1(in);F(yi)=Φ(yiσ)≈in;yiσ≈Φ1(in)=xi;yi≈+σxi.
用(xi,yi)(i=1,2,n)作为坐标画散点图应该近似呈现为截距、斜率σ的一条直线.
QQ图—连续型修正上述的近似有一个小缺点:y1是观测到的最小值,对应于1/n分位数,yn是观测到的最大值,却对应于n/n=100%分位数,对最小和最大值的处理不对称;这相当于说总体分布不能超过yn,是不合理的.
所以在实际画正态QQ图时,yi不是对应于标准正态的i/n分位数而是对应于其(i0.
375)/(n+0.
25)分位数,这种做法叫做连续性修正.
22第一章SAS初阶这时,y1对应于0.
625n+0.
25分位数而yn对应于10.
625n+0.
25分位数,两边各留了0.
625n+0.
25.
QQ图的典型特征分布密度和分布函数估计包括参数方法和非参数方法.
以SASUSER.
CLASS中HEIGHT为例.
菜单"Curves—ParametricDensity"可在直方图上添加正态分布密度估计.
也可以用对数正态分布、指数分布或威布尔分布.
可以手动调节参数.
核估计图:"Curves—KernelDensity"菜单.
调整平滑参数查看效果.
进行SASUSER.
GPA中GPA的密度估计.
正态性检验:"Curves—TestforDistribution"菜单.
经验分布函数:"Curves—EmpiricalCDF"菜单.
参数方法分布函数估计:"Curves—ParametricCDF"菜单.
第二章SAS语言与数据管理2324第二章SAS语言与数据管理2.
1SAS语言构成2.
1.
1SAS语句介绍SAS系统强大的数据管理能力、计算能力、分析能力依赖于作为其基础的SAS语言.
SAS语言是一个专用的数据管理与分析语言,它的数据管理功能类似于数据库语言(如FoxPro),但又添加了一般高级程序设计语言的许多成分(如分支、循环、数组),以及专用于数据管理、统计计算的函数.
SAS系统的数据管理、报表、图形、统计分析等功能都可以用SAS语言程序来调用,只要指定要完成的任务就可以由SAS系统按照预先设计好的程序去执行,所以SAS语言和FoxPro等属于第四代语言.
本章内容SAS语言的基本成分与规则;SAS语言如何用来管理数据;SAS语言作为一个统计计算语言的用法.
SAS语句SAS语言程序由数据步和过程步组成.
数据步用来生成数据集、计算、整理数据;过程步用来对数据进行分析、报告.
SAS语言的基本单位是语句,每个SAS语句一般由一个关键字(如DATA,PROC,INPUT,CARDS,BY)开头,包含SAS名字、特殊字符、运算符等,以分号结束.
SAS关键字是用于SAS语句开头的特殊单词,SAS语句除了赋值、累加、注释、空语句以外都以关键字开头.
2.
1SAS语言构成25SAS名字SAS名字在SAS程序中标识各种SAS成分,如变量、数据集、数据库,等等.
SAS名字由若干个字母、数字、下划线组成,第一个字符必须是字母或下划线.
SAS关键字和SAS名字都不分大小写.
变量名和数据集名不超过32个字符,数据库名(libref)不超过8个字符.
2.
1.
2SAS表达式SAS表达式SAS数据步程序中的计算用表达式完成.
表达式把常量、变量、函数调用用运算符、括号连接起来得到一个计算结果.
SAS常量SAS常量主要有数值型、字符型两种,并且还提供了用于表达日期、时间的数据类型.
例如–数值型:12,7.
5,2.
5E10–字符型:'Beijing',"LiMing","李明"数值型常数可以用整数、定点实数、科学计数法实数表示.
字符型常数为两边用单撇号或两边用双撇号包围的若干字符.
当字符串内容有单撇号时,可以用双撇号界定,当字符串内容有双撇号时,可以用单撇号界定.
另外,在字符串中,重复的单撇号可以作为一个单撇号内容,如'Tom"cat'内容是"Tom'scat".
SAS日期和时间SAS日期型常量如:'13JUL1998'd;日期型常数是在表示日期的字符串后加一个字母d(大小写均可),中间没有空格.
日期值保存为从1960年1月1日后经过的天数.
时间型常量如:'14:20:15.
32't,'14:20't(没有秒);时间型常数是在表示时间的字符串后加一个字母t.
保存为秒数.
日期时间型常量如:'13JUL1998:14:20:15.
32'dt;26第二章SAS语言与数据管理日期时间型常数在表示日期时间的字符串后加字母dt.
保存为从1960年1月1日0时后经过的秒数.
缺失值数据处理时经常遇到缺失值,如:–数据遗失;–被访者拒绝回答;–节假日无数据.
SAS程序中用一个单独的小数点来表示数值型缺失值常量.
对于字符型数据,用只有一个空格的字符串''表示缺失值.
变量X是否数值型缺失值可以用X=.
来判断,是否字符型缺失值可以用X=''来判断.
数值型缺失值在排序和比较时排在最小端.
数值型缺失值参与计算的结果也是缺失的.
SAS变量SAS变量的基本类型有两种:数值型和字符型.
日期、时间等变量存为数值型.
存储长度:SAS的数值型变量可以存储任意整数、定点实数、浮点实数,一般不关心其区别.
缺省用8个字符存储,精度有16到17位有效数字.
SAS在读入字符型变量时缺省的长度是8个字符,但是如果在INPUT语句中输入字符型变量时指定了长度则不受此限制,最多可存32767个字符.
直接用赋值语句定义的字符型变量的缺省长度是第一次赋值的字符串长度.
可以用LENGTH语句直接指定变量长度,LENGTH语句一般应出现在变量定义之前,格式为:LENGTH字符型变量名$长度;2.
1SAS语言构成27SAS算数运算符SAS运算符包括算术、比较、逻辑等运算符.
算术运算符为运算优先级按通常的优先规则.
其中两个星号表示乘方运算.
SAS比较运算符比较运算符用于比较值大小,包括INEQNEGTLTGELE比较运算符得到"真"或"假"的结果,真用1表示,假用0表示.
两个字符型的比较是把短的一个右边补空格到两个长度相同后比较.
在后面加一个冒号变成如=:这样则可以只比较与短的一个等长的部分.
运算符IN是一个SAS特有的比较运算符,用来检查某个变量的取值是否在一个给定列表中,比如provin('北京','天津','上海','重庆')可以判断变量prov的取值是否为四个直辖市之一.
列表为圆括号界定的用逗号或空格分开的若干常量.
也可以使用NOTIN表示"不属于".
SAS逻辑运算符逻辑运算符用来连接比较得到的结果以构成复杂的条件,有三种逻辑运算符:&(AND)|(OR)(NOT)例如(salary>=1000)AND(salary=1000)AND(salary:用于取两个运算值中较大一个(比如35结果为5);>0THENPUT'X为正数';严格说来,SAS中任何非0并且非缺失的数值型值都是真值,只有0和数值型缺失值是假值.
36第二章SAS语言与数据管理复合语句使用"DO;"和"END;"包围起来的若干个语句可以看作是一个语句,叫做复合语句.
例:IFx>0THENDO;PUT'X为正数';x=2*x;PUTx=;END;IF-ELSE结构IF条件THEN语句;ELSE语句;如IFx>=0THENx=2*x;ELSEx=-x;注意IF-ELSE结构不需要END或ENDIF结尾.
IF-ELSEIF-ELSE结构IF条件1THEN语句1;ELSEIF条件2THEN语句2;……………………ELSE语句;如IFx=5);n+1;putn=;end;run;n+1这种写法叫做累加语句,等价于n=n+1.
2.
2SAS用作一般高级语言412.
2.
5数组数组SAS可以把一组同为数值型或同为字符型的变量合在一起,使用同一个名字称呼,用下标来区分.
这与通常的程序设计语言中的数组不同,通常的程序设计语言中数组元素没有对应的变量,而SAS数组每个元素都有自己的变量.
SAS提供了"临时"数组,和其他语言中的数组相同,不对应数据集的变量.
数值型数组ARRAY数组名(维数说明)数组元素名列表(初始值表);例:ARRAYtests(3)mathchineseenglish(0,0,0);初始值表可简写为(3*0)这样的形式.
初始值表是可选的.
如果某变量对应的数组元素有初始值,则此变量的值不会被数据步隐含循环自动赋缺失值(关于数据步隐含循环详见第3节).
可以用带上下界的下标,如:ARRAYsales(95:97)yr95-yr97;可以使用星号作为数组维数说明,这时数组元素个数由数组元素列表确定.
如:ARRAYtests(*)mathchineseenglish(0,0,0);对这样的数组可以用函数DIM(数组名)来获得其长度.
ARRAY语句中数组元素名表可省略.
这时(1)数组元素自动对应以数组名为前缀的变量名.
42第二章SAS语言与数据管理(2)如果当前没有这些变量,自动生成这些变量.
比如,数组说明为ARRAYsales(3);如果当前数据集中有名为sales1,sales2,sales3的三个变量,则数组sales的三个元素与这三个变量对应;如果当前数据集中没有这三个变量,以上数组声明自动生成名为sales1,sales2,sales3的三个变量并与之对应.
例设数据中用999表示缺失,需要把每个数值型变量的999变成缺失值.
dataone;inputa$bcdefg;cards;99923175810.
0023126850613joe54346340.
0018165301512bill36704510.
0020134620914mary999527400.
00171485999916bob479990.
001615399905999jack62835980.
0019142761218;run;datatwo;setone;arrayx(6)bcdefg;doi=1to6;ifx(i)=999thenx(i)=.
;end;dropi;run;2.
2SAS用作一般高级语言43procprintdata=two;run;array语句中的变量列表可以用_NUMERIC_代表所有数值型变量,如:datathree;setone;arrayx(*)_numeric_;doi=1todim(x);ifx(i)=999thenx(i)=.
;end;dropi;run;procprintdata=three;run;数组说明中"*"代表自动按变量个数计算数组长度,DIM(x)求数组x的长度.
例设数据中每行有5个性别,希望计算每行男性人数和女性人数,属于对列的循环处理.
用数组和循环.
datacounting;inputgender1-gender5;arraygender(5)gender1-gender5;males=0;females=0;doi=1to5;ifgender(i)=1thenmales=males+1;elseifgender(i)=2thenfemales=females+1;end;44第二章SAS语言与数据管理dropi;cards;121112122122211;procprint;run;例设数据中每行有4个值,希望每行的4个值从小到大排列.
dataone;inputy1-y4;cards;15362746128365214295443;run;例可以用ordinal函数:datathree;setone;arrayx(4);doi=1to4;x(i)=ordinal(i,ofy1-y4);end;dropi;run;2.
2SAS用作一般高级语言45procprintdata=three;run;字符型数组定义字符型数组时需要加一个$符来说明数组元素类型为字符型,并且要说明每一元素所能存储的字符串的最大长度.
说明格式如下:ARRAY数组名(维数说明)$元素长度说明数组元素名列表(初始值表);其中$说明不可省略.
元素长度声明可以省略,这时默认长度为8字节.
例:ARRAYnames(3)$10childfathermother;二维数组二维数组在维数说明中指定用逗号分开的两个下标界.
如arraytable(2,2)x11x12x21x22;注意:这样的数据集每行保存一个矩阵(二维数组)的所有元素,整个数据集保存了多个矩阵.
次序按行排列.
46第二章SAS语言与数据管理临时数组SAS数组每一个元素对应数据集中的一个变量.
临时数组不对应数据集的变量.
定义格式是在数组说明中加一个_TEMPORARY_的关键字:ARRAY数组名(维数说明)_TEMPORARY_(初始值表);例:ARRAYx(100)_TEMPORARY_(100*0);2.
2.
6函数函数包括:–数学函数;–字符串函数;–分布函数、分布密度函数、分位数函数、随机数函数;–日期时间函数;–数组函数;–财政金融函数,等等.
调用:–正常格式,如SUM(x1,x2,x3).
–变量名列表格式,如SUM(OFx1-x3),MEAN(OFHSMHSSHSE).
数学函数ABS(x)求x的绝对值.
MAX(x1,x2,…,xn)求所有自变量中的最大一个.
MIN(x1,x2,…,xn)求所有自变量中的最小一个.
MOD(x,y)求x除以y的余数.
SQRT(x)求x的平方根.
2.
2SAS用作一般高级语言47LOG(x)求x的自然对数.
LOG10(x)求x的常用对数.
EXP(x)指数函数ex.
ROUND(x,eps)求x按照eps指定的精度四舍五入后的结果,比如ROUND(5654.
5654,0.
01)结果为5654.
57,ROUND(5654.
5654,10)结果为5650.
CEIL(x)求大于等于x的最小整数.
当x为整数时就是x本身,否则为x右边最近的整数.
FLOOR(x)求小于等于x的最大整数.
当x为整数时就是x本身,否则为x左边最近的整数.
INT(x)求x扔掉小数部分后的结果.
FUZZ(x)当x与其四舍五入整数值相差小于1E12时取四舍五入.
SIN(x),COS(x),TAN(x)求x的正弦、余弦、正切函数.
ARSIN(y)计算函数y=sin(x)在x∈[π2,π2]区间的反函数,y取[1,1]间值.
ARCOS(y)计算函数y=cos(x)在x∈[0,π]的反函数,y取[1,1]间值.
ATAN(y)计算函数y=tan(x)在x∈(π2,π2)的反函数,y取(∞,∞)间值.
SINH(x),COSH(x),TANH(x)双曲正弦、余弦、正切.
ERF(x)误差函数2√π∫x0et2dt.
GAMMA(x)完全Γ函数∫∞0tx1etdt.
数组函数数组函数计算数组的维数、上下界,有利于写出可移植的程序.
数组函数包括:DIM(x)求数组x第一维的元素的个数(注意当下界为1时元素个数与上界相同,否则元素个数不一定与上界相同).
48第二章SAS语言与数据管理DIMk(x)求数组x第k维的元素的个数.
如DIM2(x)计算二维数组x第二维长度.
LBOUND(x)求数组x第一维的下界.
HBOUND(x)求数组x第一维的上界.
LBOUNDk(x)求数组x第k维的下界.
HBOUNDk(x)求数组x第k维的上界.
字符串函数TRIM(s)返回去掉字符串s的尾随空格的结果.
主要用在连接两个字符串时去掉前一字符串的尾随空格,但是如果连接结果保存到变量中仍可能有尾随空格.
如:data_null_;lengths1s2$8;s1='abcd';s2='xyz';r1=s1||s2;r2=trim(s1)||s2;putr1=r2=;run;LEFT(s)返回把s左对齐后的结果,空格个数不变.
TRIM(LEFT(s))可以去掉s左右空格.
RIGHT(s)返回把s右对齐的结果,空格个数不变.
COMPBL(s)返回压缩s中的重复空白后的结果.
COMPRESS(s)返回删去s中空格后的结果.
COMPRESS(s,,)返回删去s中的指定字符后的结果,选项可以指定特定要删去的字符,如选项'l'要求删去所有小写字母,选项's'要求删去所有空白,选项'K'把第二个自变量的含义由要删去改为仅保留.
2.
2SAS用作一般高级语言49TRANWRD(s,s1,s2)从字符串s中把所有字符串s1替换成字符串s2后的结果.
TRANSLATE(s,to,from)把字符串s中出现的from中的字符替换成to中对应的字符.
UPCASE(s)把字符串s中所有小写字母转换为大写字母后的结果.
LOWCASE(s)把字符串s中所有大写字母转换为小写字母后的结果.
在比较字符串时如果希望忽略大小写可以先把要比较的字符串都转换为小写或都转换为大写.
RANK(s)返回字符s的ASCII码值.
BYTE(n)返回第n个ASCII码值的对应字符.
LENGTH(s)返回字符串s的长度(不包括尾随空格),对空字符串返回1.
VLENGTH(v)返回字符型变量v的存储长度.
LENGTHC(s)返回字符串s的长度(包括尾随空格).
LENGTHN(s)返回字符串s的长度(不包括尾随空格),对空字符串返回0.
空字符串指只有若干个空格的字符串.
SUBSTR(s,p,n)从字符串s中的第p个字符开始抽取n个字符长的子串.
SCAN(s,n,)把字符串s用"分隔符"分解为若干个子字符串,取其中第n个.
SCAN返回的结果为200个字符长,所以为了存储它返回的结果最好先用LENGTH语句说明变量长度,或使用TRIM函数处理其返回结果.
分隔符缺省为空白.
SCAN用法如:data_null_;lengthname2$10;name=scan('James,Bond',2,',');name2=scan('James,Bond',2,',');sname||'#';s2left(name2)50第二章SAS语言与数据管理put'#name#='s;put'#name2#='s2;run;INDEX(s,s1)查找s1在s中出现的位置.
找不到时返回0.
INDEXC函数查找字符集合的出现位置.
INDEXW函数查找用分隔符分隔后字串的出现位置.
FIND函数功能与INDEX类似,但可以指定不区分大小写、删除尾随空格后再查找、从某位置之后查找、反向查找.
FINDC函数功能与INDEXC类似,但象FIND函数那样增加了选项.
COUNT和COUNTC对某子字符串或字符集合的出现次数计数.
用||连接两个字符串.
REPEAT(s,n)字符表达式s重复n次.
CAT(s1,s2,.
.
.
)连接字符串,不改变引导或尾随空格.
CATS(s1,s2,.
.
.
)连接字符串,不含引导和尾随空格.
CATT(s1,s2,.
.
.
)连接字符串,不含尾随空格.
CATX(,s1,s2,.
.
.
)连接字符串,不含引导和尾随空格,但插入分隔符.
input(s,format.
)按照指定的格式format.
把字符型值s转换为数值型.
比如input('15.
2',8.
)的结果为数值型的15.
2,input('$123,456.
78',comma16.
)的结果为数值型的123456.
78;字符型数据可以自动转换为数值型参加四则运算,但应尽量避免采用这种办法.
input在指定字符型输入格式后也可以用来读入字符型.
put(x,format.
)按照指定的格式format.
把数值型x转换为字符型值.
比如put(15.
2,6.
2)把数值15.
2转换为字符串"15.
20".
数值型可以自动转换为字符型参加字符运算,但应避免.
2.
2SAS用作一般高级语言51正则表达式函数在数据步中,PRX类的函数和CALL子程序实现了PERL语言中的正则表达式功能.
利用正则表达式,可以在字符串中搜索复杂的模式,取出满足模式的子串,并可以进行多处替换.
可以高效地对大量文本数据进行处理.
正则表达式的语法可以参看有关参考书籍.
正则表达式函数有PRXMATCH,PRXCHANGE,PRXPARSE,PRX-PAREN,PRXPOSN.
正则表达式CALL子程序有CALLPRXSUBSTR,CALLPRX-CHANGE,CALLPRXNEXT,CALLPRXPOSN,CALLPRXDE-BUG,CALLPRXFREE等.
参见SAS9.
2LanguageReferenceDictionary.
PRXMATCH函数PRXMATCH(模式字符串,源字符串)返回在源字符串中模式的首次出现位置.
如ii=prxmatch('at','ahat')结果为4.
PRXCHANGE函数PRXCHANGE函数的用法如prxchange('s/pattern/replacement/',times,'sourcestring')其中第一自变量开始的s,中间的正斜杠是替换模式的规定,pattern是待被替换的模式,replacement是要替换成的内容,函数第二自变量表示替换多少次(-1表示不限制),函数第三自变量是源字符串.
52第二章SAS语言与数据管理例如:s=prxchange('s/at/onk/',1,'ahat');结果为ahonk.
又如如s=prxchange('s/(\w+),(\w+)/$2$1/',-1,'Jones,Fred');结果为FredJones.
这里,\w表示任意的字母,加号表示前一字符重复一到多次,圆括号内的内容表示一个子表达式.
在替换内容中,用$1表示第一个子表达式,用$2表示第二个子表达式,等等.
日期和时间函数MDY(m,d,yr)生成yr年m月d日的SAS日期值.
HMS(h,m,s)由小时h、分钟m、秒s生成SAS时间值.
DHMS(d,h,m,s)由SAS日期值d、小时h、分钟m、秒s生成SAS日期时间值.
YEAR(date)、MONTH(date)、DAY(date)、QTR(date)由SAS日期值date得到年、月、日、季度.
WEEKDAY(date)由SAS日期值date得到星期几,1表示星期日,2表示星期一,等等.
DATEPART(dt),TIMEPART(dt)求SAS日期时间值dt的日期部分和时间部分.
HOUR(time|dt)、MINUTE(time|dt)、SECOND(time|dt)从一个时间值或日期时间值求小时、分、秒.
TODAY()返回运行时的日期.
2.
2SAS用作一般高级语言53INTNX(interval,from,n)计算日期from后面的第n个关于interval的分界点的SAS日期.
所谓"关于interval的分界点"是指interval的第一天,其中interval可以取'YEAR','QTR','MONTH','WEEK','DAY'等,于是关于'MONTH'的分界点就是每月的1号.
比如,INTNX('MONTH','16Dec1997'd,3)结果为1998年3月1日.
INTCK(interval,from,to)计算从日期from(不含)到日期to(含)中间经过的关于interval的分界点的个数,其中interval取'MONTH'等.
比如,INTCK('YEAR','31Dec1996'd,'1Jan1998'd)计算1996年12月31日到1998年1月1日经过的年分界点的个数,因为中间有两个1月1日所以结果得2,尽管这两个日期之间实际只隔1年.
分布密度函数、分布函数作为一个统计计算语言,SAS提供了多种概率分布的密度、分布等函数.
分布密度、概率、累积分布函数等可以通过几种统一的格式调用,格式为–分布函数值=CDF('分布',x);–密度值=PDF('分布',x);–概率值=PMF('分布',x);–对数密度值=LOGPDF('分布',x);–对数概率值=LOGPMF('分布',x);其中PMF可以用PDF代替,LOGPMF可以用LOGPDF代替.
分布名称BERNOULLI,BETA,BINOMIAL,CAUCHY,CHI-SQUARED,EXPONENTIAL,F,GAMMA,GEOMETRIC,HYPERGEO-METRIC,LAPLACE,LOGISTIC,LOGNORMAL,NEGBINOMIAL,NOR-MAL或GAUSSIAN,PARETO,POISSON,T,UNIFORM,WALD或IGAUSS,WEIBULL.
可以只写前四个字母.
54第二章SAS语言与数据管理单独提供的分布函数PROBNORM(x)标准正态分布函数PROBT(x,df)自由度为df的t分布函数.
可选参数nc为非中心参数.
PROBCHI(x,df)自由度为df的卡方分布函数.
可选参数nc为非中心参数.
PROBF(x,ndf,ddf)F(ndf,ddf)分布的分布函数.
可选参数nc为非中心参数.
PROBBNML(p,n,m)设随机变量Y服从二项分布B(n,p),此函数计算Y≤m的概率.
POISSON(lambda,n)均值为lambda的Poisson分布Y≤n的概率.
PROBNEGB(p,n,m)参数为(n,p)的负二项分布Y≤m的概率.
PROBHYPR(M,K,n,x)超几何分布的分布函数.
设M个产品中有K个不合格品,抽取n个样品,其中不合格品数小于等于x的概率为此函数值.
可选参数r是不匀率,缺省为1,r代表抽到不合格品的概率是抽到合格品概率的多少倍.
PROBBETA(x,a,b)参数为(a,b)的Beta分布的分布函数.
PROBGAM(x,a)参数为a的Gamma分布的分布函数.
PROBMC计算多组均值的多重比较检验的概率值和临界值.
PROBBNRM(x,y,r)标准二元正态分布的分布函数,r为相关系数.
分位数函数对于连续型分布,分位数函数是分布函数的反函数.
SAS提供了六种,S语言中实现的分位数函数很多.
SAS提供的分位数包括:PROBIT(p)标准正态分布左侧p分位数.
结果在5到5之间.
TINV(p,df)自由度为df的t分布的左侧p分位数.
可选参数nc为非中心参数.
CINV(p,df)自由度为df的卡方分布的左侧p分位数.
可选参数nc为非中心参数.
2.
2SAS用作一般高级语言55FINV(p,ndf,ddf)F(ndf,ddf)分布的左侧p分位数.
可选参数nc为非中心参数.
GAMINV(p,a)参数为a的伽马分布的左侧p分位数.
BETAINV(p,a,b)参数为(a,b)的贝塔分布的左侧p分位数.
随机数函数某分布F(x)的伪随机数,就是在计算机上用某种算法产生一个数列x1,x2,xn,使得{xi,i=1,n}表现为F(x)的独立同分布样本.
用这样的数列可以模拟研究包含随机变量YF(x)的模型.
计算机上产生的随机数序列需要一个开始点,称为"种子".
SAS在数据步中提供了随机数函数用来产生某种分布的随机数序列.
在同一个数据步中对同一个随机数函数的多次调用将得到不同的结果;同一种子出发得到的随机数序列是相同的.
SAS中的随机数函数均匀分布随机数:–UNIFORM(seed)或RANUNI(seed),seed为小于2311的任意非负整数.
0是一个特殊种子,取0作为种子实际是用每次都变化的一个值作为种子.
正态分布随机数:–NORMAL(seed)或RANNOR(seed),seed为小于2311的任意非负整数.
0是一个特殊种子,取0作为种子实际是用每次都变化的一个值作为种子.
N(mu,sigma2)的随机数可用mu+sigma*RANNOR(seed)生成.
指数分布随机数:RANEXP(seed)产生参数为1的指数分布的随机数.
期望为1/lambda的指数分布可以用RANEXP(seed)/lambda得到.
伽马分布随机数:RANGAM(seed,alpha),alpha>0,得到形状参数为alpha尺度参数为1的伽马分布.
设X=RANGAM(seed,alpha),则Y=beta*X是形状参数为alpha,尺度参数为beta的GAMMA分布随机数.
如果alpha是整数,则Y=2*X是自由度为2*alpha的卡方分布随机数.
56第二章SAS语言与数据管理三角分布随机数:RANTRI(seed,h),00的泊松分布随机数,seed为任意数值.
一般离散分布随机数:RANTBL(seed,p1,…,pn)生成取1,2,…,n的概率分别为p1,…,pn的离散分布随机数.
可以使用RAND('分布名',参数)来生成不同分布的随机数,这时使用CALLSTREAMINIT(种子)来指定种子.
样本统计函数SAS对数据集的基本统计是按照变量(列)进行的.
样本统计函数则是对某一行中的若干个变量进行统计.
调用格式:–"函数名(自变量1,自变量2,…,自变量n)";–或者"函数名(OF变量名列表)".
计算时忽略缺失值.
比如,四个数中有两个缺失,则MEAN函数只计算这两个数的平均值.
样本统计函数表MEAN均值MAX最大值;MIN最小值;LARGEST(k,.
.
.
)求从大到小的第k个;SMALLEST(k,.
.
.
)求从小到大的第k个.
均忽略缺失值.
ORDINAL(k,.
.
.
)求从小到大的第k个,缺失值排列在最前面.
N非缺失数据的个数2.
2SAS用作一般高级语言57NMISS缺失数值的个数.
SUM求和VAR方差STD标准差STDERR均值估计的标准误差,用STD/SQRT(N)计算.
CV变异系数RANGE极差CSS离差平方和USS平方和SKEWNESS偏度KURTOSIS峰度RMS平方后平均再开根2.
2.
7SAS/IML矩阵功能简介SAS/IML矩阵功能简介SAS/IML用来进行向量、矩阵的编程计算,提供了一个基于矩阵的编程语言.
支持标量、行向量、列向量、矩阵及其运算,可以使用字符型数据.
可以交互运行或写出程序整体运行.
可以读写SAS数据集.
可以作图.
IML运行交互运行prociml;resetprint;58第二章SAS语言与数据管理退出用quit语句.
RESETPRINT表示后续赋值的结果自动显示到输出窗口.
否则需要用PRINT语句显示变量值.
赋值变量赋值:sc=15.
25;vh1={12};vh2={1122};vh3=5:9;vv1={3,4,5};vv2={30,40,50};mat1={123,111};mat2={12-1,-101};mat3={"Li""Ming","Zhang""Chong"};矩阵常量用大括号包围,行的各元素用空格分隔,行间用逗号分隔.
可以用5:9这样的格式表示等差数列.
对应元素四则运算和矩阵乘法矩阵加法、减法、乘法.
#,/:矩阵对应元素相乘、相除.
标量可以和矩阵作加、减、乘、除运算.
例:res1=vh1+vh2;res2=vv1-vv2;res3=mat1#mat2;2.
2SAS用作一般高级语言59res4=mat1*vv1;res5=mat1+sc;矩阵子集运算例A={11121314,21222324,31323334};A1=A[2,3];A2=A[,3];A3=A[2,];用A[2,3]表示A的第2行第3列元素.
用A[,3]表示A的第3列对应的列向量.
用A[2,]表示A的第2行对应的行向量.
例A4=A[{1,3},{2,4}];A5=A[2:3,2:4];sumr=A[,+];sumc=A[+,];用A[{1,3},{2,4}]表示A的第1,3行和第2,4列交叉得到的子矩阵.
用A[,+]表示A的各行的和组成的列向量(每行把各个列下标求和掉).
用A[+,]表示A的各列的和组成的行向量(每列把各个行下标求和掉).
60第二章SAS语言与数据管理矩阵合并、转置、求逆x`表示x的转置,如.
mat4=mat1`;INV(A)表示矩阵A的逆矩阵.
如mat5=mat1*mat4;mat6=INV(mat5);mat7=mat5*mat6;||:矩阵左右连接,如comb1=mat1||mat2;//:矩阵上下连接,如comb1=mat1//mat2;单位阵和常数值矩阵例:B1=I(4);B2=J(3,1);B3=J(3,4);B4=J(3,4,100);I(4)产生4阶单位阵.
J(3,1)产生长度为3的元素恒为1的列向量.
J(3,4)产生3*4的元素恒为1的矩阵.
J(3,4,100)产生3*4的元素恒为100的矩阵.
2.
2SAS用作一般高级语言61对角阵若A是矩阵(行数、列数均大于1),则diag(A)取出A的对角元素组成一个对角阵,如D1=diag(A[1:3,1:3]);若d为列向量或行向量,则diag(d)生成对角元素为d的对角阵.
如D2=diag(vv1);广义逆和线性方程组求解ginv(A)求矩阵A的加号广义逆(Moor-Penrose广义逆).
如R1=ginv(A);用nrow(A)求矩阵A的行数.
用ncol(A)求矩阵A的列数.
用solve(A,b)求方程组Ax=b的解.
如AA={123,132,213};bb={2,3,1};xx=solve(AA,bb);矩阵比较元素两两间的比较.
ALL(两两比较结果)函数表示自变量的各元素均为真(非零);ANY(两两比较结果)函数表示自变量的元素中至少一个为真.
两个逻辑型矩阵元素间的与、或、非.
62第二章SAS语言与数据管理读数据集例:USEsasuser.
class;READALL;ratio=weight/height;USE语句打开数据集.
READALL把数据集的所有变量的所有观测读入IML中,每个变量作为一个列向量.
ALL表示所有观测.
读变量子集可以只读入指定的变量,如READALLVAR{heightweight};ratio=weight/height;可以把所有数值型变量读入为一个矩阵,如READALLINTOMat;ratio=Mat[,3]/Mat[,2];INTO后面给出读入的矩阵的名字.
也可以把变量子集用INTO子句读入到矩阵中.
读入行子集在READ语句中用POINT后的下标,下标集合或下标变量指定要读入的行,如READPOINT{13}INTOMat;ind=1:3;READPOINTindINTOMat;2.
2SAS用作一般高级语言63在READ语句中用WHERE子句给定读入的行子集的条件,如READALLVAR{heightweight}WHERE(sex='M');显示矩阵的列名和行名例READALLINTOMat;cn={'age''height''weight'};READALLVAR{'name'}INTOname;PRINTMat[rowname=namecolname=cn];写入数据集如CREATEnewdVAR{nameratio};APPEND;CLOSEnewd;用CREATE语句把VAR后指定的变量组转换为一个数据集,用APPEND语句把转换的结果写入,用CLOSE语句关闭新生成的数据集.
64第二章SAS语言与数据管理2.
3SAS语言的数据管理功能SAS语言的数据管理功能SAS语言是一种专用的数据管理、分析语言,它提供了很强的数据操作能力.
–可以轻易地读入任意复杂格式的输入数据;–可以对输入的数据进行计算、子集选择、更新、合并、拆分等操作;–提供了用来访问其它数据库系统如Oracle、Sybase的接口;–提供了访问各种微机用数据库文件如Excel、FoxPro的接口及向导;–提供了一个SQL过程来实现数据库查询语言SQL的功能.
本节介绍数据管理方面的常用语句及这些语句的常用功能.
2.
3.
1SAS数据步的运行机制数据步处理SAS系统处理一个数据步经过两个阶段:–编译阶段;–执行阶段.
编译阶段检查程序中的错误并获取数据集中各变量的信息,包括变量名、类型、存储长度等.
执行阶段运行已编译的程序.
数据步中如果有INPUT、SET等语句,执行阶段有一个隐含的循环.
SAS数据步的运行机制:例子2.
3SAS语言的数据管理功能65dataa;putx=y=z=;inputxy;z=x+y;putx=y=z=;datalines;1020100200;run;X=.
Y=.
Z=.
X=10Y=20Z=30X=.
Y=.
Z=.
X=100Y=200Z=300X=.
Y=.
Z=.
例子解释在INPUT语句之前,变量缺失.
INPUT语句读入一行数据10,20.
显示刚刚读入和赋值的变量值.
程序返回到数据步开头!
变量值置为缺失值.
再读入一行.
第三次读取时发现无数据,生成数据集,退出.
用PRINT过程查看生成的数据集.
数据步隐含循环SAS数据步如果有数据输入,比如用INPUT、SET、MERGE、UPDATE、MODIFY等语句读入数据,则数据步中隐含了一个循环.
数据步内的语句重复执行直到再无数据可以读取.
用INPUT语句从原始数据读取,每次隐含循环开始所有数据集变量均重置为缺失值,只有用RETAIN语句说明的、累加变量、临时数组元素和仅在数据步运行时有效的临时变量可以保留上一轮循环的值.
用SET、MERGE、UPDATE、MODIFY语句读取已有SAS数据集,也有隐含循环但是每轮循环开始时不把变量重置为缺失值.
特殊变量_N_表示本轮循环的序号,随隐含循环递增.
特殊变量_ERROR_表示本轮循环的错误状态,一旦出错就保持为1.
66第二章SAS语言与数据管理数据步流程图用PUT语句调试数据步PUT语句主要用来调试数据步程序.
为了显示当前的所有变量值,可以用put_all_;用LIST语句调试数据步LIST语句可以显示INPUT语句正在读取的数据行,如dataa;putx=y=z=;inputxy;z=x+y;put_all_;list;cards;10201002002.
3SAS语言的数据管理功能67;run;2.
3.
2用input语句输入数据用input语句输入数据—自由格式用input语句输入数据—自由格式数据步中把数据行写在datalines语句和一个只有一个顶头的分号的行之间,然后用INPUT语句读取.
INPUT语句引发数据步隐含循环,每次读取一个记录,在读取之前数据值置为缺失值.
最简单的INPUT语句使用自由格式(listinput):按顺序列出每个观测的各个变量名,中间用空格分开.
INPUT语句中指定的变量如果是字符型的需要在变量名后面加一个$符号.
数据行中一个观测的各变量只需要用一个或多个空格分开.
自由格式INPUT例子datac9501;inputname$sex$mathchinese;datalines;李明男9298张红艺女89106王思明男8690张聪男98109刘颍女80110;run;68第二章SAS语言与数据管理自由格式的特点自由格式的优点:–使用简单;–输入数据时不必上下对齐;–不需要知道每个变量的具体列数而只需知道它的次序.
使用自由格式的限制:–数据每行为一个观测,各数据值之间用一个或几个空格或制表符分隔.
–无论是字符型还是数值型缺失数据都必须用小数点表示.
–字符型数据长度不能超过8个字符(但可以预先用LENGTH语句声明长度),不允许完全是空白,中间不允许有空白,开头和结尾如果有空白将被忽略.
–在INPUT语句中必须列出观测中的每一项数据对应的变量名而不能省略中间的某一个.
用input语句输入数据—列格式INPUT语句的列格式某个变量在数据行中是上下对齐的则可以对此变量指定列格式.
例:datac9501;inputname$1-10sex$11-13math14-16chinese17-20;datalines;李明男9298张红艺女89106王思明男8690张聪男98109刘颍女80110;run;2.
3SAS语言的数据管理功能69办法是在变量名(及可能的$符)后面列出该变量在数据行中所占据的列起始位置结束位置.
如果只有一个字符也可以只写开始位置.
注意:一个汉字算两个字符.
列格式和自由格式可以混用.
列格式的特点要求数据行各项上下对齐;各项之间可以没有任何分隔,连续写在一起;字符型数据长度可以超过8个字符,中间可以有空格,头尾的空格仍将被忽略;不论字符型变量还是数值型变量如果指定列位置都是空白则输入值为缺失值,小数点仍表示数值型和字符型变量的缺失值;可以只输入数据行中的某些项而忽略其它项,次序可以颠倒,可以重复读取某些已读取部分.
列格式输入例:紧凑格式身份证号码的输入与解读.
datapids;inputyear7-10mon11-12day13-14;birth=mdy(mon,day,year);formatbirthyymmdd10.
;datalines;110103197512092232110101196902150059;run;70第二章SAS语言与数据管理指定开始列读入用@列号可以指定读入下一个变量的起始列号.
如data;input@11xy;datalines;12341011021112201202;run;procprint;run;用input语句输入数据—有格式有格式输入日期在数据中格式多样,如"1998-10-9","19981009","9/10/98".
需要使用有格式输入.
格式说明跟在变量名(及可能的$符)后面.
日期的输入格式有"YYMMDD10.
","YYMMDD8.
"等.
日期变量需要用FORMAT语句指定输出格式,一般为"YYM-MDD10.
".
FORMAT语句用来指定变量值显示和打印的格式,格式都以句点截尾,如10.
2,YYMMDD10.
,$5.
等.
日期输入格式例子data;inputdateyymmdd8.
sales;formatdateyymmdd10.
;datalines;56-6-1311002.
3SAS语言的数据管理功能7167.
12.
1512007810213008910011400199601011500200209011600;run;procprint;run;日期输入格式例2data;inputdateyymmdd10.
sales;formatdateyymmdd10.
;datalines;56-6-13110067.
12.
15120078102130089100114001996010115002002090116001956-6-1311001967.
12.
15120019781021300198910011400199601011500200209011600;run;procprint;run;YEARCUTOFF系统选项输入两位数年份时,到底是19xx还是20xx可以用OPTIONS语句规定YEARCUTOFF选项,如optionsyearcutoff=1920;此例认定所有两位数年份在1920到2019之间.
指定了YEARCUTOFF,所有两位数年份当作YEARCUTOFF与YEARCUTOFF+99之间的年份.
72第二章SAS语言与数据管理INFORMAT语句在数据步中可以提前用INFORMAT语句说明一个变量的输入格式.
比如data;informatdateyymmdd10.
;inputsalesdate;formatdateyymmdd10.
;datalines;110056-6-13120067.
12.
15;run;procprint;run;使用了INFORMAT的变量在INPUT语句中不需要再指定格式,字符型变量可以不再加$符号.
这样的输入是"修改的自由格式",与下面使用了冒号修饰符的情况相同.
使用了INFORMAT的变量在INPUT语句中不需要再指定格式,字符型变量可以不再加$符号.
这样的输入是"修改的自由格式",与下面使用了冒号修饰符的情况相同.
读入数据时可以自动跳过前导空格,并且遇到空格时停止读入.
冒号修饰符如果日期变量输入值不在第一项,并且与前一项用空白分隔,可以在日期变量名后面加一个冒号表示该变量从非空白值开始读取.
如data;inputsalesdate:yymmdd10.
;formatdateyymmdd10.
;datalines;110056-6-132.
3SAS语言的数据管理功能73120067.
12.
15;run;procprint;run;修改的自由格式在数据不按列对齐且需要使用输入格式进行转换时冒号修饰符可以解决不对齐的问题.
这叫做修改的自由格式.
预先使用INFORAT说明了输入格式的变量在INPUT语句中使用自由格式,这也是修改的自由格式,与加了冒号修饰符的效果相同.
修改的自由格式可以自动跳过前导空格,读取到分隔符(缺省为空格)或行尾为止.
w.
d格式在一个数值型变量后面可以用w.
d或w.
的输入格式,这里w表示输入宽度,d表示输入的小数点位数,如果数据中已经有小数点则这里的d不起作用,如果数据中没有小数点则会把最后的d为作为小数部分.
如data_null_;inputx6.
2y;putx=y=;cards;1.
210123456203.
430;run;74第二章SAS语言与数据管理结果第一行x,y均正确读入;第二行的123456被转换为1345.
56,y正确读入;第三行程序出错,因为y的内容进入了x的6个字符宽度范围内.
带有$符号和逗号的数字的有格式读取用DOLLARw.
d格式或COMMAw.
d格式读取带有逗号、$符号以及括号的数据.
括号内的数据表示负数.
用percentw.
格式读百分数.
如data;inputnumsalescomma7.
profitpercent7.
;datalines;10123,45625.
2%15245,8899.
8%;run;procprint;run;修改的自由格式与数值型输入格式修改的自由格式与一个数值型输入格式配合时,不遵守数值型输入格式指定的宽度,读到分隔符(缺省为空格)或行尾时结束.
如data_null_;inputx:6.
2y;putx=y=;cards;123456.
781012345678203.
430;run;2.
3SAS语言的数据管理功能75结果三行的x,y都能正确读入,但是第二行的12345678被转换成了123456.
78.
虽然第一行中123456.
78带有前导空格而且宽度超过了6,第二行中x宽度超过6,第三行中x,y两个数据的总宽度才达到6,在冒号修饰符帮助下都正确读入了.
字符型变量有格式读入其它类型的数据也可以用有格式读入方法进行转换读取.
用$CHAR10.
的格式说明可以包括字符数据中间和前面的空格,以及单独的小数点.
data;inputa$1-5b$char5.
c;ifb=''thenputb=;datalines;abc3s10abcdabde20abcde.
30;run;procprint;run;字符型变量的另一个输入格式是$w.
,如$10.
.
用$10.
的格式读入10个字符,包括前导空格和中间的空格,然后扔掉前导空格.
如果10个字符只有一个小数点,其它字符都是空格,则读入为缺失值,保存为10个空格.
在上例中如果变量b使用$5.
读取,则第一行中的3个前导空格会被丢弃,第三行b变量的值会作为缺失值,也就是5个空格.
76第二章SAS语言与数据管理修改的自由格式与字符型输入格式修改的自由格式如果与字符型输入格式配合使用,且该字符型变量为数据步中首次出现,则该字符型变量宽度由输入格式的宽度确定.
读取该变量值时到分隔符(空格)或行尾时结束读取,但如果超过了格式规定的宽度就仅保存宽度规定的字符数.
如data_null_;inputs:$6.
t$;puts=t=;cards;abxyabcdefghzw;run;结果第一行能正确读取s为ab,t为xy,第二行把s的值读入后仅保存了前6个字符内容为abcdef,t正确读取为zw.
修改的自由格式与字符型输入格式(续)修改的自由格式如果与字符型输入格式配合使用,且该字符型变量不是首次出现,则该字符型变量的宽度已经确定.
读取该变量值时到分隔符(空格)或行尾时结束读取,但如果超过了已经确定的宽度就仅保存宽度规定的字符数.
如data_null_;lengths$3;inputs:$6.
t$;puts=t=;cards;abxyabcdefghzw;run;2.
3SAS语言的数据管理功能77结果变量s的宽度确定为3个字符.
第一行能正确读取s为ab,t为xy,第二行把s的值读入后仅保存了前3个字符内容为abc,t正确读取为zw.
&修饰符在自由格式读取字符型数据时,不允许字符型数据中间有空格.
但是,如果字符型数据中间的空格都是单个空格,而字符型数据之后空出了至少两个空格,可以在该变量名后使用&修饰符读取这样的数据.
带有&修饰符和输入格式的变量输入也是修改的自由格式,除了需要用两个空格表示结束外,其它规定和冒号修饰符相同.
数据如LiYingabcdZhangXiaomingefghXuJunlimn程序示例:data;lengthname$20;inputname&$code$char4.
;scode||"#";cards;LiYingabcdZhangXiaomingefghXuJunlimn;run;procprint;run;78第二章SAS语言与数据管理数据后的两个空格被作为分界使用.
数据之前的多余空格被忽略.
数据之后如果超过两个空格,多余空格会分配给后面的变量.
比如上例中第二个观测的code为"ef".
(可以对code使用冒号修饰符解决这个问题)修饰符除了冒号、&修饰符外,还有修饰符,通常与INFILE语句的DSD选项一起使用.
在INPUT语句中,修饰符用于指定前面的变量为修改的自由格式读取,在与DSD选项配合时,变量值如果用撇号包围则读取时连撇号一同读取.
读取结束规则也改为遇到不被撇号包围的分隔符或遇到行尾时结束.
带有冒号修饰符、&修饰符和修饰符的变量输入使用"修改的自由格式",可以跳过前导空格,并且在分隔符处才结束.
如果读入的是字符型变量,读入内容超过变量宽度时超过部分被舍弃.
下例使用DSD选项指定了以逗号为分隔符,并用修饰符读取以撇号包围的含有逗号的内容:datascores;infiledatalinesdsd;inputName:$9.
Score1-Score3Team~$25.
Div$;datalines;Smith,12,22,46,"GreenHornets,Atlanta",AAAMitchel,23,19,25,"HighVolts,Portland",AAAJones,09,17,54,"Vulcans,LasVegas",AA;procprintdata=scoresnoobs;run;读取Team的值时指定了$25.
格式和修饰符,这里所有Team内容长度都不超过25个字符,读取Team值时遇到双撇号外面的逗号分隔符时结束Team内容的读取.
2.
3SAS语言的数据管理功能79多个变量共用输入格式在INPUT语句中可以对多个变量可以指定相同的输入格式,只要把这些变量的列表用括号包围,并把输入格式用括号包围.
程序示例:dataname;input(s1-s3)($1.
);puts1-s3;datalines;abc;run;则变量s1,s2,s3分别读入为a,b,c.
输入和输出格式补充数值型输入格式补充数值型输入格式缺省为w.
d,别名为BESTw.
d.
如果数据中有小数点承认数据中的小数点(这时w.
d中d可省略).
如果数据中没有小数点会设置d位小数.
数据中有逗号、括号、$号时用COMMAw.
d格式,别名为DOL-LARw.
d.
有括号的数被认作负数.
PERCENTw.
读百分数.
例:data_null_;x1=input('123456.
78',16.
);putx1=;x2=input('123456.
78',16.
2);putx2=;x3=input('12345678',16.
2);putx3=;x4=input('15.
2E3',16.
);putx4=;x5=input('$123,456.
78',COMMA16.
);putx5=;x6=input('$123,456.
78',COMMA16.
4);putx6=;80第二章SAS语言与数据管理x7=input('$(12345678)',COMMA16.
2);putx7=;x8=input('15.
8%',PERCENT16.
);putx8=;run;数值型输出格式补充数值型输输出格式缺省为BESTw.
.
在给定列宽内尽可能输出最大精度,可以用科学计数法.
w.
d为指定宽度和小数位数的输出格式,省略d或d为零则输出整数.
用COMMAw.
d格式输出用逗号分隔的结果.
用DOLLARw.
d输出带有前导$及用逗号分隔的结果.
PERCENTw.
d输出百分数.
负的百分数用括号包围.
Zw.
d用零填充左边不满的位数.
PVALUEw.
d为输出p值规定了特殊格式.
data_null_;s1put(123456.
78,BEST16.
puts1=;s2put(123456.
78,BEST4.
puts2=;s3put(123456.
78,16.
4)puts3=;s4put(-123456.
78,COMMA16.
4)puts4=;s5put(-123456.
78,DOLLAR16.
4)puts5=;s6put(-1.
782,PERCENT10.
2)puts6=;s7='x'||put(1,Z3.
);puts7=;s8=put(1.
23E-6,PVALUE10.
);puts8=;run;2.
3SAS语言的数据管理功能81字符型输入格式补充在INPUT语句中使用自由格式来读取字符型值不允许中间有空格.
缺省的字符型输入格式为$w.
.
前导空格自动清除,如果数据只有一个小数点则读为空格(小数点是缺失值的表示,字符型数据的缺失值为空格).
中间可以有空格.
用$CHARw.
则允许读入前导、中置的空格和只有一个小数点字符值.
dataa;inputs$5.
;sss||'#';datalines;cdeacde.
run;procprint;run;datab;inputs$CHAR5.
;sss||'#';datalines;cdeacde.
run;procprint;run;字符型输出格式补充缺省为$w.
格式,别名为$CHARw.
.
不清除前导空格.
如果需要去掉前导空格可用LEFT()函数.
$QUOTEw.
输出双撇号包围的字符串.
如82第二章SAS语言与数据管理data_null_;s1='ab';r1put(s1,$8.
r2put(left(s1),$8.
r3=put(s1,$QUOTE8.
);put'#'s1$6.
'#';putr1=r2=r3=;run;日期时间型输入格式补充国内常用YYMMDD10.
或YYMMDD8.
.
月日年格式用MMDDYYw.
格式;日月年格式用DDMMYYw.
格式.
像'23MAR1996'这样的日期可以用DATEw.
格式来读,如DATE9.
.
如'MAR1995'这样的月份日期用MONYYw.
格式读取.
如'1995Q1'这样的季度日期用YYQw.
格式读取.
如'15:28:25.
32'这样的时间用TIMEw.
格式读,如TIME12.
.
日期时间型输出格式补充国内常用YYMMDD10.
格式输出日期.
月日年格式用MMDDYYw.
格式;日月年格式用DDMMYYw.
格式.
DATEw.
格式可以把日期输出为像'23MAR1996'这样的形式.
TIMEw.
d格式可以把时间输出为如'15:28:25.
32'这样的格式.
DATETIMEw.
d格式可以把日期时间输出为如'03MAY2011:15:33:25.
21'这样的格式.
w.
d如19.
,21.
2.
HHMMw.
d格式把时间输出为如12:35这样的格式.
2.
3SAS语言的数据管理功能83data_null_;d1=input('12SEP1995',DATE9.
);putd1yymmdd10.
;d2=input('SEP1995',MONYY7.
);putd2yymmdd10.
;t=input('15:28:25.
22',TIME12.
);putttime12.
2;putthhmm8.
2;putthhmm6.
;run;input语句高级技巧input语句中两个变量之间的衔接一个观测中某个变量读完后,读取指针自动移到变量值之后.
例:data;inputid$1-4name$char5.
sex$;sname||"#";cards;1001KittyF1002JohnM1003MaryF;procprint;run;对于无修饰符的列输入,读完后指针恰好在指定列之后的列.
比如上例中id读取后name从第5列开始读.
对于无修饰符的有格式读入,开始读取的位置是前一个变量读完后的位置.
比如上例中Kitty前没有空格也能正确读取.
84第二章SAS语言与数据管理无修饰符的有格式读入从开始位置恰好读取输入格式的宽度指定个数的字符,然后把读取指针移到其后.
于是,Kitty的性别从第10个字符即F处读取.
但Marry的姓名则读成了Mar,从而性别也变成了y.
对于无修饰符的自由格式,变量从上一个变量遗留的指针位置开始读取,会自动跳过任意前导空格,读到遇到一个空格位置,把读取指针设置在这个空格之后.
例如,前面例子中name改用自由格式读取:data;lengthid8name$5;inputid$1-4name$sex$1.
;s1name||"#";s2sex||"#";cards;1001KittyF1002JohnM1003MaryF;procprint;run;Marry后的两个空格只用掉了一个,使得sex读入了空格.
列指针移动input语句中两个变量衔接时,可以在第二个变量前面用+n移动到第二个变量的开始列.
这是列指针相对移动.
也可以用@n直接指定下一变量的开始列指针.
一行多个观测的情况缺省情况下INPUT语句每次读新的一行.
在INPUT语句中用尾随的@@表示允许下一次隐含循环的INPUT运行时继续读取本次INPUT尚未读取的本行的数据.
例如:2.
3SAS语言的数据管理功能85data;inputxy@@;datalines;112439416525636run;procprint;run;同一隐含循环内多个INPUT语句的情形如果在在INPUT语句中使用一个尾随的@,则表示允许本次隐含循环的其它INPUT语句继续读取本行剩余的数据.
例如:data;inputs$@;ifs^='yes'thendelete;elseinputxy;datalines;no11yes24yes39;run;procprint;run;一个观测占多行的情况一个观测可以占用多行,在INPUT语句中用#1,#2等指定一个观测所属的行号.
如86第二章SAS语言与数据管理data;input#1xy#2uw;datalines;112439416;run;procprint;run;在input语句中也可以用"/"命令指针跳到下一行开头.
读过行尾的问题INPUT语句当从一行中不能把所有变量都读取到时,会自动进入下一行读取未完成的变量.
可以在INPUT语句前用infiledatalinestruncover;指示INPUT不自动进入下一行,如果仅仅是长度不足格式规定则接受读取到的部分,如果变量完全空缺则作为缺失值.
如果输入的最后一行是空行,这个选项会造成一个全是缺失值的多余观测.
读过行尾的问题把TRUNCOVER改为MISSOVER,则不论是变量值空缺还是长度不足格式规定都作为缺失值.
把TRUNCOVER改成STOPOVER,则发生这种错误时程序出错停止.
缺省的选择是FLOWOVER,即试图从下一行读取未完成的变量.
这种行为经常是不合适的.
2.
3SAS语言的数据管理功能872.
3.
3变量属性变量属性变量的属性包括:–字符型还是数值型.
INPUT语句读入字符型数据时要在变量名后面加$符.
–变量标签(LABEL).
可以给变量加一个长度不超过256个字符的标签(可以用汉字,不超过128个汉字),标签可以用在以后的报表中.
–变量存储长度(LENGTH).
–变量的输出格式(FORMAT).
–变量的输入格式(INFORMAT).
数据步中的ATTRIB语句可以指定变量的这些属性.
也可以使用单独的LABEL、LENGTH、FORMAT、INFORMAT语句来说明一种属性.
变量属性例子属性为"属性名=属性值"这样的写法,可以为一个变量同时指定多个属性.
如datasales;ATTRIBnameLABEL="姓名"LENGTH=$10dateLABEL="日期"FORMAT=yymmdd10.
INFORMAT=mmddyy10.
amountLABEL="金额"FORMAT=10.
2;inputname$1-10dateamount;datalines;张鹏10/15/19982000李志明1/3/991500王敏11/5/993000;run;88第二章SAS语言与数据管理procprintnoobslabel;run;2.
3.
4读入外部数据读入文本格式的外部数据少量数据可以在数据步程序中用datalines语句引入.
大量数据直接写在程序里不利于管理.
可以把数据放在文本格式的文件中,用INFILE语句指定从中读取.
例如:datac9501;infile'd:\users\sas\stud.
txt';inputname$1-10sex$mathchinese;run;procprint;run;INFILE语句要出现在INPUT语句前面.
INFILE语句选项为了读入用逗号分隔的文件,使用INFILE语句选项DSD.
DSD把两个连续的分隔符中间看作缺失值,在两边的双撇号包围的字符串中的分隔符可以原样输入,并默认逗号为分隔符.
读入CSV文件时如果需要使用输入格式转换,应该使用冒号修饰符指定修改的自由格式.
如果文件中第一行是表头,加FIRSTOBS=2选项.
用FIRSTOBS=选项跳过开头的若干行.
用OBS=指定要读的最后一行.
比如,有些输入文件的开头和末尾都有若干说明文字,只有中间的行是数据,就可以用FIRSTOBS=和OBS=配合指定要输入的行.
在调试数据步程序时也可以指定如OBS=10来用前几行数据调试.
2.
3SAS语言的数据管理功能89例:data;infile'class.
csv'dsdfirstobs=2;inputname$sex$ageheightweight;run;procprint;run;为了读入用制表符分隔的文件,在INFILE语句中加入DELIM-ITER='09'x选项,或在INFILE语句中加上EXPANDTABS选项.
如果用一个字符串作为分隔符,可以使用DELSTR=选项指定.
如(在SAS9.
2中)data;infile'tabd.
txt'delimiter='09'x;inputageheightweight;run;procprint;run;读入外部文本文件时缺省情况下每行宽度限制为256个字符,可以用INFILE语句的LRECL=指定读入宽度,加上PAD选项使得长度不足LRECL规定的行可以填充空白补足.
INFILE语句中用DATALINES关键字指定文件,可以使INFILE去读取DATALINES或CARDS语句后面的数据,这样可以利用INFILE的选项.
行尾的缺失值如果用自由格式读入时尾部某些变量缺失而且没有用小数点表示,可以在INFILEDATALINES语句中加上MISSOVER选项表示不要到下一行去读取未找到的值,而是作为缺失值.
如data;infiledatalinesmissover;90第二章SAS语言与数据管理inputxy;datalines;12439;run;procprint;run;不同的缺失值可以使用MISING语句指定一些字母表示不同类型的缺失值,这时可以在输入中用指定的字母(不区分大小写)表示缺失值.
如data;missingxyz;inputname$age@@;ifage=.
Xthenputname'haveageofmissingXtype.
';cards;John19MaryxDenny21KittyyHartez;run;procprint;run;输入的年龄的x,y,z变成了特殊的缺失值.
在程序中用.
X表示X型缺失值.
读入微机格式的外部数据"File—Import":读入微机格式的数据库文件.
包括:–空格分隔的文件;2.
3SAS语言的数据管理功能91–逗号分隔的文件;–制表符分隔的文件;–用户自定义格式的文件;–dBase格式的文件;–Excel格式的文件;–Lotus格式的文件;–等等.
Import例以class数据集的Excel版本为例.
此数据第一行为变量名,从第二行开始为数据行.
调用File—Import;选"MicrosoftExcel97or2000Spreadsheets(*.
xls)"格式;选取文件"class.
xls".
选取保存转换结果的数据集位置和名字.
按Finish钮得到结果.
注意:Excel文件格式复杂,不能完全等价于一个SAS数据集或一个数据库表.
当有合并的行、列或独立的单元格时无法转换.
Excel的日期在转换时也比较容易出错.
可以在其它软件中把专用数据格式另存为SAS可以读取的格式.
转换用的SAS程序可以调用IMPORT过程进行转换.
例:PROCIMPORTOUT=WORK.
class2DATAFILE="E:\disk\course\statsoft\class.
xls"DBMS=EXCELREPLACE;SHEET="CLASS";GETNAMES=YES;MIXED=NO;92第二章SAS语言与数据管理SCANTEXT=YES;USEDATE=YES;SCANTIME=YES;RUN;GETNAMES=YES:以表的第一行为变量名;MIXED=YES|NO:数值型与文本行混合列是否统一转换为字符型,取NO则混合列中的数值型单元变成缺失值;SCANTEXT=YES|NO:是否用所有观测确定字符型变量长度;USEDATE=YES|NO:对日期时间型列,YES按DATE.
格式转换,NO按DATETIME.
格式转换;SCANTIME=YES:对日期时间型列,如果仅有时间则转换为时间型.
与大型数据库的接口SAS/ACCESS可以直接连接Oracle、Sybase、SQLServer等大型数据库.
有若干种办法连接到大型数据库服务器.
较简便的方法是用LIBNAME语句声明一个逻辑库(Library),这个逻辑库映射到大型数据库服务器中的一个数据库.
外部库中的表直接可以看作SAS逻辑库中的表.
也可以对这些数据库中的表建立访问描述文件(accessdescriptor).
可以用PROCSQL的SQL直通功能建立到大型数据库的连接.
可以定义"视图",视图可以当作数据集一样使用.
使用LIBNAME连接Oracle数据库的例子例如,在安装了Oracle数据库服务器客户端SQL*Net后,定义了数据库路径hrdept_002,库中有一个表employees,用户名testuser用密码testpass可以在运行SAS的计算机上通过客户端访问此库,就可以用以下程序在SAS中直接访问这个Oracle库中的表:2.
3SAS语言的数据管理功能93libnamemydbliboracleuser=testuserpassword=testpasspath=hrdept_002;procprintdata=mydblib.
employees;wheredept='CSR010';run;使用LIBNAME连接ODBC数据库的例子ODBC是MSWindows操作系统中对数据库的一种通用接口.
SAS可以通过ODBC来访问数据库.
例如,我们在IP地址192.
168.
0.
101上有一个MySQL数据库服务器,其中的库sastest我们有权限,用户名为sasuser,密码为saspass.
假设本机已经安装了MySQL的ODBC驱动.
在Windows控制面板找到ODBC管理,然后添加一个命名为sasmysql的MySQL数据源,输入服务器IP地址,端口为3306,输入我们的用户名、密码、数据库名.
在Details中选CharSet为gbk.
这样就生成了一个ODBC数据源.
在SAS中用LIBNAME来访问这个ODBC数据源:libnamemydbodbcdatasrc=sasmysql;这样,在SAS中访问逻辑库mydb实际上就是在访问MySQL数据库sastest.
使用LIBNAME访问Excel文件的例子从SAS9.
1开始LIBNAME也可以指定一个MicrosoftExcel文件或MicrosoftAccess文件作为数据源.
一个Excel文件中可以有多个表(sheets),用LIBNAME指定了所有表所在的逻辑库.
语法如LIBNAME库名EXCEL文件全路径字符串;94第二章SAS语言与数据管理程序如LIBNAMEexclEXCEL'class.
xls';procdatasetslibrary=exclnolist;contentsdata=_all_nods;run;quit;procprintdata=excl.
class;run;也可以用软件图形界面的"NewLibrary"快捷图标对Excel文件定义逻辑库.
使用LIBNAME和ODBC访问Excel文件的例子用LIBNAME可以访问在ODBC中定义为数据源Excel文件.
这种办法可以在SAS9.
1.
3中访问Excel2007的xlxs格式文件.
首先,在Windows控制面板中找到管理工具,在其中找到"数据源(ODBC)",定义一个新数据源xlsxSample,选择驱动程序时注意选择包括.
xlsx的Excel驱动程序,格式采用Excel12.
0,点击"选择工作簿"按钮选一个.
xlsx格式的Excel文件作为输入来源.
如下程序可以把这个Excel文件作为一个数据库访问,各个sheet是数据集:LIBNAMEmyexcelODBCdatasrc=xlsxSample;然后可以正常访问Excel文件中的数据表,如:procdatasetslibrary=myexcelnolist;contentsdata=_all_nods;run;quit;procprintdata=myexcel.
"c9501$"n;run;这里因为sheet命中有"$"符号所以用myexcel.
"c9501$"n的格式.
2.
3SAS语言的数据管理功能95使用完毕后用如下语句关闭SAS与ODBC的连接:libnamemyexcel;如果需要访问另外一个Excel文件,把要访问的文件复制到原来这个文件位置就可以了.
使用访问描述和视图的例子例如,在Sybase数据库服务器DBIN中有一个数据库Finance,其中有一个表Sales,用户名guest用密码anyone可以在运行SAS的计算机上访问此库,就可以用以下程序在SAS中建立访问描述文件和视图文件:PROCACCESSDBMS=SYBASE;CREATEsasuser.
sales.
ACCESS;SERVER='DBIN';DATABASE='Finance';TABLE='Sales';USER='guest';PASSWORD='anyone';CREATEsasuser.
salesall.
VIEW;SELECTALL;RUN;用SQL直连读取ODBC数据库仍使用我们前面建立的MySQL数据库对应的ODBC数据源sas-mysql.
可以用PROCSQL的CONNECTIONTOODBC来连接ODBC数据源.
程序如:96第二章SAS语言与数据管理PROCSQL;CONNECTTOODBCASmyos(DSN='sasmysql');CREATEVIEWsasuser.
c9501bASSELECT*FROMCONNECTIONTOmyos(SELECTname,mathFROMc9501);DISCONNECTFROMmyos;QUIT;生成了视图.
非ODBC数据库也可以用这种办法连接.
2.
3.
5数据集的复制与修改SET语句数据步中用SET语句读入一个已有数据集,每次读入一行,直到读完(隐含循环).
作用和INPUT语句相同,但读取数据的来源是已有数据集,而且读入前不把在SET语句中已读入的上一观测的变量值置为缺失,但是不是SET语句读入的变量仍会置为缺失.
对读入的行可以用赋值语句定义新变量,或修改原变量的值.
可以给定条件只保留满足条件的行.
可以只保留部分变量.
数据集信息在图形界面交互运行时,用SASExplorer(SAS资源管理器)可以查看数据库中有哪些数据集,用Explorer的"属性"右键菜单可以查看数据集的结构.
可以用PROCCONTENTS查看数据集结构,如proccontentsdata=samp.
c9501;quit;2.
3SAS语言的数据管理功能97还可以用PROCDATASETS查看数据集结构,如procdatasetslibrary=sasusernolist;contentsdata=c9501;quit;数据集复制和修改例子复制:datacls;setc9501;run;修改:datac9501a;setc9501;ifchinese>100thenchinese=100;run;注意SET语句有隐含循环.
取列子集用KEEP语句指定要保留的变量;用DROP语句指定要丢弃的变量.
如datac9501b;setc9501;keepnameavg;run;98第二章SAS语言与数据管理或dropsexmathchinese;取列子集:另一方法用数据集的选项.
如datac9501b;setc9501(keep=nameavg);run;这是输入选项.
或datac9501b(keep=nameavg);setc9501;run;这是输出选项.
数据集的横向拆分用数据集的输出选项可以把数据集的不同变量拆分到不同数据集.
比如,希望把C9501的name,sex输出到数据集A,name,math,chinese输出的数据集B,可用dataa(keep=namesex)b(keep=namemathchinese);setc9501;run;在DATA语句中指定了两个输出数据集并对输出数据集指定了列子集.
2.
3SAS语言的数据管理功能99数据集选项在用SET语句引入数据集时可以给引入的数据集加选项,选项放在数据集名后的括号内:数据集名(数据集选项)选项包括:–KEEP=,表示引入时只要指定的变量;–DROP=,表示引入时舍弃指定的变量;–OBS=,表示读取观测时读到指定的序号为止(是序号而不是观测数);–FIRSTOBS=,表示从指定序号的观测开始读取而跳过之前的观测不读.
输入数据集的选项只对原数据集中的变量有用.
DATA语句中的输出数据集也可以使用数据集选项.
数据集选项例下面的程序生成了一个巨大的数据集HUGE然后用数据步从中复制了其前100行和前两个变量:datahuge;arrayx(10);doi=1to100000;doj=1to10;x(j)=normal(0);end;output;end;dropij;run;datanew;sethuge(obs=100keep=X1X2);run;100第二章SAS语言与数据管理取行子集的子集IF语句IF观测保留条件;例:datac9501c;setc9501;IFmath>=90andchinese>=100;run;注意子集IF和分支语句IF是不同的.
子集IF本质上是对隐含循环的分支,条件成立时隐含循环继续并在数据步末尾处保存当前观测,条件不成立时忽略后面的语句直接进入下一轮隐含循环而不保存当前观测.
用DELETE语句可以删除当前观测.
用WHERE语句或WHERE选项取行子集用WHERE语句指定保留观测的条件.
如datac9501c;setc9501;WHEREmath>=90andchinese>=100;run;WHERE语句只能使用读入数据集的原始值而不能使用修改后的值以及新定义的变量.
WHERE语句只能用于读入数据集,不能用在读取原始数据的情形.
可以在SET语句的数据集选项中使用WHERE=选项达到和WHERE语句类似功能.
例:datac9501c;setc9501(WHERE=(math>=90andchinese>=100));run;2.
3SAS语言的数据管理功能101WHERE语句条件的增强功能在WHERE语句中的条件除了已经讲过的比较运算和逻辑运算外,还支持其它一些增强的比较运算(仅用于WHERE语句和WHERE选项).
xBETWEENaANDb相当于x∈[a,b].
xNOTBETWEENaANDb相当于x/∈[a,b].
xISNULL或xISMISSING相等于判断x为缺失值.
判断x不是缺失值用ISNOTNULL或ISNOTMISSING.
用xCONTAINS'子字符串'判断x中是否包含指定的子字符串,比较时区分大小写.
用xLIKE'模式'判断x是否与指定模式匹配.
在模式中,用一个下划线代表一个任意字符,用一个百分号代表任意长度的子串.
2.
3.
6用set和output语句拆分数据集用WHERE输出选项纵向拆分数据集用SET读入的观测行可以用输出选项拆分到不同数据集.
例如,把C9501的男生观测输出到C9501M数据集,女生输出到C9501F数据集,可以用datac9501m(where=(sex='男'))c9501f(where=(sex='女'));setsasuser.
c9501;run;procprintdata=c9501m;run;procprintdata=c9501f;run;用set和output语句拆分数据集用SET读入的观测行可以按不同条件拆分到不同的数据集.
OUTPUT语句可以指定观测要写入的数据集.
102第二章SAS语言与数据管理拆分数据集例子把C9501数据集拆分成男生、女生两个数据集:datac9501mc9501f;setc9501;select(sex);when('男')outputc9501m;when('女')outputc9501f;otherwiseputsex='有错';end;dropsex;run;procprintdata=c9501m;run;procprintdata=c9501f;run;注意:DATA语句中指定了两个数据集;OUTPUT语句指定当前观测输出到哪一个数据集.
OUTPUT的作用OUTPUT语句还可以用来强行写入数据集,在用循环生成或处理数据时是必要的.
数据步中有了OUTPUT语句后数据步流程中不再有自动写入观测的操作,而只能由OUTPUT语句指定输出.
不指定数据集名的OUTPUT语句输出到所有结果数据集.
例:生成一个包含1到10及其平方的10个观测的数据集datasq;doi=1to10;j=i*i;output;end;run;procprint;run;2.
3SAS语言的数据管理功能103如果删去上面的OUTPUT语句则结果数据集中只有i=11,j=100的一个观测.
2.
3.
7SET语句其他选项POINT=选项为了读取数据集中指定的行,使用带有POINT=选项的SET语句,并配合使用OUTPUT语句和STOP语句.
SET语句中的POINT=选项指定要读取的行号.
使用了POINT选项后就是文件直接访问而非通常的顺序访问,不能通过输入文件结尾来终止数据步,所以必须在数据步末尾用STOP语句使数据步终止.
必须显式使用OUTPUT语句输出读入的观测.
例:datanew;doi=1to19by2;setsasuser.
classpoint=i;output;end;stop;run;procprint;run;END=选项可以在SET语句中用END=指定一个临时变量名,此临时变量在读入的数据集的最后一行为1,其它行为0.
INFILE语句中也有END=选项,但是如果数据是内嵌在数据步中的情况就只能用INFILEDATALINESLASTLINE=转向行号的办法.
比如,为了用数据步计算某列x的平均值且只保留平均值,可用如104第二章SAS语言与数据管理dataone;inputx@@;cards;12345;datatwo;setoneend=lastline;avg+x;iflastlinethendo;avg=avg/_n_;output;end;keepavg;run;上例中,用了累加语句(avg+x).
累加语句自动赋初值零且累加值不会在隐含循环中被置为缺失值.
用了特殊变量_n_,表示循环的下标.
用了OUTPUT语句,只要有OUTPUT语句在数据步中则只有用OUTPUT指定的行才输出,其它行不再自动写入输出数据集.
对此例,如果我们希望把得到的平均值合并回原始数据集并对每行都有AVG的值,可用如datathree;setone;if_n_=1thensettwo;run;这里,有两个SET语句.
这时在读入ONE数据集第一行时又读入了TWO数据集的唯一一行,结果数据集的变量包括原来两个数据集中所有变量.
SET语句读入的变量不会在隐含循环开始时自动置为缺失值,只有INPUT语句这样做.
2.
3SAS语言的数据管理功能105RETAIN语句数据步的隐含循环在每次循环开始时把所有或部分变量赋为缺失值,可以用RETAIN语句指定在隐含循环之间保持原来值的变量并赋初值,格式为RETAIN变量名初值如data;retainprod1;inputx@@;prod=prod*x;cards;12345;对于SET语句导致的隐含循环,为了给新定义的变量赋初值并保持上一步的值也应该使用RETAIN语句.
RETAIN也经常用于需要用到上一行的数据值的情况,如时间序列数据的处理.
2.
3.
8数据集的纵向合并数据集的纵向合并几个结构相同的数据集可以上下地连接到一起.
例如:三个班的学生的3个数据集连接.
class1class2class3IDAIDAIDB111212323515414626dataclasses;setclass1class2class3;run;106第二章SAS语言与数据管理合并的数据集变量为ID,A,B,其中ID为3,6时A为缺失值,ID为1,5,2,4时B为缺失值.
交错纵向合并在使用SET语句进行纵向合并时,使用BY语句可以令合并结果按照BY语句指定的变量排序.
例如:procsortdata=class1;byid;procsortdata=class2;byid;procsortdata=class3;byid;dataclasses;setclass1class2class3;byid;run;数据集选项IN数据集选项IN指定一个临时变量用来指示某观测是否来自该数据集.
观测来自该数据集时IN=指定的变量取1,否则取0.
例如:datanew;setc9501m(in=male)c9501f(in=female);ifmale=1thensex='男';iffemale=1thensex='女';run;临时变量只在数据步运行期间起作用,不保存为数据集的一列.
2.
3SAS语言的数据管理功能107结构不同的纵向合并要纵向合并的数据集有同名变量但类型不同时,不能合并.
可以用PUT函数或INPUT函数转换类型.
数据集中变量的次序可以变化,结果还是同名变量合并在一起.
不同名的变量都进入合并结果,但是只有存在此变量的数据集的对应观测中才有非缺失值.
如果要合并的数据集中同名变量的输出格式、标签等属性不同,则显式定义的属性优先采用,有多个显式定义的则取最先一个.
如果要合并的数据集中同名变量的长度不同,可以在纵向合并的数据步中用LENGTH语句显式说明合并后的变量长度.
如果没有显式说明,则字符型变量长度取SET语句中第一个数据集中的变量长度,这样有时会造成后续数据集中的变量值被截断.
用PROCAPPEND纵向合并两个结构完全相同的数据集可以用PROCAPPEND纵向合并,此过程直接把第二个数据集的内容合并到第一个数据集的尾部,这样比用数据步合并的效率要高,尤其是第一个数据集比较大的时候这样合并更为合理.
合并的结果存入第一个数据集中.
如PROCAPPENDBASE=class1DATA=class2;run;把CLASS2合并到了CLASS1的后面,结果数据集为CLASS1.
2.
3.
9数据集的横向合并数据集的横向合并MERGE语句用来把两个(或多个)包含了同样的一些观测的不同属性(变量)对数据集合并起来.
108第二章SAS语言与数据管理例如:数据集C9501U包含学生的姓名、性别,数据集C9501V包含学生的数学成绩,数据集C9501W包含学生的语文成绩,且各数据集的观测是按顺序一一对应的,就可以用如下带有MERGE语句的数据步把它们左右横向合并到一个数据集NEW:datanew;mergec9501uc9501vc9501w;run;合并时如果有同名变量,结果只能留下一个,变量值将取为第二个数据集中的变量值.
但是,一但数据集观测次序不能完全对应,这样合并就会错行.
按照学生姓名合并则不会错行.
用BY语句指定一个用来对齐对关键列,然后用MERGE语句合并.
要求合并对数据集预先按照关键列排好次序.
如果有其它同名变量,也是只能保留一个,变量值为第二个数据集中的值.
数据集的横向合并例子(一对一)datac9501x;setc9501;keepnamesex;datac9501y;setc9501;keepnamemathchinese;run;procsortdata=c9501x;byname;procsortdata=c9501y;byname;datanew;mergec9501xc9501y;byname;run;procprint;run;2.
3SAS语言的数据管理功能109横向合并:不匹配观测用MERGE和BY横向合并时,不匹配的观测也包含在结果中.
如数据datad1;inputid$x;cards;a1b2;datad2;inputid$y;cards;a21c23;run;合并为procsortdata=d1;byid;procsortdata=d2;byid;datanew;merged1d2;byid;procprint;run;结果包含a,b,c三行.
为了在结果中仅包含匹配行,可以使用数据集的IN=选项,如datanew;merged1(IN=ina)d2(IN=inb);110第二章SAS语言与数据管理byid;IFinaandinb;procprint;run;类似地,可以要求仅包含出现于D1的行,如datanew;merged1(IN=ina)d2;byid;IFina;procprint;run;一对多的横向合并例子数据:d1d2IDXIDYa11a21b12a22合并:datanew;merged1d2;byid;run;procprint;run;一对多合并时,d1中的a的一行与d2中a的两行重复搭配两次.
如果有其它同名变量,只能留下一个,但是保留那些值变得更复杂.
2.
3SAS语言的数据管理功能111多对多的横向合并例子数据:d3d4IDXIDYa11a21b12a22a13b23a24合并:procsortdata=d3;byid;procsortdata=d4;byid;datanew;merged3d4;byid;run;procprint;run;d3中a的两行和d2中a的三行合并,因为已经按ID排序,会把所有的行依次搭配,缺少的行沿用上一行的值.
这与后面讲的SQL连接很不相同.
2.
3.
10用update语句更新数据集用update语句更新数据集一个大数据集中如果有少量观测需要修改,打开大数据集然后直接编辑是不方便的.
另外,在正规的数据整理流程中,直接修改原始数据是不允许的;对原始数据的修改必须由可存档检查的程序来完成.
如果大数据集中有一个关键列,可以建立一个小的只包含要修改的观测的数据集,然后用数据步语句UPDATE来修改并把结果存入新的数据集.
112第二章SAS语言与数据管理格式:DATA新数据集名;UPDATE原数据集更新用数据集;BY关键变量;RUN;小数据集中只包含需要修改的观测,不需要修改的变量可以排除在小数据集之外,不需要修改的值只要取缺失值.
大数据集的关键变量必须是能唯一区分观测的;而小数据集允许对每个要修改的观测分多个观测来输入.
如果希望小数据集中变量取缺失值时也把结果中变量置为缺失值,可以在UPDATE语句末尾加选项UPDATEMODE=MISSINGCHECK.
小数据集中也可以包含全新的观测,更新后添加到结果数据集中.
UPDATE例子把数据集C9501中王思明的语文成绩实际改为91分,张红艺性别应为男:dataupd;inputname$sex$chinese;datalines;张红艺男.
王思明.
91;run;UPDATE例子(续)procsortdata=c9501;byname;run;procsortdata=upd;byname;run;2.
3SAS语言的数据管理功能113datanew;updatec9501upd;byname;run;procprint;run;UPDATE例子(续2)需要计算新的平均分数.
修改了数据集中原来根据某些列计算得到的列都需要重新计算.
datanew;updatec9501upd(in=in_upd);ifin_upd=1thenavg=math*0.
5+chinese/120*100*0.
5;byname;run;procprint;run;MODIFY语句数据步中MODIFY语句和UPDATE语句类似,但是MODIFY语句直接修改原数据集,而不是像UPDATE语句那样把修改的结果另存为新数据集.
MODIFY可以配合OUTPUT语句,在原数据集末尾添加观测;这时,需要修改的观测要用REPLACE语句命令进行替换.
为了保证数据安全,正式工作中应该尽可能用UPDATE取代MOD-IFY.
114第二章SAS语言与数据管理2.
4SAS宏介绍SAS宏介绍SAS数据步是单独执行的,不能定义成一个模块化的可以带输入参数的子程序.
这样,我们在进行某些重复性工作时会感到不便.
SAS特别提供了一种宏语言功能,部分地解决了这个问题.
SAS宏语言包括宏变量、宏函数和宏,本质是一种字符串替换,于数据步和过程步编译之前就执行.
使用SAS宏可以帮助我们:–在SAS步之间传递数据;–动态生成程序,比如重复执行某段代码;–根据条件选择执行不同程序;–写出灵活通用的程序.
2.
4.
1实例SAS宏例子10个数据文件df1.
txt,df2.
txt,…,df10.
txt转换为数据集并连接:%MACROSALREAD;%DONP=1%TO10;%letff="df&NP.
.
txt";%letfd=df&NP;data&fd;infile&ff;inputdateyymmdd10.
sales;persid=&NP;run;%END;%LETsetstm=SET;%DONP=1%TO10;%LETsetstm=&setstmdf&NP;2.
4SAS宏介绍115%END;%PUT&setstm;datawhole;&setstm;run;%MENDSALREAD;%SALREAD;2.
4.
2宏变量宏变量宏变量保存一个字符串值,但可以把它的值替换到程序中.
一个宏变量最多可以保存64KB.
宏变量名的命名规则与数据步变量名的命名规则相同.
SAS有一些预先定义的宏变量,叫做自动宏变量,比如SYSDATE9,SYSTIME等.
用"&宏变量名.
"的格式可以在任何地方把宏变量的值替换到程序中.
在不混淆的时候可以省略以上格式中的小数点.
宏变量代换完全是一种字符串的替换,与C中的宏定义是同一类型.
使用系统自动宏变量的例子例:procprintdata=samp.
classnoobslabel;title'ListingoftheCLASSdataset';footnote1"Created&systime.
&sysday,&sysdate9.
";footnote2"onthe&sysscp.
SystemusingRelease&sysver.
";run;使用了系统日期,时间,操作系统,SAS版本等自动宏变量.
注意:双撇号界定的字符串内可以进行宏替换,但是单撇号界定的字符串内不能进行宏替换.
116第二章SAS语言与数据管理自定义宏变量用"%LET宏变量名=值;"的格式可以定义一个宏变量.
定义宏变量时,不需要用单撇号或双撇号包围文本,除非宏变量的内容本身需要这些标点;数学表达式不被计算;赋值的前导和尾随空格自动被删除;%LET语句以分号结尾.
宏变量内容只要不超过系统规定的最大长度就可以,不像数据步字符型变量那样还要对每个变量规定长度.
自定义宏变量的例子例%letvar1=SASMacro;%letvar2="SASMacro";%letvar3="SAS'Macro";%letvar4=3+4;宏%PUT语句把宏变量的值显示到日志窗口:%PUT&var1.
&var2.
&var3.
;%PUTThevalueofvar4is&var4.
;宏%PUT中非宏替换的文本原样显示,不需要用双撇号或单撇号界定.
宏替换与文本结合的例子宏变量的内容在替换时可以直接与前后文本相连.
如%LETi=11;%LETfname=file&i;2.
4SAS宏介绍117结果宏变量fname中保存了"file11",两边的双撇号也是保存内容的一部分.
定义宏变量时可以引用已定义的宏变量值.
例如,已经定义了宏变量fname,在定义宏变量时就可以函数调用fname的值:%LETff="&fname.
.
txt";%PUT&ff.
;注意例中的连续两个点,第一个用于引用宏变量,第二个是文件名的一部分.
以"&宏变量名.
"格式引用宏变量值时如果不引起混淆可以省略其中的句点.
宏变量引用的多重扫描有时需要用到编号的多个宏变量:%LETsale95=beijing1995;%LETsale96=beijing1996;这里假设beijing1995,beijing1996是一些要处理的销售数据集.
引用宏变量时如果有两个连续&符号,会把两个&符号替换成一个&符号再进行宏替换,进行了两次代码扫描.
如%LETk=95;%PUT&&sale&k;的&&解析为一个&,&k解析为95,于是"&&sale&k"首先解析为"&sale95",然后再解析为"beijing1995".
这样的做法可以实现宏变量的数组功能.
118第二章SAS语言与数据管理如果用三个&符号:%LETvarpre=sale;%LETk=95;%PUT&&&varpre&k;则第一遍扫描前两个&符替换为一个&符,第三个&符与varpre结合解析为sale,&k解析为95,所以第一遍扫描后解析为"&sale95",于是第二遍扫描将其替换为宏变量sale95的值"beijing1995",即所需的待处理数据集名.
这样实现了宏变量数组名和下标都是可变的.
宏%PUT特殊变量列表在宏%PUT语句中,用_all_代表所有宏变量,如%PUT_all_;用_automatic_代表所有自动宏变量.
用_global_代表用户自定义的所有全局宏变量.
用_local_代表当前宏定义内的局部宏变量.
用_user_代表所有用户自定义变量.
可以用于程序调试.
另外,如%putERROR:unexpectedresult.
;%putWARNING:maybewrong.
;%putNOTE:somebaddata;这样的用法可以在LOG窗口显示错误信息、警告信息或一般性备注,内容也自动以红色、绿色、蓝色显示.
2.
4SAS宏介绍119删除宏变量用%SYMDEL宏语句删除一个或多个宏变量,如%SYMDELtmpvar1var2;%SYMDEL语句中列出要删除的宏变量名,不使用&格式.
用宏变量避免重复的例子用宏变量可以写出适应性好的程序.
比如,为了对指定的数据集显示数据集结构和前10个观测,程序如%LETdsn=samp.
class;title"Dataset&dsn";proccontentsdata=&dsn.
;run;procprintdata=&dsn.
(obs=10);run;title;这样,不管程序中有多少个地方用到了数据集名,只要修改宏变量定义的一处就可以了.
自动宏变量—日期自动宏变量是系统自动定义的宏变量,其中有些是用户不能修改的.
日期和时间:&sysdate为DATE7.
格式的当前日期.
&sysdate9为date9.
格式的当前日期.
&sysday为星期几(单词格式).
如%PUT&sysdate&sysdate9&sysday;120第二章SAS语言与数据管理自动宏变量—最新数据集&syslast为最新生成的一个数据集,库名和数据集名用句点连接.
&sysdsn保存最新生成的数据集的库名和数据集名,中间用空格分开.
如果本次SAS会话还没有生成数据集则值为_NULL_.
自动宏变量—错误状态在宏中可能需要检查SAS步是否出错.
宏变量&syserr保存一个SAS数据步或过程步结束后的错误状态代码,0为正常.
新的数据步或过程步重置错误状态.
&syscc为整个SAS会话的错误状态.
自动宏变量—运行环境&syssite包含SAS软件安装地点代号.
&sysscp包含运行SAS的操作系统名称.
&sysscpl类似于&sysscp但更详细.
&sysuserid为登录用户名,缺省时为default.
如%PUT&syssite&sysscp&sysscpl&sysuserid;&sysmacroname在运行一个宏时返回该宏的名字;否则为空值.
2.
4.
3宏子程序宏子程序SASMacro相当于子程序,但其中的子程序参数和宏变量都只有字符串替换的意义.
不带参数(自变量)的宏子程序定义格式如下2.
4SAS宏介绍121%MACRO宏名;…(定义宏的内容)%MEND宏名;宏子程序定义中可以包括原样的文本、宏变量替换、宏程序语句、宏表达式和宏函数调用.
宏子程序在定义时并不运行,在调用时才运行.
调用为"%宏名"的格式.
例:用宏子程序来替换程序片段宏子程序可以简单到只包含原样的一段程序片段,如%macrods;c9501fc9501m%mendds;datanew2;set%ds;run;注意我们把%ds类似于一个宏变量替换来使用.
调用结果是把宏子程序定义内的原样文本替换到调用所在位置.
此处替换结果为datanew;setc9501fc9501m;run;替换的原样程序片段中可以含有分号.
如%macrodsc;c9501fc9501m;%menddsc;datanew3;set%dscrun;122第二章SAS语言与数据管理这里set语句就不需要再有分号,因为它引用的%dsc的内容已经包含了分号.
例:宏子程序定义中包含宏变量替换宏子程序定义中可以包含宏变量替换,如%macrodsv;&d1&d2%menddsv;%letd1=c9501f;%letd2=c9501m;datanew4;set%dsv;run;定义时并不要求其中用到的宏变量已经赋值,只要在调用时用到的宏变量已经赋值就可以了.
例:包含整段SAS程序的宏子程序宏子程序定义中也可以包含一段SAS程序,如:%MACROdsinfo;title"Dataset&dsn";proccontentsdata=&dsn.
;run;procprintdata=&dsn.
(obs=10);run;title;%MENDdsinfo;定义时其中的数据步、过程步、全局语句不运行.
这个例子的宏子程序定义中包含了一个title全局语句、两个过程步.
2.
4SAS宏介绍123调用:%LETdsn=samp.
class;%dsinfo宏子程序调用本质上还是文本替换,而且替换出的内容只要构成一个全局语句、完整的数据步或完整的过程步就运行这些语句,运行完以后再继续宏子程序后续部分的替换.
调用宏时也不需要分号.
比如,此例执行宏子程序DSINFO,即逐行语句进行替换,遇到&dsn.
的地方就替换为samp.
class,得到四段可独立执行的SAS代码:第一行title语句、第二、三行的PROCCONTENTS过程步、第四、五行的PROCPRINT过程步、第六行的title语句,每替换出其中一段后就执行一段,然后继续后面的替换.
带参数的宏带参数的宏可以有更好的通用性.
定义格式为:%MACRO宏名(参数表);…(定义宏的内容)%MEND宏名;调用格式为:"%宏名(参数值)".
类似于函数的调用方法.
调用时,其自变量是原样文本,不需要写成撇号界定的字符串.
带参数的宏:例子例:%MACROdsinfov(dsn);title"Dataset&dsn";proccontentsdata=&dsn.
;run;procprintdata=&dsn.
(obs=10);124第二章SAS语言与数据管理run;title;%MENDdsinfov;%dsinfov(samp.
class)注意定义中用到自变量dsn的地方要用宏变量替换格式&dsn.
.
调用结果相当于title"Datasetsamp.
class";proccontentsdata=samp.
class;run;procprintdata=samp.
class(obs=10);run;title;变量作用域宏定义内部的参数和新定义的宏变量都是局部的.
在宏定义外部定义的宏变量是全局的.
用%GLOBAL语句声明全局宏变量,此语句可以用在宏定义内,也可以用在宏定义外.
在宏定义内部可以用%LOCAL语句显式地声明局部宏变量.
这是比较严谨的编程习惯,可以避免错误地改变同名全局变量的值.
参数缺省值定义带参数的宏时可以给参数缺省值.
如%MACROdsinfod(dsn=&syslast,nobs=10);title"Dataset&dsn";proccontentsdata=&dsn.
;run;2.
4SAS宏介绍125procprintdata=&dsn.
(obs=&nobs.
);run;title;%MENDdsinfod;调用时必须用"参数名=参数值"的格式调用.
如%dsinfod(dsn=samp.
class,nobs=5)缺省参数在调用时可以省略,如data;x=1;y=2;run;%dsinfod()用"参数名=参数值"调用,次序可以改变,如%dsinfod(nobs=5,dsn=samp.
class)在定义宏的时候参数可以一部分无缺省值,一部分有缺省值,但是无缺省值的参数必须都列在有缺省值的参数前面,调用时,无缺省值的参数不能省略而且不能使用"参数名=参数值"的格式.
调试程序段因为定义宏的时候内部的SAS程序并不运行,所以可以把一段SAS程序包围在宏定义中.
即使程序中已经有/*和*/界定的注释也可以.
这种方法也适用于一段用来调试的程序:把用来调试的程序包在宏定义中,后面紧跟着调用,调试成功后只要把调用部分删除或注释即可.
如%MACROdebug1;proccontentsdata=&syslast;run;126第二章SAS语言与数据管理procprintdata=&syslast(obs=5);run;%MENDdebug1;%*debug1;其中以%*开始的语句叫做"宏注释",是不执行的.
如果有多个程序段需要使用这种技术统一打开或关闭,可以使用如下技巧.
仍然把这些程序段分别包入宏定义中并适当命名;定义一个开关宏变量如DEBUG:需要执行这些程序段时,定义DEBUG的值为空值(%LET语句赋值时不写任何值);需要关闭这些程序段时,定义DEBUG的值为*.
这样避免了使用宏%IF语句,宏语句只能用在宏定义内部.
如%LETDEBUG=*;%MACROdebug1;%MENDdebug1;&DEBUG%debug1;.
.
.
.
.
.
%MACROdebug2;%MENDdebug2;&DEBUG%debug2;这时&DEBUG替换后是星号,含有%debug1或%debug2的语句变成了注释语句.
如果第一行中把DEBUG定义为空值,含有%debug1或%debug2的语句会调用宏从而执行被包入宏定义内的程序段.
2.
4SAS宏介绍127用宏组织一组分析一组数据分析包括数据输入、整理和分析,通常由多个数据步、过程步组成.
比如,某次分析先生成数据集NEW1、NEW2,然后合并数据集为SASUSER.
COMBINE,然后进行相关系数计算和方差分析.
可以把每个步写到一个宏中,步骤相同的宏可以合并为带有参数的宏.
然后把这些宏的调用再写为一个宏.
在调试运行时,不需要运行的步只要注释掉即可.
如.
.
.
.
.
.
(每个步的宏定义)%MACROMYANAL;%READD(NEW1,15,32)/*生成WORK.
NEW1数据*/%READD(NEW2,20,45)/*生成WORK.
NEW2数据集*/%*READD(NEW3,51,60)/*生成WORK.
NEW3数据集*/%COMBD(SASUSER.
COMBINE)/*合并所有WORK.
NEW数据集*/%CORREL/*进行相关系数计算*/%ANOVA/*进行方差分析*/%MENDMYANAL;%MYANAL其中读入数据可以用统一的一个宏实现,调用时采用不同参数.
第三个调用用宏注释取消了.
宏%COMBD可以合并命名如NEW1,NEW2,NEW3的数据集.
2.
4.
4流程控制结构宏分支结构宏分支结构格式为%IF条件%THEN宏语句;128第二章SAS语言与数据管理或%IF条件%THEN宏语句;%ELSE宏语句;宏语句可以是复合的,格式为:%DO;…(多个语句)%END;这些结构都只能用在宏定义内部.
最常见的条件是判断相等(用等于号)和不等于(用NE).
条件只能使用宏变量值而不能使用数据步变量值.
宏语句的操作可以是宏变量赋值、调用其它宏、生成SAS代码片段,不能是运行数据步语句,因为宏的编译和执行都是在数据步编译执行之前就已经完成的.
用宏IF控制替换代码片段的例子简单的替换如dataaa;inputxy;cards;121112;run;%MACROmyprog1(dsn=&syslast.
,neat=yes);procprintdata=&dsn.
(obs=10)%IF&neat=yes%THENlabelnoobs;%ELSEdouble;;run;%MENDmyprog1;optionsmprint;%myprog1(dsn=aa,neat=yes)%myprog1(dsn=aa,neat=no)2.
4SAS宏介绍129当以neat=yes调用时,procprint得到了label和noobs选项;当以neat=no调用时,procprint得到了double选项.
注意:%IF语句中的宏变量要用&格式访问.
注意:与neat比较的yes不用撇号界定.
注意:此例中%IF和%ELSE宏语句都要以分号结尾,PROCPRINT语句需要一个分号.
用宏语句替换代码片段时一定要小心不要遗漏分号也不能多写分号.
对于整段程序,需要用宏复合语句包围,程序本身可以含有分号.
见下例.
宏IF与复合语句用"%DO;"和"%END"可以把若干SAS程序片段、语句或宏语句包含起来作为一个整体.
比如,上例中的%myprog1可以改写为%MACROmyprog1b(dsn=&syslast.
,neat=yes);%IF&neat=yes%THEN%DO;procprintdata=&dsn.
(obs=10)labelnoobs;%END;%ELSE%DO;procprintdata=&dsn.
(obs=10)double;%END;run;%MENDmyprog1b;注意复合语句中的SAS程序带有分号.
用宏IF控制替换语句的例子下面的宏中使用了宏IF判断是否处于调试阶段,如果在调试阶段则用PROCPRINT显示输入数据集的部分行:130第二章SAS语言与数据管理%MACROmyprog2(dsn=&syslast.
,debug=);%IF&debugNE%THEN%DO;procprintdata=&dsn.
(obs=10);run;%END;procmeansdata=&dsn;varxy;run;%MENDmyprog2;optionsmprint;%myprog2(dsn=a,debug=true)%myprog2(dsn=a)用宏复合语句包含了一个SAS过程步作为条件成立时生成的SAS程序代码.
宏比较运算宏IF中的条件通常是宏变量替换与原样文本的比较.
比较运算符和数据步所用的比较运算符相同:EQNEGTLTGELEIN注意:宏变量必须以&格式调用.
注意:与宏变量比较的文本不用撇号界定.
为了与空格比较,只要写成"&debugNE"这样的条件即可.
IN运算符右面的列表是用空格分隔的.
如%IF&varINaabbcc%THEN%put&var;宏变量的比较是区分大小写的,所以如果想不区分大小写可以用如2.
4SAS宏介绍131%IF%LOWCASE(&city)=beijing%THEN%PUT&city;流程控制结构—宏计数DO循环循环是我们需要用到宏对一个重要理由.
为了重复地执行一些代码而不需复制代码很多遍,用宏循环就可以了.
宏计数循环只是把关键字DO,TO,BY,END都加上了%前缀.
宏循环只能用在宏定义中.
宏DO循环例子%MACROSALREAD;%DONP=1%TO10;%letff="df&NP.
.
txt";%letfd=df&NP;data&fd;infile&ff;inputdateyymmdd10.
sales;persid=&NP;run;%END;%LETsetstm=SET;%DONP=1%TO10;%LETsetstm=&setstmdf&NP;%END;%PUTsetstm;datawhole;&setstm;run;%MENDSALREAD;%SALREAD;132第二章SAS语言与数据管理宏子程序开发步骤不使用任何宏程序机制写出程序模板;修改程序模板,使用宏变量取代其中可变内容;把程序修改为带有参数的宏子程序.
开发步骤的思路是先测试不包含宏程序的做法,然后仅用简单的宏替换,然后再加入较复杂的宏分支、宏循环.
宏当型和直到型循环宏定义中可以使用当型和直到型循环.
当型循环如%DO%WHILE(循环继续条件);原样文本或宏语句……;%END;当型循环先判断后执行.
直到型循环如%DO%UNTIL(循环退出条件);原样文本或宏语句……;%END;直到型循环先执行后判断,至少执行一次.
注意:如果有计数变量,需要用%EVAL函数计算增量.
2.
4.
5宏程序调试宏程序调试系统选项—MPRINT有一些系统选项与宏程序调试有关.
MPRINT选项要求把宏程序运行生成的程序片段显示在LOG窗口中.
如2.
4SAS宏介绍133optionsmprint;data;x=11;y=12;run;%MACROdebug1;procprintdata=&syslast;run;%MENDdebug1;%debug1在日志窗口会额外显示调用宏%debug1后替换出的SAS程序段,以MPRINT(DEBUG1)标识:MPRINT(DEBUG1):procprintdata=WORK.
DATA2;MPRINT(DEBUG1):run;用NOMPRINT选项关闭此功能.
其它宏程序调试系统选项MLOGIC选项跟踪并在LOG窗口显示宏分支、循环、调用的踪迹.
用NOMLOGIC关闭.
打开SYMBOLGEN选项使得每次解析(替换)一个宏变量时都在LOG窗口显示解析情况.
用NOSYMBOLGEN关闭.
2.
4.
6宏程序库宏程序库以上的例子只能在一个SAS会话中定义并使用宏.
如何把编写好比较成熟的若干宏保存起来,调用时不需要每次运行其定义有两种办法.
第一种办法是把这些宏保存在一个共同的子目录中,每个宏存入一个与宏名相同名称的扩展名为.
SAS的文件,这样的子目录称为一个宏库.
比如,在"C:\saslib"中保存了若干个宏SAS文件,用如下系统选项可以令其可以被找到:134第二章SAS语言与数据管理optionsmautosourcesasautos=("C:\saslib",sasautos);其中MAUTOSOURCE选项打开宏库搜索功能,sasautos=指定若干个搜索位置,列表中的sasautos是一个SAS自带宏库的位置.
编译存储宏把宏放在共同子目录中组成宏库后,每次SAS会话第一次用到某个宏时还是需要编译.
另一个办法是把一组宏编译后保存在某个SAS数据库中命名为SASMACR的SAS目录簿(catalog)中,用系统选项SASMSTORE指出其所在的数据库,并用MSTORED系统选项打开此功能.
实际上,当前SAS会话中已编译的SAS宏就都临时保存在WORK.
SASMACR目录簿中.
指定了编译存储位置后为了把某个宏存入此位置,需要在其%MACRO语句最后加上"/STORE"选项并运行.
如optionsmstoredsasmstore=samp;%macromysub(dsn,varl)/store;.
.
.
.
.
.
.
.
%mendmysub;将把宏MYSUB编译存入SAS目录簿samp.
sasmacr中.
宏的搜索次序调用一个宏时从那些位置找到这个宏首先查找的是WORK.
SASMACR目录簿.
这是当前SAS会话中编译过的宏的存储位置.
2.
4SAS宏介绍135其次如果用MSTORE打开了编译存储宏功能并用SASMSTORE=选项指定了所在数据库,则从这个数据库的SASMACR目录簿中查找.
最后如果用MAUTOSOURCE打开了子目录存储宏的功能并用SASAUTOS指定了搜索路径,从这些搜索路径依次查找.
找到一个就不再继续查找.
如果是在子目录存储(SASAUTOS)中找到的宏,先编译并保存到WORK.
SASMACR中再调用.
这样,如果修改了子目录中的SAS宏需要重新人为运行其定义才能正确使用其新版本.
AUTOEXEC.
SASAUTOEXEC.
SAS是每次进入SAS时自动运行的一个SAS程序文件,可以在其中设定自己常用的设置,如宏库位置.
对于MSWindows版本的SAS系统,可以在自己的工作目录生成一个SAS.
EXE的快捷方式,将其"起始位置"属性清空,然后把AUTOEXEC.
SAS存放在此工作目录.
AUTOEXEC.
SAS中内容如libnamesamp'.
\sampled';optionsmautosourcesasautos=(".
\macros",sasautos);其中定义了一个样例数据库,并设置了使用宏库及位置.
2.
4.
7宏引文函数宏引文函数SAS宏的字符串替换很简单,但是也造成很多麻烦.
如何定义一个包含分号的宏变量下面的例子肯定是错误的:%LETprintit=procprint;run;;136第二章SAS语言与数据管理一个百分号到底应该解释为一个普通标点符号还是宏调用文本中的OR是某个州的缩写,还是逻辑计算的关键字需要用各种宏引文(quoting)函数来澄清.
最常用的是%STR,%NRSTR,%BQUOTE,%NRBQOTE,%SUPERQ.
宏引文函数分类宏引文函数分别可以作用于宏的编译阶段或执行阶段.
%STR,%NRSTR作用于宏的编译阶段,%STR保护自变量中的分号、撇号等特殊字符,%NRSTR除此之外还保护%和&不被解析.
%BQUOTE,%NRBQUOTE在把自变量中的替换执行完后,保护得到的替换结果不进行特殊字符的解释,其中%BQUOTE不保护结果中的%和&,%NRBQUOTE也保护结果中的%和&不被解析.
%SUPERQ以宏变量名字本身为自变量(不需要引用),保护此宏变量的内容不进行特殊字符的解释,一般可以用%NRBQUOTE取代.
%UNQUOTE可以把保护的文本开放进行解析.
这些函数中主要使用%BQUOTE和%NRSTR就可以应付大多数情况.
%STR例子%STR可以保护文本中的分号,不配对的撇号、括号、百分号等特殊字符,特殊字符需要用%在前面标识出来:%LETmyvar=%STR(a%');%PUT&myvar;%LETmyvar=%STR(b%");%PUT&myvar;%LETmyvar=%STR(log%(12);%PUT&myvar;%LETmyvar=%STR(345%));%PUT&myvar;%LETmyvar=%STR(90%%);%PUT&myvar;%LETmyvar=%STR(90%%%');%PUT&myvar;%LETprintit=%STR(procprint;run;);2.
4SAS宏介绍137%STR中仍可以替换宏变量及宏,如%LETvar1=SASMacro;%LETvar2=%STR(New&var1);%PUT&var2;%NRSTR例子%NRSTR保护文本中的特殊字符,并禁止宏变量替换和宏,如%LETvar1=SASMacro;%LETvar2=%NRSTR(John%'s&var1);%PUT&var2;又如%PUTThisistheresultof%NRSTR(%NRSTR);%BQUOTE例子%BQOTE称为"blindquoting",作用于宏的运行阶段,保护进行完宏变量和宏的替换之后的内容,而且不需要像%STR,%NRSTR那样用百分号标识要保护的不配对撇号、括号等.
如%LETvar1='abc';%LETvar2=%BQUOTE(%SUBSTR(&var1,1,3));%PUT&var2;此例中%SUBSTR的结果返回三个字符'ab,如果不加保护,对var2赋值时就有不配对的单撇号,导致程序出错,很难恢复.
138第二章SAS语言与数据管理%BQUOTE适合用来保护宏的未知的自变量值、用户输入、从数据集中获得的宏变量值.
比如,如果宏的自变量不用%BQUOTE保护,在参与比较运算时就可以会产生歧义.
设某个宏的自变量dr在运行时值为x1-x3,宏中的某个比较为%IF&drNE%THEN.
.
.
;运行时解析为%IFx1-x3NE%THEN.
.
.
;自变量值中的减号就会被认为是减法运算而不是表示x1x2x3三个变量.
程序应改为%IF%BQUOTE(&dr)NE%THEN.
.
.
;%NRBQUOTE例子%NRBQOTE是%BQUOTE的非解析版本,它也作用于宏的运行阶段,保护进行完宏变量和宏的替换之后的内容,而且这些内容中及时有&和%也不再进行替换.
如data_null_;callsymputx('var','B&GCoorporated');run;%LETcom=%NRBQUOTE(&var);%PUT&com;数据步用CALLSYMPUT定义宏变量var时因为内容中有&G会在日志中警告没有宏变量G,后面的%NRBQUOTE(&var)会先解析其自变量&var(这时并不保护&),然后把解析出的内容进行保护.
2.
4SAS宏介绍139查看是否受到保护宏引文函数保护过的内容一直保持被保护,但是用户不能直接显示出那些是被保护部分.
用%PUT_user_;在查看所有自定义宏变量时可以看到被保护部分.
解除保护宏引文函数保护过的内容一直保持被保护,用%UNQUOTE可以解除保护使其中的宏变量和宏调用可以再有效.
例如%LETcity=Beijing;%LEToth=%nrstr(&city);%LETunq=%unquote(&oth);%putoth:&oth;%putunq:&unq;直接访问oth的内容时,它仍被保护,所以内容是&city.
用%unquote解除保护后,unq里保存的是&city不受保护从而解析为Beijing之后的结果.
宏引文函数小结需要保护的文本内容包括:A类(运算符)ANDORNOTEQNELELTGEGTINB类:宏变量替换&或宏调用%.
C类:不匹配的单撇号、双撇号、括号.
如果要在%STR和%NRSTR中保护这类字符需要用前导%标记出来.
140第二章SAS语言与数据管理宏引文函数概要函数保护类型作用时间%STRA编译%NRSTRA,B编译%BQUOTEA,C运行%NRBQUOTEA,B,C运行%SUPERQA,B,C运行2.
4.
8宏函数宏函数除宏引文函数以外,宏函数还可以:处理宏变量中的文本,比如转换大小写、拆分数据项等;对文本中的数学表达式进行计算;执行SAS函数.
宏函数与数据步中的函数名字相似,作用也相似.
但是注意宏函数仅针对原样文本和宏变量,不作用于数据步变量.
字符型宏函数%LENGTH求长度.
%UPCASE,%LOWCASE转换大小写.
%SUBSTR求子串.
%QSUBSTR求子串并保护所得结果.
%INDEX查找子串首次出现位置.
%SCAN从保存了多项值的文本中拆分得到指定的一项.
%QSCAN作用类似但保护拆分结果.
%LENGTH函数宏变量存储内容只要不超过规定的最大长度就可以保存任意多个字符,但是在用%LET定义是会被删去前导和尾随空格.
用%LENGTH求宏变量的长度.
如2.
4SAS宏介绍141%LETvar1=Macro;%LETVL=%LENGTH(&var1.
);%PUT&var1.
长度为&vl.
;注意其中的%LENGTH自变量用的是var1的宏引用格式.
如果写成了%LENGTH(var1),那么只能返回var1这4个字符的长度.
取空值的宏变量长度为0,如%LETvar2=;%LETVL2=%LENGTH(&var2.
);%PUT宏变量var2长度为&vl2.
;%UPCASE和%LOWCASE函数%UPCASE和%LOWCASE函数把自变量内容全部转换为大写或者小写.
在进行%IF比较时如果想进行不区分大小写的比较,可以先用%UP-CASE把宏变量变成大写再与大写的文本比较,如%IF%UPCASE(&city)=BEIJING%THEN.
.
.
.
;%SUBSTR函数%SUBSTR取出第一自变量的子串,第二自变量指定开始位置,第三自变量为取出子串长度,省略第三自变量则取出剩余部分.
如%LETss=Abrownfox;%LETs1=%SUBSTR(&ss,3,5);%PUT&s1;142第二章SAS语言与数据管理%INDEX函数%INDEX函数从第一个自变量中查找第二个自变量的首次出现位置,找不到则返回0.
如%LETss=Abrownfox;%LETii=%INDEX(%BQUOTE(&ss),ow);%PUTow在&ss.
的第&ii.
位置出现;注意%INDEX的第二个自变量ow没有用撇号界定.
%SCAN函数%SCAN函数从一个列表中取出其中某指定项.
第一自变量是列表,第二自变量是序号,第三自变量省略时包括所有分隔符:空格多个连续的分隔符看作一个.
例如%LETvar1=NO.
1student,excellent!
;%LETx1=%SCAN(%BQUOTE(&var1),1);%LETx3=%SCAN(%BQUOTE(&var1),3);%LETx4=%SCAN(%BQUOTE(&var1),4);%LETxe=%SCAN(%BQUOTE(&var1),99);%PUT&x1&x3&x4&xe;注意列表中有逗号,如果不保护起来就会与函数自变量之间分隔用的逗号相混淆.
找不到的项返回空值.
如果要指定分隔符,可以用%STR函数保护起来.
如2.
4SAS宏介绍143%LETvar1=NO.
1student,excellent!
;%LETx=%SCAN(%BQUOTE(&var1),2,%STR());%PUT&var1.
中第二项为&x.
;用了%STR保护空格作为分隔符,用了%BQUOTE保护自变量&var1的值(其中有逗号会干扰函数自变量的解读).
用%QSCAN函数遍历列表项%QSCAN和%SCAN类似,但保护其结果中的特殊字符如空格、逗号、不匹配的撇号、问号等.
下例演示了如何用循环遍历列表的每一项:%MACROexscan(source);%LETi=1;%LETx=%QSCAN(%BQUOTE(&source),&i,%STR());%DO%WHILE(&x^=%STR());%PUTItem.
&i&x;%LETi=%EVAL(&i+1);%LETx=%QSCAN(%BQUOTE(&source),&i,%STR());%END;%MENDexscan;%LETvar1=NO.
1student,excellent!
;%exscan(%BQUOTE(&var1))宏文本中的计算SAS宏主要依靠文本替换,但偶尔需要计算怎么办在宏IF、宏循环的条件中,自动进行计算,如%macroimpcomp;%letx=1+2;%IF&x=3%THEN%put自动计算表达式.
;144第二章SAS语言与数据管理%ELSE%put没有计算;%mendimpcomp;%impcomp其中定义宏变量X时并未计算加法,但在宏IF判断条件时则计算了加法结果.
但是,宏IF、宏循环的条件中仅允许进行整数的运算,非整数的比较是按字符型比较处理的.
如%macroprb;%IF10.
0>9.
0%THEN%put程序正确;%ELSE%put不能进行非整数比较!
;%mendprb;%prb其它情况下,需要程序员自己用%EVAL进行整数计算,用%SYSE-VALF进行实数计算和比较.
如:%LETy1=2;%LETy2=2+1;%LETy3=%EVAL(&y2+1);%LETy4=%SYSEVALF(4.
8/2);%PUT&y1&y2&y3&y4;上面宏prb的例子可以改为%macroprbc;%IF%sysevalf(10.
0>9.
0)%THEN%put程序正确;%ELSE%put不能进行非整数比较!
;%mendprbc;%prbc2.
4SAS宏介绍145用%SYSFUNC调用数据步函数用%SYSFUNC可以调用许多数据步函数,这样很多只是为了调用某个函数进行计算的小数据步就可以省略.
格式为%SYSFUNC(数据步函数名(参数表),).
数据步函数不允许嵌套调用.
为保护其结果可以改用%QSYSFUNC.
如:%LETx=3.
14159/2;%LETy=%SYSFUNC(sin(&x),6.
2);%PUT&y;%SYSFUNC不能使用数据步PUT函数,为了按指定格式转换数值可以用PUTN函数.
PUTN函数作用与PUT函数类似,但允许指定输出格式为数据步运行时才确定的一个字符型变量或字符型表达式的值.
如:%LETs=%SYSFUNC(putn(1,Z3.
));%PUT&s;宏函数的文本型自变量不需要用撇号界定,所以这里PUTN的自变量Z3.
没有用撇号界定.
在%SYSFUNC中用PUTN转换日期格式例:%LETs=%SYSFUNC(putn("&sysdate9"d,yymmdd10.
));%PUT&sysdate9&s;footnote"演示结果:""%SYSFUNC(putn("&sysdate9"d,yymmdd10.
))";146第二章SAS语言与数据管理2.
4.
9自定义宏函数用宏变量传递结果SAS宏相当于子程序,通常用来生成一段代码,有时我们需要返回一个简单结果.
一种办法是调用宏,在宏中定义全局变量并赋值,在后续程序中访问此宏变量值.
这样比较繁琐,也容易发生同名全局变量冲突.
例如,为了查看某个数据集是否存在,用了如下定义全局变量的方法:%macrodsexist(dsn);%globalexist;%if&dsnne%then%do;data_null_;stop;set&dsn;run;%end;%if&syserr=0%then%letexist=1;%else%letexist=0;%menddsexist;其中的数据步STOP表示数据步运行时停止,但SET语句在编译时发现要打开的数据集不存在会把自动宏变量SYSERR置为非零值.
使用方法如%dsexist(sasuser.
mydat)datanew;if&existthendsname='sasuser.
mydat';run;可以看出这样使用是很不方便的.
2.
4SAS宏介绍147自定义宏函数可以设法定义一个SAS宏,使其解析时仅解析成要返回的值.
这样的SAS宏可以当作是自定义的宏函数.
为此,宏定义中只能有宏语句,不能有数据步和过程步,否则解析后的结果中也会有这些程序段.
如果需要调用数据步中的功能可以尝试用%SYSFUNC函数代替.
这样的宏应该只使用局部宏变量,而不应该给宏变量赋值.
%exist宏函数比如,下面的例子定义了一个一般性的判断数据集是否存在的宏函数%exist:%macroexist(dsn);%sysfunc(exist(&dsn))%mendexist;使用如%macrotest(dsn);%if%exist(&dsn)%then%put&dsn.
数据集存在;%else%put&dsn.
数据集不存在;%mendtest;%test(samp.
class)%test(samp.
notexist)%currdate宏函数下面的宏定义了一个以年月日形式返回当前日期的宏函数:%macrocurrdate;%qsysfunc(date(),yymmdd10.
)%mendcurrdate;148第二章SAS语言与数据管理使用如title'C9501数据集列表';footnote"演示日期:%currdate";procprintdata=samp.
c9501;run;2.
4.
10宏与数据步的信息交换宏与数据步的信息交换SAS的工作模式不容易利用前面的计算结果.
SAS的宏功能可以部分弥补SAS的这一缺陷;我们可以用宏变量在不同的数据步、过程步之间传递信息.
在数据步中用CALL调用SYMPUTX子程序可以把数据步中当前变量值传递给一个宏变量,格式为:CALLSYMPUTX(字符型表达式,表达式);其中的字符型表达式的值为要生成的宏变量名.
两个自变量的前导空格和尾随空格自动被删除.
要从数据步中访问宏变量的值,可以直接使用宏替换,也可以把宏替换结果用于变量赋值、RETAIN语句初值.
在数据步中用SYMGET函数可以根据数据步中当前变量值动态访问宏变量,格式为:SYMGET(宏变量名字符型表达式);其中的字符型表达式的值为要访问的宏变量名.
SYMPUTX例子I%MACROspe1;databooks;setsamp.
c9501bkend=lastobs;ta+amount;iflastobsthendo;callsymputx('nobs',_n_);2.
4SAS宏介绍149callsymputx('total',ta);end;dropta;run;footnote"&nobs.
个人共花费&total.
元";procprint;run;footnote;%MENDspe1;%spe1上例中用数据步读入了SAMP.
C9501BK数据集,并计算购书金额累计栏,到最后一个观测时(用SET语句的END=指定一个临时标志变量LASTOBS)用SYMPUTX把观测个数和总金额存分别写入宏变量中,然后在后续的脚注中使用.
这里的两个CALLSYMPUTX不能用这样的%LET代替:iflastobsthendo;%LETnobs=_n_;%LETtotal=ta;end;这是因为宏语句的运行在数据步编译运行之前早已完成.
这样定义的宏变量NOBS只能包含原样的_n_三个字符,而不是观测个数.
注意:SYMPUTX是一个数据步子程序(用CALL调用).
其语法不使用宏语言的语法而是数据步的语法.
注意:在数据步中用SYMPUTX定义的宏变量不能用在本数据步中.
因为宏变量替换发生在数据步编译运行之前.
为了使得存入宏变量中的值符合某种要求的格式,可以使用数据步的PUT函数,比如150第二章SAS语言与数据管理callsymputx('total',put(ta,8.
2));已经运行完的数据步用SYMPUTX定义的宏变量可以在后面被替换使用,或在后续数据步中用SYMGET函数动态访问.
SYMPUTX例子IIdataaa;inputcidcity$;cards;110北京230上海;%MACROspe2;data_null_;setaa;callsymputx('city'||put(cid,best3.
),city);run;%put&city110&city230;%MENDspe2;%spe2在数据步中静态访问宏变量值在数据步中如果要访问某个已知变量名的宏变量,只要直接用宏替换的方式.
如%LETnmax=5;DATAaa;arrayx(&nmax);2.
4SAS宏介绍151doi=1to20;doj=1to&nmax;x(j)=normal(112233);end;output;end;run;可以把宏变量替换后赋值给数据集变量,如%LETnobs=5;DATAab;n=&nobs;doi=1ton;j=i*i;output;end;run;或把宏变量替换的值作为RETAIN语句初值,如%LETnobs=5;DATAac;retainn&nobs;doi=1ton;j=i*i;output;end;run;SYMGET例子databb;inputcidtemp;cards;11020152第二章SAS语言与数据管理23030;%MACROspe3;databc;setbb;city=symget('city'||put(cid,best3.
));run;procprint;run;%MENDspe3;%spe3上例说明了SYMGET函数的必要性:根据数据的变化而选取不同的宏变量的值.
如果直接用&格式访问宏变量,则宏变量名必须预先能够确定.
SYMGET在许多情形下有替代方法.
很多情况下宏变量名是已知的,只要用宏替换;另外一些情况下可以用数据合并来获取信息,而不必要用宏变量在多个数据步之间传递信息.
SYMGET的自变量可以是:–内容为宏变量名的字符型常量(写在单撇号或双撇号之间);–保存了宏变量名的字符型变量;–结果为宏变量名的字符型表达式.
SYMGET的返回一个字符串,长度缺省为200个字符.
如果需要数值可以用INPUT函数进行转换.
2.
4.
11读取多个文件的例子读取多个文件实际中经常需要读取多个格式相同的文件,可以是文本型、Excel、CSV等格式.
这些文件如果文件名是编号的,如le1.
txt,le2.
txt等,可以很容易地用宏循环生成文件名用INFILE等读取.
2.
4SAS宏介绍153如果文件名是不规则的,可以先生成包含文件名列表的数据集,然后用宏循环从数据集中每次读取一行,用CALLSYMPUTX把当前文件名存放到宏变量中再用INFILE等读取.
读取多个Excel文件假设需要读取多个Excel文件,这里给出一种用ODBC和LIBNAME读取的方法.
拿其中的一个作为模板,在Windows的控制面板的管理工具中找到数据源管理,添加一个数据源,如excelsrc,数据源中对应的文件假设叫做sample.
xlsx.
假设文件名列表在数据集INDEXF中,变量名是FILENAME.
用宏循环地读取每个文件名,在数据步中生成一个DOS命令并用CALLSYMPUTX存为宏变量.
用SAS的X命令把当前文件复制为sample.
xlsx,用LIBNAME语句访问文件内容.
访问完后用仅有逻辑库名的LIBNAME语句关闭连接.
程序如下:OPTIONSXWAIT;%MACROmultifile;%DOi=1%TO10;data_null_;setindexf(firstobs=&iobs=&i);cmd='copyfilename"'"'sample.
xlsx&exit';callsymputx('cmd',cmd);run;x&cmd;libnamemyexcelODBCDATASRC=excelsrc;datad&i;setmyexcel.
'$Sheet1'n;run;libnamemyexcel;%MENDmultifile;154第二章SAS语言与数据管理2.
4.
12动态程序动态程序好的SAS宏程序应该具有通用性:程序中应该不依赖于具体的数据集名、变量名、数据集观测个数、变量个数等信息.
称这样的程序为动态程序.
有很多措施可以帮助我们写出动态程序:–用控制数据集提供具体信息;–用SYMPUTX或PROCSQLSELECTINTO的方法动态生成宏变量;–使用诸如&&vars&i这样的宏变量数组,数组元素个数也保存为宏变量;–用%DO循环遍历宏变量数组.
例:用数据集控制程序运行有时程序运行的控制参数保存在一个控制数据集中.
这样的数据集可能是人为输入的,也可能是计算得到的.
例如datacntr;lengthdsname$20;inputdsname$nobs;cards;samp.
class5;run;生成了一个控制数据集.
使用控制数据集如%MACROcontroled;data_null_;setcntr;callsymputx('dsn',dsname);2.
4SAS宏介绍155callsymputx('nobs',nobs);run;title"Dataset&dsn";proccontentsdata=&dsn.
;run;procprintdata=&dsn.
(obs=&nobs.
);run;title;%MENDcontroled;%controled从控制数据集中把控制参数写入了宏变量,然后用宏变量值控制后续程序运行.
例:用多行数据集控制程序运行控制参数可以有若干组,分别存放在数据集的不同行中.
如datacntr;lengthdsname$20;inputdsname$nobs;cards;samp.
class5sashelp.
air8;run;使用多组参数控制多组运行,生成多个宏变量如%MACROcontroled;data_null_;setcntrend=lastobs;callsymputx('dsn'||trim(left(put(_n_,best12.
))),dsname);156第二章SAS语言与数据管理callsymputx('nobs'||trim(left(put(_n_,best12.
))),nobs);iflastobsthencallsymputx('npars',_n_);run;这里symputx调用中用数据步隐含循环计数变量_n_构造了一组宏变量名dsn1,dsn2,nobs1,nobs2.
在数据集最后一个观测时获得了行数存入宏变量npars中.
访问如dsn1这样的宏变量需要用宏循环和双&格式,如:%DOipar=1%TO&npars;title"Dataset&&dsn&ipar";proccontentsdata=&&dsn&ipar;run;procprintdata=&&dsn&ipar(obs=&&nobs&ipar);run;%END;title;%MENDcontroled;optionssymbolgenmprint;%controled用了双&方法来访问一组dsn1,dsn2这样的宏变量,相当于宏变量数组.
编译运行时,进行两遍扫描,两个&符先替换成一个&符,然后再进行宏变量替换.
比如,当宏变量ipar等于2时,&&dsn&ipar先替换成&dsn2,然后替换成宏变量dsn2的值sashelp.
air.
用了宏循环处理数据集的多个观测,这样的程序适用于控制数据集有任意多个观测且不能预知的情况.
2.
4SAS宏介绍157包含宏变量名和宏变量值的控制数据集控制数据集中可以同时保存宏变量名和对应宏变量值,如datacntr;lengthvarnamevarval$40;inputvarname$varval$;cards;dsnsamp.
class;run;生成并访问相应的宏变量如%macrocontroled;data_null_;setcntr;callsymputx(varname,varval);callsymputx('varname',varname);run;%PUTvarnameis&varname;%PUT&varnamestores&&&varname;%mendcontroled;%controled程序中第一个callsymputx定义宏变量dsn的值为samp.
class,第二个callsymputx定义宏变量varname为dsn.
%PUT语句中的&&&varname首先替换为&dsn,然后再替换为宏变量dsn的值samp.
class.
包含多组宏变量名和宏变量值的控制数据集控制数据集中也可以同时保存多个宏变量名和对应宏变量值,如158第二章SAS语言与数据管理datacntr;lengthvarnamevarval$40;inputvarname$varval$;cards;dsnsamp.
classnobs5;run;从控制数据集生成宏变量如%macrocontroled;data_null_;setcntrend=lastobs;callsymputx(varname,varval);callsymputx('vars'||trim(left(put(_n_,8.
))),varname);iflastobsthencallsymputx('nvars',_n_);run;数据步隐含地循环2次.
第一个callsymputx分别定义宏变量dsn为samp.
class,定义宏变量nobs为5;第二个callsymputx分别定义宏变量vars1为dsn,宏变量vars2为nobs.
访问宏变量如%DOi=1%TO&nvars;%PUTvars&iis&&vars&i;%LETtmpname=&&vars&i;%PUT&&vars&istores&&&tmpname;%END;2.
4SAS宏介绍159%mendcontroled;%controled这里宏循环执行2次.
当宏变量i=2时,&&vars&i解析为&vars2然后再解析为nobs.
这时,&&&vars&i不能访问宏变量nobs的值5(如果宏变量vars有值xyz,&&&vars&i先替换成&xyz1再试图解析宏变量xyz1).
用了临时宏变量tmpname来保存nobs,然后用&&&tmpname先解析为&nobs再解析为samp.
class.
这个例子中,如果不需要按照控制数据集的要求生成宏变量(宏变量dsn定义为samp.
class,宏彬和nobs定义为5),就可以把数据集的两列分别定义为两个宏变量数组,其访问就可以不用三个&的格式.
2.
4.
13用PROCSQL生成宏变量组用PROCSQL生成宏变量可以用PROCSQL的SELECTINTO方法生成宏变量,用冒号引入宏变量名.
从一行的各列或统计结果生成宏变量,如procsqlnoprint;selectcount(*),sum(amount)format=best5.
into:nstudent,:totalfromsamp.
c9501bk;quit;%put&nstudent.
&total.
;PROCSQL的NOPRINT选项不自动显示查询结果.
INTO后面的宏变量名用前导冒号标识.
从多行的各列生成宏变量,如160第二章SAS语言与数据管理procsqlnoprint;selectname,amountinto:name1-:name9999,:amount1-:amount9999fromsamp.
c9501bk;%letnstudents=&sqlobs;quit;%put&nstudents;%put&name3&amount3;INTO后面代表同一列值的宏变量组用减号构造.
虽然指定了变量名可以到name9999,但是实际只生成有值的那些.
宏变量sqlobs在执行完一个SQLSELECT后保存查询结果行数.
从多行的各列生成宏变量,也可以把一个变量各行的值用空格分隔放入一个宏变量中,如procsqlnoprint;selectname,amountINTO:namesSEPARATEDBY'',:amountsSEPARATEDBY''FROMsamp.
c9501bk;quit;%put&names---&amounts;使用了SEPERATEDBY格式.
也可以使用逗号等作分隔.
空格分隔列表利用宏变量中用空格分隔的列表可以用%SCAN函数逐个提取,直到提取到空值为止.
例:2.
4SAS宏介绍161%macrovl(vars);%doivar=1%to100000;%letval=%scan(&vars.
,&ivar.
);%if&val.
=%then%gotoendd;%putNO.
&ivar.
&val;%end;%endd:%mend;%vl(&names)162第二章SAS语言与数据管理2.
5用procsql管理数据2.
5.
1简单查询用procsql管理数据SAS系统除了统计分析之外还有很强对数据管理功能.
SQL语句是大型关系数据库管理专用语言,流行的大型数据库系统都支持SQL语言.
SAS的SQL过程实现了SQL语言.
SAS的SQL过程可以:–从一个或多个表中查询信息;–生成表;–向表中插入行;–更新表的内容;–对表进行纵向合并、横向连接;–直接连接外部数据库,等等.
SQL查询用PROCSQL作查询的最简单的用法如下:PROCSQL;SELECT第一项,第二项,…,第n项FROM数据集WHERE观测选择条件;RUN;例:全部内容变量中用*表示全部变量,不加WHERE子句表示全部观测.
如2.
5用PROCSQL管理数据163procsql;select*fromc9501;quit;如果数据集观测过多,可以在PROCSQL语句中加OUTOBS=选项指定输出的观测个数.
例:列子集SELECT子句中指定若干变量,变量名之间以逗号分隔!
如procsql;selectname,mathfromc9501;quit;例:行子集用WHERE子句指定选择行子集的条件.
如procsql;selectname,mathfromc9501WHEREsex='男';quit;164第二章SAS语言与数据管理例:DISTINCT在变量名前面加上DISTINCT前缀则此变量的不同值只保留一次.
如procsql;selectDISTINCTSEXfromc9501;quit;如果DISTINCT后面有多个变量名则取所有不同组合.
例:计算新变量在SELECT子句中用表达式,AS关键字和新变量名定义新变量并显示.
如procsql;selectname,math+chineseAStotalfromc9501;quit;如果WHERE子句中使用了新变量,需要用CALCULATED前缀修饰,如procsql;selectname,math+chineseAStotalfromc9501whereCALCULATEDtotal>=200;quit;2.
5用PROCSQL管理数据165用ORDERBY子句排序在SELECT语句中可以加入ORDERBY子句为查询结果排序.
例:procsql;selectname,mathfromc9501wheresex='男'ORDERBYmathDESC;quit;对需要降序排列的变量,在变量名后加选项DESC.
2.
5.
2分组汇总用GROUPBY子句分组汇总在SELECT语句中可以加入GROUPBY子句分组,在组内用SUM,MEAN,MAX,STD等统计函数进行统计.
例:procsql;selectsex,mean(math)asmmfromc9501GROUPBYsex;quit;用HAVING子句按汇总结果选择如果进行了分组,则只能使用HAVING子句选择子集.
例:166第二章SAS语言与数据管理procsql;selectsex,mean(math)asmmfromc9501GROUPBYsexHAVINGmean(chinese)>=100;quit;结果为不同性别的平均数学成绩,但只显示平均语文成绩达到100分的组.
2.
5.
3生成和删除数据集生成数据集用CREATETABLE语句把查询结果存入数据集中.
例:procsql;CREATETABLEsubdASselectname,mathfromc9501wheresex='男'orderbymathdesc;select*fromsubd;quit;生成视图用CREATEVIEW语句把查询结果存入数据集中.
例:procsql;CREATEVIEWtotdAS2.
5用PROCSQL管理数据167selectname,math+chineseAStotalfromc9501;quit;procprintdata=totd;run;视图的用途类似于数据集,但是不实际保存数据,而只保存数据的访问和生成方式.
删除表或视图用DROPTABLE表名删除表(数据集).
用DROPVIEW视图名删除视图.
2.
5.
4连接左右合并:一对一SQL中SELECT的强大查询功能还表现在它可以从几个表联合查询.
例如,C9501X数据集包含学生姓名、性别,C9501Y数据集包含学生姓名、数学成绩、语文成绩,要显示男生的学生姓名、数学成绩:procsql;createtablec9501xASselectname,sexfromc9501;createtablec9501yASselectname,math,chinesefromc9501;quit;下面程序横向连接两个数据集进行查询:procsql;selecta.
name,mathfromc9501xASa,c9501yASb168第二章SAS语言与数据管理wherea.
name=a.
nameandsex='男'orderbymathdesc;quit;在FROM子句中指定了两个数据集,两个数据集之间用逗号分隔,在数据集名后面加AS关键字然后可以跟随一个临时别名;在WHERE子句中要求按name(姓名)连接两个数据集,还可以加其它行子集条件.
共有的变量名应该用"别名.
变量名"的格式显式指出.
一对一合并时SQL与数据步的区别SQL的一对一合并只包含匹配观测,不匹配观测被删除.
数据步中用MERGE和BY做一对一合并,缺省情况下既包含匹配观测,也包含所有不匹配的观测.
SQL中不需要输入数据集按关键列排序.
数据步中横向合并时需要输入数据集按关键列排序.
SQL中SELECT语句只显示合并的结果,并不生成数据集.
需要生成数据集时可以把SELECT语句嵌入到CREATETABLE语句中.
数据步中横向合并会生成输出数据集,但不显示.
为了在数据步中实现只有匹配观测的合并,可以用数据集选项IN.
如procsortdata=c9501x;byname;procsortdata=c9501y;byname;datanew;mergec9501x(IN=_a)c9501y(IN=_b);byname;IF_aAND_b;run;2.
5用PROCSQL管理数据169左右合并:一对多数据例:d1d2IDXIDYa11a21b12a22合并procsql;selectd1.
id,x,yfromd1,d2whered1.
id=d2.
id;quit;结果有(a,11,21),(a,11,22)两行.
不匹配行被丢弃.
一对多左右合并时SQL与数据步的区别数据步中用MERGE和BY语句也能进行一对多的合并.
在SQL中,不匹配行被丢弃.
在数据步中,匹配和和不匹配行都保留.
左右合并:笛卡儿积多个观测和多个观测的合并是笛卡儿积式的两两组合,如datad1;inputx@@;cards;1112;datad2;inputy@@;cards;2122170第二章SAS语言与数据管理;procsql;selectx,yfromd1,d2;quit;结果有(11,21),(11,22),(12,21),(12,22)四行.
左右合并:多对多按关键变量左右合并时,数据集观测按关键变量分组,如果某组出现多对多合并,则左右两边按笛卡儿积方法(所有两两组合)合并.
数据例:d3d4IDXIDYa11a21b12a22a13b23a24合并procsql;selectd3.
id,x,yfromd3,d4whered3.
id=d4.
id;quit;结果a有6行(d3的两行与d4的三行两两搭配),b有一行.
多对多左右合并时SQL和数据步的区别在进行一对一和一对多合并时,用SQL合并与用数据步合并的结果差别不大.
在多对多合并时,两种方法结果截然不同.
2.
5用PROCSQL管理数据171数据步多对多合并的规则是:按关键变量值分组后,同组内左右数据集的观测按次序对应合并,但是如果一边的观测用完的时候沿用组内最后一个观测的值.
比如,用数据步对d3和d4横向合并,程序如:procsortdata=d3;byid;procsortdata=d4;byid;datanew;merged3d4;byid;run;procprint;run;结果a组只有3个观测.
横向合并:不匹配观测SQL连接会把不匹配的观测排除在外.
如数据d5d6IDXIDYa11a21b12c22连接procsql;selectd5.
id,x,yfromd5,d6whered5.
id=d6.
id;quit;结果只有a的行.
172第二章SAS语言与数据管理横向合并:左外连接连接时为了包含左侧表的所有观测,使用LEFTJOIN来指定两个表,用ON指定连接条件.
如procsql;selectd5.
id,x,yfromd5LEFTJOINd6ONd5.
id=d6.
id;quit;横向合并:右外连接类似地,用RIGHTJOIN来指定两个表则保持右侧表的所有观测.
如procsql;selectd6.
id,x,yfromd5RIGHTJOINd6ONd5.
id=d6.
id;quit;横向合并:全外连接用FULLOUTERJOIN来指定两个表则保持两个表的所有观测.
如procsql;selectCOALESCE(d5.
id,d6.
id)ASid,x,yfromd5FULLOUTERJOINd6ONd5.
id=d6.
id;quit;用COALESCE函数合并关键列.
2.
5用PROCSQL管理数据1732.
5.
5一些技巧SQL比较条件SQL中可以使用数据步中的比较运算:INEQNEGTLTGELE还有一些其它的比较运算.
CONTAINS表示字符串包含某子串.
如wheretitleCONTAINS'cat'用ISNULL表示"是缺失值",在SQL数据库的表中是"空值".
用BETWEEN.
.
.
AND.
.
.
表示在某个范围内,包括两端的值.
如wheresalarybetween7000and8000可以用LIKE表示符合某种模式.
在模式中,用"%"表示任意多个任意字符,如:whereLastNameLIKE'H%'可以匹配Huang,Hong等.
在模式中,用一个下划线代表一个任意字符,如:whereLastNameLIKE'S_n'可以匹配Sun,Son,San等.
用"=*"表示"发音相似",仅针对英文,如whereLastName=*'SMITH'除了SMITH本身以外还可以匹配SMITT,SMYTHE,SMOTHE.
174第二章SAS语言与数据管理PROCSQL选项在要查询的数据表特别巨大时,往往要先小规模测试查询是否正确.
在PROCSQL语句中,用INOBS=n指定输入每个表仅允许输入n行,用OUTOBS=n指定输出结果时仅允许输出不超过n行,用LOOPS=n指定内层循环的最多循环次数.
2.
5.
6高级技巧示例子查询可以把SELECT的结果作为一个数据集看待,用于其他查询的WHERE子句.
如procsql;selectname,mathfromc9501ASawheresexIN(SELECTsexfromc9501ASbgroupbysexhavingmean(chinese)>=100);quit;按男女生分组,只显示语文成绩组平均达到100分的学生.
例子:找同生日设有C9501数据集中5个人的生日数据如下:title'找出生日相同的人';datacb;inputname$1-8birthyymmdd10.
;formatbirthyymmdd10.
;labelname='姓名'birth='生日';2.
5用PROCSQL管理数据175cards;李明78-6-1王思明78-5-19张聪78-6-1刘颖78-10-18张红艺79-5-19;可以使用如下子查询方法:procsql;selectname,birthfromcbASawherebirthin(selectbirthfromcbASbwhereb.
name^=a.
name)orderbya.
birth;run;这里,外层的SELECT对别名A的数据集CB的5行进行外层循环,内层的SELECT对别名B的数据集CB中名字与外层当前名字不同的4行进行内层循环,外层的WHERE子句的条件是要求外层循环中当前观测的生日输入内层循环中找出的其它人生日集合.
还可以使用如下横向合并方法:procsql;selecta.
name,a.
birthfromcbASa,cbASbwherea.
name^=b.
nameanda.
birth=b.
birthorderbya.
birth;quit;176第二章SAS语言与数据管理这里,合并的两个数据集是相同的,因为合并是按照笛卡儿积方式(所有两两组合)进行的所以实现了任意两个人之间的比较,WHERE子句要求同一个人自己不要比较,选择生日相同的人作为结果.
仅需月日相同时的处理如果生日相同只需要生日的月和日相同,可以首先生成一个仅包含月、日信息的新变量,然后按此新变量查询.
如procsql;createviewdatamdasselectname,birth,month(birth)*100+day(birth)ASmdfromcb;selectname,birthfromdatamdASawheremdin(selectmdfromdatamdASbwhereb.
name^=a.
name)orderbya.
md;dropviewdatamd;run;quit;例:不用SQL找同生日找生日的问题也可以用其它方法完成.
想法是,统计数据集中每个生日的出现次数,显示次数在2次以上的那些生日和对应的姓名.
首先用PROCFREQ统计生日的出现次数,保存到数据集BFREQ中:title'找出生日相同的人:PROCFREQ';procfreqdata=cbnoprint;tablesbirth/out=bfreq;run;2.
5用PROCSQL管理数据177这时,数据集BFREQ中仅有生日和重复次数,没有相应的姓名.
需要把姓名信息与生日重复次数的信息横向合并,并只合并有重复生日的观测:procsortdata=cb;bybirth;procsortdata=bfreq;bybirth;databsame;mergecbbfreq;bybirth;IFcount>1;run;横向合并时用了子集IF语句来选择输出观测.
注意这个选择不能改为对BFREQ的输入数据集选项,因为MERGEBY合并会把不匹配观测也包含进来.
然后显示合并后的内容:procprintdata=bsamelabelnoobs;varname;bybirth;idbirth;run;最后,用PROCDATESETS的DELETE语句删除不再需要的数据集:procdatasetslibrary=work;deletebfreqbsame;run;178第二章SAS语言与数据管理第三章SAS功能基础179180第三章SAS功能基础3.
1SAS过程初步SAS过程初步SAS过程步的一般用法和常用语句的含义;SAS的简单报表、分析、绘图功能的使用;介绍SAS的分析员(Analyst)模块.
3.
1.
1SAS过程用法SAS过程用法SAS过程步的一般形式为:PROC过程名DATA=输入数据集选项;过程语句[/选项];过程语句[/选项];……RUN;其中PROC语句的"选项"是可选的,用来规定过程运行的一些设置,如果有多个选项用空格分开.
过程步一般以RUN语句结束,有些"交互式过程"以QUIT语句结束;其他数据步或过程步也可以结束上一个数据步或过程步.
过程语句过程步可以包含过程语句.
过程语句与数据步中的语句不同,数据步中的语句不能用在过程步中.
过程步语句一般以某一个关键字开头,比如VAR、BY、TABLES、WEIGHT等,语句中提供一些必要参数,如果有可选的选择项的话一般写在斜杠后.
过程输出有些过程只进行变换,不生成显示结果;多数过程步有结果显示在OUTPUT窗口;3.
1SAS过程初步181绘图过程结果显示在GRAPHICS窗口;对OUTPUT窗口的结果可以保存、复制、打印;新版SAS支持HTML格式的输出.
3.
1.
2SAS过程步常用语句VAR语句VAR语句在很多过程中用来指定分析变量.
在VAR关键字后面给出变量列表:VAR变量名1变量名2…变量名n;变量名列表可以使用省略的形式,如X1X3,MATHCHINESE等.
例如:varmathchinese;MODEL语句MODEL语句在一些统计建模过程中用来指定模型的形式.
一般形式为MODEL因变量=自变量表/选项;例如:modelmath=chinese;即用语文成绩预测数学成绩.
182第三章SAS功能基础BY语句BY语句在过程中一般用来指定一个或几个分组变量,根据这些分组变量值把观测分组,然后对每一组观测分别进行本过程指定的分析.
在使用带有BY语句的过程步之前一般先用SORT过程对数据集排序.
比如,下列SORT过程和PRINT过程可以把男、女生分别列出:procsortdata=c9501;bysex;run;procprintdata=c9501;bysex;run;CLASS语句在一些过程(如ANOVA)中,使用CLASS语句指定一个或几个分类变量.
在另一些过程(如MEANS)中,CLASS语句作用与BY语句类似,可以指定分类变量,把观测按分类变量分类后分别进行分析.
使用CLASS时不需要先按分类变量排序.
OUTPUT语句常用OUTPUT语句指定输出结果存放的数据集.
不同过程中把输出结果存入数据集的方法各有不同,OUTPUT语句是用得最多的一种,其一般格式为:OUTPUTOUT=输出数据集名关键字=变量名关键字=变量名…;或3.
1SAS过程初步183OUTPUTOUT=输出数据集名关键字=关键字=…/AUTONAME;用OUT=给出了要生成的结果数据集的名字;用"关键字=变量名"的方式指定了输出哪些结果并给结果变量命名,或不指定结果变量名但用AUTONAME选项自动命名.
OUTPUT语句例子procmeansdata=sasuser.
c9501;varmath;outputout=resultn=nmean=meanmathvar=varmath;run;procprintdata=result;run;FREQ语句FREQ语句指定一个重复数变量,每个观测中此变量的值说明这个观测实际代表多少个完全相同的重复观测.
FREQ变量只取整数值.
如freqnumcell;WEIGHT语句指定一个权重变量,在某些允许加权的过程中代表权重,其值与观测对应的方差的倒数成正比.
ID语句有些过程(如PRINT、UNIVARIATE)需要输出观测的代号,这一般使用观测的序号.
如果数据集中有一个变量可以用来区分观测(如人名、省市名),就可以用ID语句指定这个变量作为观测标识,如:idname;184第三章SAS功能基础WHERE语句用WHERE语句可以选择输入数据集的一个行子集来进行分析,在WHERE关键字后指定挑选行的条件.
比如wheremath>=60andchinese>=60;指定只分析数学、语文成绩都及格的学生.
LABEL语句过程步中的LABEL语句为变量指定一个临时标签,很多过程可以使用这样的标签.
LABEL语句的格式为LABEL变量名='标签'变量名='标签'…;例如procprintdata=sasuser.
c9501label;idname;varmathchinese;labelname='姓名'math='数学成绩'chinese='语文成绩';run;FORMAT语句过程步中的FORMAT语句可以为变量输出规定一个输出格式.
比如procprintdata=sasuser.
c9501;formatmath5.
1chinese5.
1;run;使得列出的数学、语文成绩宽度占5位,带一位小数.
在数据步中可以用ATTRIB定义永久性的输出格式和变量标签.
过程步中的输出格式和变量标签仅限于该过程步.
3.
2列表报告1853.
2列表报告3.
2.
1PROCPRINT基本使用列表报告PRINT过程用来生成列表报告.
本节讲:–PRINT过程的使用;–常用语句的使用示例;–SAS输出管理.
PRINT过程基本用法显示刚生成的数据集:procprint;run;在PROCPRINT语句中用DATA=选项指定要列出的数据集:procprintdata=sasuser.
gpa;run;用VAR语句指定要列出的变量及其次序:procprintdata=c9501;varnamechinesesex;run;PRINT过程中消除行号列在PROCPRINT语句中用NOOBS选项抑制观测序号的显示:procprintdata=c9501noobs;run;186第三章SAS功能基础也可以用ID语句指定一个变量作为区分不同观测的输出列,输出时排在第一列,这样就不需要NOOBS选项也不显示观测序号,如:procprintdata=c9501;IDname;run;PRINT过程中选择部分行进行显示使用WHERE语句可以从输入数据集中选一个行子集:procprintdata=c9501;wherenamein('李明','张聪');run;也可以使用输入数据集的WHERE选项:procprintdata=c9501(where=(namein('李明','张聪')));run;用BY语句分组处理在过程步中使用BY语句可以指定分类变量,把观测分类处理.
在使用带有BY语句的过程之前先用SORT过程对数据集按照分类变量排序.
例如:procsortdata=samp.
c9501out=c9501;bysex;run;procprintdata=c9501;bysex;run;3.
2列表报告187结果显示为分男女两组,分类单独显示在分隔线中.
可以有多个BY变量.
多个BY变量时可以用PAGEBY语句指定按哪个BY变量分页.
PRINT过程中紧凑分组显示如果数据集中某个变量有重复值,先把数据集按此变量分组(排序)后在PRINT过程中把此变量同时列入BY语句和ID语句,则此变量显示在结果的第一列而且重复值只显示一次,不再有单独的分组值的分隔线,如:procsortdata=samp.
c9501out=c9501;bysex;run;procprintdata=c9501;bysex;idsex;run;3.
2.
2SAS界面中的输出管理SAS中对输出结果的管理新版本的SAS系统提供了一个结果管理窗口来管理输出,叫Results窗口.
如果没有可以从"View-Results"菜单打开.
过程的输出以树形目录方式显示,双击某一个结果项可以直接跳到该结果.
可以在这个窗口中删除、保存某些结果,选定某个结果用右键弹出菜单可以选择此窗口的管理功能.
188第三章SAS功能基础HTML输出SAS除了一般文本输出外还提供了HTML格式(即网页格式)的输出.
设置方法:调用"Tools-Options-Preferences"菜单,在弹出的对话框中找到"Results"页,选中其中的"CreateHTML".
双击Results窗口中的HTML输出项目显示HTML输出窗口.
Results窗口中右键菜单的"EditSource"可以把HTML结果的源代码打开到程序编辑窗口进行编辑和保存.
3.
2.
3SASODS介绍SASODS介绍Output窗口的文本型输出是最传统的输出方式.
优点是简单好用;缺点是难体现格式.
在SAS界面中通过选项可以每次生成HTML格式的输出,这样的输出也可以复制到MSWord中.
新版的SAS提供了ODS(输出提交服务)功能,优点为:–支持的输出格式多,如HTML、RTF、LaTeX、PDF、PostScript等.
–支持把输出表格作为一个数据集保存.
–支持输出部分结果.
–支持新输出格式自定义.
–SASODS是较新功能,不同版本之间有所变化.
输出为HTML用ODSHTML语句指定一个HTML输出文件,用ODSHTMLCLOSE关闭输出文件,用不指定输出文件的ODSHTML语句重新打开在窗口缺省显示的HTML结果.
如odshtmlbody="testhtml.
htm";title'身高和体重数据';procprintdata=samp.
classnoobs;3.
2列表报告189run;title'身高和体重基本统计';procmeansdata=samp.
class;varheightweight;classsex;run;title;odshtmlclose;odshtml;在SAS9.
2版本中以上程序会把不同的过程输出写到不同的HTML文件中.
输出为CSV用ODSCSVALL语句指定一个CSV输出文件,用ODSCSVALLCLOSE关闭输出文件,如odscsvallbody="testcsv.
csv";title'身高和体重数据';procprintdata=samp.
classnoobs;run;title'身高和体重基本统计';procmeansdata=samp.
class;varheightweight;classsex;run;title;odscsvallclose;在SAS9.
2版本中以上程序会把不同的过程输出写到不同的CSV文件中.
把CSVALL改成MSOFFICE2K或者EXCELXP,可以输出到与MSExcel兼容的文件中.
190第三章SAS功能基础输出为RTFRTF是与MSWord兼容的格式.
例:odsrtffile="testods.
rtf"contentstoc_databodytitlestartpage=nokeepn;odsrtfstyle=Minimal;odsnoproctitle;title'身高和体重数据';procprintdata=samp.
classnoobs;run;title'身高和体重基本统计';procmeansdata=samp.
class;varheightweight;classsex;run;odsrtfclose;其中的选项TOC_DATA和BODYTITLE需要SAS9.
2以上版本.
选项CONTENTS生成目录,TOC_DATA在运行过程中收集目录条目,BODYTITLE要求把大标题写在正文部分而非页眉部分,START-PAGE=NO允许当若干个过程输出都较短时合并在一页中,KEEPN要求尽可能不把表格拆分到两页.
为了显示SAS自动生成的目录,用MicrosoftOce打开生成的RTF文件后,用Ctrl+A全选内容,然后按F9功能键可以更新目录.
用ODS的STYLE=选项指定一种样式,样式种类可以在"Tools-Options-Preferences"菜单打开的对话框中的找到"Results"页查看和试用.
输出为LATEXLATEX是另外一种常用的报告形式.
下例把结果输出为"sasout.
tex",但也输出了一个SAS的支持包"sas.
sty",用户可以在自己的LATEX文件中插入SAS输出的LATEX文件的内容,但在序言中需要引入"sas"包.
3.
2列表报告191odslatexfile='sasout.
tex'stylesheet='sas.
sty'(url='sas');procmeansdata=sasuser.
class;title'MeanHeightandWeight';varheightweight;run;odslatexclose;输出为PDFPDF是一种可在不同操作系统、本地语言环境下打印、查看但基本上不能修改的格式.
odspdffile='sasout.
pdf';title;procprintdata=sasuser.
classnoobslabel;run;odspdfclose;用ODS保存输出表为数据集不同的SAS过程有不同输出格式和输出数据集选择,有时我们需要的信息只出现在显示结果中,SAS过程没有提供保存的选项.
利用ODS,可以把任何显示结果保存为数据集.
首先,我们要知道该过程输出的各部分结果的名称,办法如下例:odstraceon;procunivariatedata=samp.
class;varheight;run;odstraceoff;192第三章SAS功能基础在日志中将显示各输出部分的名称:Moments、BasicMeasures、Tests-ForLocation、Quantiles、ExtremeObs.
为了保存显示输出为数据集,只要使用ODSOUTPUT语句,其中用"输出名=数据集名"的方法指定输出.
如odsoutputMoments=momQuantiles=qu;procunivariatedata=samp.
class;varheight;run;odsoutputclose;上例保存了显示结果中的矩部分为数据集MOM,分位数部分为QU.
注意保存的数据集是显示格式的,不是最方便使用的.
3.
2.
4标题和全局语句使用中文列标题为了对列标题使用中文,可以在过程内用LABEL语句给变量指定标签,同时在PROCPRINT语句中加LABEL选项.
如果已经在生成数据集的数据步中用LABEL语句或ATTRIB语句为变量指定了标签则不必重复定义标签.
如:procprintdata=c9501noobslabel;varnamesexmathchineseavg;labelname='姓名'sex='性别'math='数学'chinese='语文'avg='平均分';run;在PROCPRINT语句中指定SPLIT=选项可以指定标签中的一个字符为换行标志,使得比较长的标签可以在指定的位置拆分为两行或多行.
3.
2列表报告193使用输出格式和LABEL语句类似,FORMAT语句临时为变量指定输出格式.
如:procprintdata=c9501noobs;varnamesexmathchineseavg;formatmath7.
1chinese7.
1avg7.
2;run;标题可以指定自己的标题来取代SAS缺省的标题.
指定标题的TITLE语句的格式为:TITLE'标题内容';例如:title'95级1班成绩表';procprintdata=c9501noobslabel;varnamesexmathchineseavg;labelname='姓名'sex='性别'math='数学'chinese='语文'avg='平均分';run;TITLE语句也是一个全局语句.
全局语句的作用有持续性,全局语句的效果将持续到退出SAS系统或用另一个同样的全局语句来修改它.
取消标题用没有内容的空的TITLE语句:title;用全局语句FOOTNOTE可以为输出加脚注:footnote'第三章例子输出';194第三章SAS功能基础3.
2.
5分组与总计计算总计在PRINT过程中可以用SUM语句计算某个变量的总计(总和).
例如,9501班的同学购买课外书所用的钱数计算总和:databkmoney;inputname$amount;cards;李明20张红艺15王思明10张聪20刘颍50;run;procprintdata=bkmoneynoobs;sumamount;run;计算小计和总计用BY语句与SUM语句就可以既计算总和也计算分组小计,观测分组显示,用带有分组变量值的分隔线分隔.
比如,我们除了要计算学生购买课外书总支出外还想分男、女生计算总支出,首先我们需要把学生性别和课外书支出数据合并,如:procsortdata=c9501;byname;procsortdata=bkmoney;byname;datac9501bk;mergec9501bkmoney;byname;run;3.
2列表报告195然后,用BY语句指定分组,与SUM语句配合就可以分组计算小计,最后计算总计,如procsortdata=c9501bk;bysex;procprintdata=c9501bk;bysex;sumamount;run;如果使用了多个BY变量,可以用SUMBY语句指定按哪个BY变量计算小计.
小计和总计的紧凑显示格式在用BY语句与SUM语句配合计算小计和总计时,把BY变量列入ID语句可以使得分组变量列在输出表的第一行而不再有单独的组分隔线,且观测中分组变量的重复值仅显示一次.
如:procprintdata=c9501bk;bysex;idsex;varnameamount;sumamount;run;显示观测个数在PROCPRINT语句中中加入N='总人数:'选项可以在表最后显示'总人数:xx'.
如:procprintdata=c9501bkn='总人数:';sumamount;run;196第三章SAS功能基础但是,当使用了BY进行分组显示时,观测个数在组内显示.
如需要指定如procprintdata=c9501bkn='小组人数:';bysex;idsex;run;如果使用了BY进行分组且用SUM语句计算小计和总计,则选项N=需要指定如N='小组人数:''总人数:',这样在每个组显示'小组人数:xx',在表最后显示'总人数:xx'.
如:procprintdata=c9501bkn='小组人数:''总人数:';bysex;idsex;sumamount;run;3.
3汇总表格1973.
3汇总表格TABULATE过程与汇总表格PRINT过程列出观测.
TABULATE过程绘制概括统计量的表格.
TABULATE可以作出很复杂的表,其一般格式为:PROCTABULATEDATA=数据集名;CLASS分类变量;VAR分析变量;TABLE页维说明,行维说明,列维说明/选项;RUN;CLASS语句给出分类变量;VAR语句给出区间变量.
一个TABULATE过程步中允许使用多个TABLE语句.
例:男、女生的课外书支出总和对C9501BK数据集,proctabulatedata=c9501bk;classsex;varamount;tablesex,amount;run;行维是SEX,作为列维是AMOUNT的总和.
例:男女生人数统计TABLE语句中只有一个变量SEX,计算分类变量SEX每类的人数.
198第三章SAS功能基础proctabulatedata=c9501bk;classsex;tablesex;run;区间变量的缺省统计量是总和;分类变量的缺省统计量是频数.
分类变量各个值的次序缺省为数据中出现的先后次序,但是可以用PROCTABULATE语句或CLASS语句中的ORDER=选项指定,可取值为DATA(缺省)、FORMATTED(按格式化输出内容排序)、FREQ(按出现次数由大到小排序)、UNFORMATTED(按存储内容排序).
计算统计量要计算统计量,可以用"变量名*统计量名"的形式.
统计量名包括N,NMISS,MEAN,STD,MIN,MAX,RANGE,SUM,USS,CSS,STDERR,CV,T(检验均值为0的t统计量值),PRT(t统计量的p值),VAR,SUMWGT(权数变量的和),PCTN(某类观测占总观测个数的百分比),PCTSUM(某类观测的总和占全部总和的百分比).
计算统计量(续)例如,求男、女生的数学、语文成绩平均值及标准差:proctabulatedata=c9501bk;classsex;varmathchinese;tablesex,(mathchinese)*(meanstd);run;变量名和统计量名的次序也可以颠倒过来,比如(meanstd)*(mathchinese),得到的表格中也将以统计量为大栏目而以变量为小栏目.
3.
3汇总表格199合并分类的统计为了在分类计算同时还计算不分类的结果,只要在TABLE语句中分类变量后面加上ALL关键字.
如:tablesexall,(mathchinese)*(meanstd);可以用星号连接分类变量和分类变量可以构成交叉分组;可以用星号连接分类变量和区间变量可以分类计算区间变量的统计量;用星号连接变量名与统计量名表示计算该变量的相应统计量.
例如:计算性别频数(N)和百分比(PCTN)table(sexall)*(NPCTN);上例没有行维,只有列维.
分类变量的分类作用CLASS语句指定的分类变量如果不是要对本身计算N、PCTN这样的统计量而是希望分类计算其他变量的统计量,还需要指定需要统计的区间变量,如:table(sexall)*math*(meanstd);上例没有行维,只有列维.
缺失值处理CLASS语句指定的分类变量如果有缺失值,正常情况下缺失值会被忽略.
在PROCTABULATE语句中加入MISSING选项,则要求所有的分类变量如果有缺失值则缺失值作为一个单独的分类.
200第三章SAS功能基础在CLASS语句中加入MISSING选项,则此CLASS语句中指定的分类变量的缺失值作为单独分类.
如CLASSab/missing;CLASSc;则变量A,B包含缺失值作为单独分类,而C则舍弃缺失值.
标签可以在TABULATE过程中使用KEYLABEL语句指定各统计量的标签.
其格式为KEYLABEL关键字='标签';例如:proctabulatedata=c9501bk;classsex;varmathchinese;table(sexall),(mathchinese)*(meanstd);keylabelmean='平均值'std='标准差'all='总计';labelsex='性别'math='数学'chinese='语文';run;标签(续)另一种指定统计量标签的办法是在TABLE语句中直接指定,例如:proctabulatedata=c9501bk;classsex;varmathchinese;table(sex='性别''all'='总计'),3.
3汇总表格201(math='数学'chinese='语文')*('mean'='平均值''std'='标准差');run;格式在PROCTABULATE语句中用FORMAT=指定数值的显示格式,如FORMAT=comma10.
2.
也可以对某一统计量用"*F="指定输出格式.
例如:proctabulatedata=c9501bk;classsex;varmathchinese;table(sex='性别''all'='总计'),(math='数学'chinese='语文')*('mean'='平均值'*F=5.
1'std'='标准差'*F=6.
2);run;输出到数据集在PROCTABULATE语句中用OUT=指定一个输出数据集.
一般生成汇总和分类汇总数据集应该用PROCMEANS比较方便,PROCTABULATE也有一些独特的统计量如PCTSUM之类.
例如:proctabulatedata=samp.
c9501bkOUT=summd;classsex;varamount;tablesex,amount*(NSUMPCTSUM);run;202第三章SAS功能基础SAS表格线乱码问题有时用TABULATE过程作表时表格线是一些乱码,这是SAS系统设置文件中关于FORMCHAR的设置的问题.
在SAS系统的安装目录下查找到一个名为SASV8.
CFG的文件,把其中的所有以"FORMCHAR"开始的行都注释掉,只留下如下的行不注释:-FORMCHAR就可以解决这个问题.
3.
4数据排序2033.
4数据排序SORT过程在SAS过程中用BY语句可以把观测分类进行处理,但在此之前需要先用SORT过程排序.
SORT过程可以把数据集按某一个或若干个变量的次序进行排序.
例如:procsortdata=c9501;bysex;run;用DATA=指定的数据集既是输入数据集又是输出数据集.
用OUT=选项把结果存到新数据集.
获得变量取值集合在PROCSORT语句中加NODUPKEY选项可以在按指定的BY变量排序时舍弃重复的BY变量值,只留下那些互不相同的BY变量值.
如procsortdata=c9501out=c9501sex(keep=sex)nodupkey;bysex;run;一个变量名前面加上DESCENDING关键字表示此变量的排序是由大到小的.
在INSIGHT中也可以排序.
204第三章SAS功能基础按几个变量排序按几个变量排序,比如,要按男、女性别排序,并在男生、女生内部按平均分由高到低排序,可以:procsortdata=c9501;bysexdescendingavg;run;一个变量名前面加上DESCENDING关键字表示此变量的排序是由大到小的.
在INSIGHT中也可以排序.
数据步中排序处理在数据步中用SET语句读入的数据集如果按照某个变量排序,就可以加BY语句按此变量分组,可以使用临时变量FIRST.
变量名判断是否分组的首个观测,LAST.
变量名判断是否分组的最后一个观测.
例如,为了只保留男生中最高和女生中最高,可用procsortdata=sasuser.
classout=cl2;bysexdescendingheight;run;datanew;setcl2;iffirst.
sex;bysex;run;procprint;run;3.
5数据集转置2053.
5数据集转置数据集转置一个SAS数据集(或其列子集)可以看成是某种矩阵,观测为矩阵的行,变量为列.
用TRANSPOSE过程转置:行变成列,列变成行.
简单的矩阵转置datamat;inputx1x2x3;cards;123456789101112;run;proctransposedata=matout=matt;varx1x2x3;run;procprint;run;合并观测例:数据待合并观测的数据集ONECOL病历号药物药效NUMTESTVAL1a112a123a131b212b223b23206第三章SAS功能基础合并观测后的数据集TWOTEST病历号来源变量药物A药物BNUM_NAME_AB1val11212val12223val1323合并观测例:PROCTRANSPOSEprocsortdata=onecol;bynum;run;proctransposedata=onecolout=twotest;varval;idtest;bynum;run;用BY语句对每个病人分别处理.
用VAR语句指定要转置的列子集.
VAR指定的变量每一行会变成结果的一列,但有BY分组时只对当前组的行转置.
用ID语句指定各行变成列时的变量名数据.
加输出数据集选项DROP=_NAME_可以去掉多余的_NAME_列.
合并观测:使用数据步把TEST="a"的观测输出到数据集DA,TEST="a"的观测输出到数据集DB;使用标准的横向合并方法按关键列NUM合并数据集DA和DB.
datada;setonecol;wheretest='a';a=val;keepnuma;datadb;setonecol;wheretest='b';b=val;keepnumb;procsortdata=da;bynum;procsortdata=db;bynum;3.
5数据集转置207datatwocol;mergedadb;bynum;run;其中数据子集的程序可以用数据集选项,如dataa(drop=test);setonecol(where=(test='a')rename=(val=a));datab(drop=test);setonecol(where=(test='b')rename=(val=b));合并观测:PROCSQL把ONECOL看成两个并排的数据集进行合并:title'合并行:PROCSQL';procsql;createtabletwocasselecta.
numasnum,a.
valasa,b.
valasbfromsamp.
onecola,samp.
onecolbwherea.
num=b.
numanda.
test='a'andb.
test='b';quit;拆分观测例:数据待拆分观测的数据集TWOCOL病历号测量1测量2NUMTEST1TEST2111212122231323208第三章SAS功能基础拆分观测后的数据集ONETEST病历号来源变量测量NUM_NAME_COL11test1111test2212test1122test2223test1133test223拆分观测例:PROCTRANSPOSEprocsortdata=twocol;bynum;run;proctransposedata=twocolout=onetest;vartest1test2;bynum;run;BY语句要求对每个病人分别处理;VAR语句指定要转置的两列,每个病人的这两列在结果中被转置为同一列的两行.
新的列变量自动起名为COL1;结果中_NAME_表示从列变成的行原来是哪一列.
为了把自动命名的COL1改名,可以用数据集选项的RENAME,如procsortdata=twocol;bynum;run;proctransposedata=twocolout=onetest(rename=(col1=val));vartest1test2;bynum;run;3.
5数据集转置209为了把区分两次试验的test1,test2改为数值1和2,可以使用数据步的SUBSTR和INPUT函数:datanew;setonetest(rename=(_name_=test));testid=input(substr(test,5,1),1.
);droptest;run;procprint;run;其中在输入数据集选项中把变量名_NAME_改为了TEST.
拆分观测:数据步在数据步中用多次OUTPUT可以把一个观测拆分为多个观测:datanew1;attribnumlength=8testlength=$1vallength=8;settwocol;val=test1;test='a';output;val=test2;test='b';output;droptest1test2;run;procprint;run;拆分观测:PROCSQLPROCSQL中UNION进行上下合并:title'拆分行:PROCSQL';procsql;selectnum,'a'Astest,test1ASvalfromsamp.
twocolaunionselectnum,'b'Astest,test2ASvalfromsamp.
twocol;quit;210第三章SAS功能基础3.
6描述统计描述统计MEANS、UNIVARIATE和FREQ这三个过程用来计算简单的描述统计量.
MEANS和UNIVARIATE过程对区间变量计算均值、标准差等数字特征;FREQ过程计算取值频数分布.
MEANS过程例子例:procmeansdata=c9501;varmathchinese;run;可以在PROCMEANS语句中指定SUM,CV等统计量名,要求只输出这些统计量.
如procmeansdata=sasuser.
classsumcv;varheight;run;MEANS过程:置信区间在PROCMEANS语句中用CLM选项要求计算均值的置信区间,用ALPHA=指定置信度为1α:procmeansdata=sasuser.
classalpha=0.
10meanstdclm;varheight;run;3.
6描述统计211MEANS过程:OUTPUT语句(第一种)可以使用OUTPUT语句把结果保存到数据集,如:procmeansdata=sasuser.
class;varheightweight;outputout=mc1mean=mhmw;run;完全由用户指定变量名,结果数据集有一行.
MEANS过程:OUTPUT语句(第二种)使用AUTONAME要求对统计量自动命名,结果数据集为一行:procmeansdata=samp.
class;varheightweight;outputout=mc2mean=std=/autoname;run;MEANS过程:OUTPUT语句(第三种)在PROCMEANS语句中指定要输出的统计量,OUTPUT语句中不指定统计量和变量名,这时输出的数据集中每种统计量占一行,每个分析变量占一列,如procmeansdata=samp.
classNOPRINTMEANMINMAX;varheightweight;outputout=mc3;run;procprint;run;212第三章SAS功能基础MEANS过程:输出结果数据集的利用为了从CLASS数据集的身高中减去全班平均身高,可用如下数据步:procmeansdata=sasuser.
class;varheight;outputout=mc1mean=mh;run;datacc;setsasuser.
class;if_n_=1thensetmc1(keep=mh);height2=height-mh;run;procprint;run;这里用了两个SET语句,使用了数据步临时变量_N_.
MEANS过程:CLASS语句用CLASS语句指定分组变量进行分组汇总或交叉分组汇总,如procmeansdata=sasuser.
class;classsex;varheight;outputout=mcsmean=mh;run;procprint;run;生成的结果数据集MCS中包含男女生各一行结果,还包含一行不分男女生的结果.
用变量_TYPE_区分分组级别.
与使用BY语句的效果类似,但是(1)使用BY语句需要预先对数据集排序;(2)用CLASS语句分组汇总,生成的结果数据集包含不分组的结果行.
3.
6描述统计213如果希望生成的数据集中不包含不分组的结果行,在PROCMEANS语句中使用NWAY选项.
在上例中得到分男女生的平均身高后,可以用如下程序对男女生身高分别减去本组的平均身高:procsortdata=sasuser.
class;bysex;procsortdata=mcs(where=(_type_=1));bysex;datanew;mergesasuser.
classmcs;bysex;height2=height-mh;run;procprint;run;MEANS过程:用CLASS语句交叉分组数据集GRADE中包含了10个学生的姓名、性别、状态(status,1或2)、年级(year,97或98)、分区(section,A或B)、分数(score)、总评分数(FinalGrade).
在CLASS语句中指定多个分类变量进行交叉分组的汇总:procmeansdata=samp.
grademaxdec=3;varScore;classStatusYear;title'按学生状态和毕业年分类的分数统计';run;显示的结果有4类.
MEANS过程:用CLASS语句汇总数据CLASS语句配合OUTPUT语句可以把分类汇总的统计量保存到数据集,如:214第三章SAS功能基础procmeansdata=samp.
grade;varScore;classStatusYear;outputout=mgsymean=msstd=ss;run;procprint;run;结果中除了交叉分组得到的4行外,还包括只按Status分组的两行,只按Year分组的两行,和不分组的一行.
用变量_TYPE_区分不同的分组级别.
SUMMARY过程PROCSUMMARY与PROCMEANS用法相同,但主要用来生成汇总数据集,缺省情况下不显示.
UNIVARIATE过程例子procunivariatedata=sasuser.
gpa;vargpa;run;UNIVARIATE过程的结果矩统计量;基本的位置和分散程度统计量;–均值、中位数、众数;–标准差、方差、极差、四分位间距.
关于均值等于零的三种检验的结果:–t检验;–符号检验;–符号秩检验.
3.
6描述统计215各个重要的分位数估计;五个最低值和五个最高值.
茎叶图在PROCUNIVARIATE语句中加一个PLOT选项可作茎叶图、盒形图和正态QQ图.
茎叶图是一种特殊的直方图–每个叶子代表一个观测值.
例:GPA的茎叶图的解释.
FREQ过程FREQ过程可以列出变量的取每个值的次数、比例、累计次数、累计比例.
在TABLES语句中指定要列表的变量.
例:procfreqdata=c9501;tablessex;run;可以把结果保存到一个输出数据集,如:procfreqdata=c9501;tablessex/out=sext;run;procprint;run;输出数据集中如果需要累计频数和累计百分比则应使用OUTCUM选项.
216第三章SAS功能基础FREQ过程例:GPA例:procfreqdata=sasuser.
gpa;tablesgpa;run;结果中变量值列和累计百分比列构成经验分布函数表格.
经验分布函数:Fn(x)=1nn∑i=1I{Xi≤x}.
列联表FREQ过程可以列出两个变量所有不同组合的频数、百分比以及组内百分比.
在TABLES语句中,两个变量用星号连接.
例:procfreqdata=samp.
class;tablesage*sex;run;列联表的结果可以输出为每个组合一行的数据集,如procfreqdata=samp.
classNOPRINT;tablessex*age/OUT=crosstab;run;procprint;run;3.
6描述统计217表格数据例例:出租车费面值与该面值张数.
datasasuser.
taxif;inputamountnum@@;cards;104126131151161195203231241251263271321471482491521551581811;run;INPUT语句结尾处的两个@表示允许在同一行读取不同观测.
FREQ语句例分析车费情况:用FREQ指定重复次数.
procmeansdata=sasuser.
taxifmeanstdsumminmax;varamount;freqnum;run;218第三章SAS功能基础3.
7相关系数计算相关系数矩阵CORR过程用来计算变量的相关系数.
相关系数可以反映变量两两之间的线性相关的强弱,又称为Pearson积矩相关系数.
例:计算SASUSER.
GPA中的三个变量HSM,HSS,HSE两两之间的相关系数:proccorrdata=samp.
gpa;varhsmhsshse;run;结果包括:变量基本统计量,两两的相关系数,相关系数等于零的检验的p值.
INSIGHT中也可以计算相关系数.
仅部分相关系数用VAR语句和WITH语句指定两组变量,可以仅在这两组变量之间计算相关系数.
如proccorrdata=samp.
gpa;varhsmhsshse;withsatmsatv;run;在PROCCORR语句中用OUTP=选项把Pearson相关系数结果输出到指定数据集.
3.
7相关系数计算219秩相关系数Pearson积矩相关系数主要适合于联合正态分布情况.
对于严重偏斜或重尾的分布,可以把变量X和Y的观测值分别计算秩(名次)统计量,然后计算秩之间的Pearson积矩相关系数,结果称为Spearman秩相关系数.
计算秩时相同秩取平均值.
使用PROCCORR的SPEARMAN选项计算Spearman秩相关系数.
如proccorrdata=samp.
gpaspearman;varsatmsatv;withgpa;run;在PROCCORR语句中用OUTS=选项把Spearman相关系数结果输出到指定数据集.
220第三章SAS功能基础3.
8用SAS/GRAPH绘图用SAS/GRAPH绘图SAS/GRAPH是SAS的绘图模块,可以作:–散点图、曲线图;–直方图、扇面图;–三维曲面图、等高线图;–地图;–等等3.
8.
1散点图和曲线图散点图用GPLOT过程绘制散点图和曲线图.
例如,绘制SASUSER.
GPA中SATV对SASM的散点图:procgplotdata=sasuser.
gpa;symboli=nonev=star;plotsatv*satm;run;PLOT语句指定纵坐标和横坐标变量,形式为"y*x";SYMBOL语句指定散点或曲线的绘制方式.
可以有多个SYMBOL语句,如SYMBOL2,SYMBOL3等.
结果在GRAPHICS窗口中.
曲线图绘制连线只要在SYMBOL语句中指定I=JOIN.
例如,对SASUSER.
AIR数据集中以DATETIME为横轴、以CO为纵轴绘曲线图:3.
8用SAS/GRAPH绘图221procgplotdata=sasuser.
air;symboli=joinv=star;plotco*datetime;run;SYMBOL中I=指定连接散点的方式,V=指定散点符号.
V=NONE表示取消散点.
图形选项SYMBOL语句与TITLE,OPTIONS等语句一样,是全局语句,其作用会持续到后续的绘图过程.
为了重置所有的图形选项,用goptionsreset=global;GOPTIONS语句是一个全局语句,用来指定共同的图形选项.
叠加的曲线可以在一个坐标平面作多条曲线的图形.
只要在PLOT语句中指定多个因变量(自变量一般应为同一个),并使用OVERLAY选项,如:procgplotdata=sasuser.
air;symbol1color=blacki=joinv=noneline=1;symbol2color=bluei=joinv=noneline=2;plotco*datetime=1so2*datetime=2/overlay;run;用了两个SYMBOL语句分别规定两条曲线的画法;用"y*x=n"的形式选择对应的SYMBOL语句.
222第三章SAS功能基础SYMBOL语句的连线选项I=JOIN直接连线;I=SPLINE连接样条插值曲线;I=SMnn连接样条平滑曲线;I=NEEDLE绘制每个点到横轴的垂线;I=RL绘制线性回归直线,I=RQ为二次曲线,I=RC为三次曲线;I=RLCLI95在回归直线之外绘制预测值的95%置信限曲线.
3.
8.
2直方图和扇形图直方图用GCHART过程绘制直方图、扇面图(饼图)、三维直方图等表示变量分布的图形.
例如,要绘制SASUSER.
GPA中GPA的分布直方图,只要用:procgchartdata=sasuser.
gpa;vbargpa;run;把VBAR改成HBAR则条形方向变为横向;可以用VBAR3D或HBAR3D作出立体效果的直方图.
横轴标的是区间的中点值.
VBAR语句的TYPE=选项指定纵轴代表的值.
横轴是分类变量或区间变量的分组区间,纵轴的TYPE=可以取FREQ(该类取值次数)、PERCENT(百分比)、CFREQ(累计次数)、CPERCENT(累计百分比).
还可以加一个SUMVAR=选项,对每类中另一个变量表示总和或平均值,这时TYPE=取SUM或MEAN.
例如,下面的例子绘制男女生两个条形,条形长度代表SATM分数的平均值:3.
8用SAS/GRAPH绘图223procgchartdata=sasuser.
gpa;vbarsex/type=meansumvar=satm;run;直方图(续)还可以用Univariate过程作直方图,如:procunivariatedata=Sasuser.
gpanoprint;vargpa;histogram;run;分组的直方图VBAR语句的GROUP=选项按分类变量做并排直方图.
例如,按性别分组绘制GPA的两个直方图并排放置:procgchartdata=sasuser.
gpa;vbargpa/group=sex;run;分段的直方图SUBGROUP=选项做分段直方图.
例如,按性别分段绘制GPA的直方图:procgchartdata=sasuser.
gpa;vbargpa/subgroup=sex;run;224第三章SAS功能基础扇形图在GCHART中用PIE语句绘制表示频数的扇形图,例如:procgchartdata=sasuser.
gpa;piesex;run;可以用PIE3D作出立体效果的扇形图.
如果想显示百分比值,只要在PIE语句中加入TYPE=PERCENT选项,如"piesex/type=percent;".
盒形图盒形图使用BOXPLOT过程,需要一个分组变量,如:datanew;setsasuser.
gpa;g=1;procboxplotdata=new;plotgpa*g;run;procsortdata=new;bysex;procboxplotdata=new;plotgpa*sex;run;三维曲面图假设对一个二元函数z=f(x,y),我们有了x取等间隔值、y取等间隔值时z的值,这时我们可以用G3D过程绘制曲面图形,用GCONTOUR绘制曲面的等高线图.
3.
8用SAS/GRAPH绘图225例如,假设(X,Y)服从联合正态分布,其均值都是0,方差分别为1和a,相关系数为r.
则(X,Y)的联合密度函数f(x,y)=12π√a(1r2)exp(12a(1r2)(ax2+y22r√axy))二维曲面例:数据datadnorm2;a=2;a2=sqrt(a);r=0.
5;det=a*(1-r*r);dox=-3to3by0.
3;doy=-3*a2to3*a2by0.
3*a2;z=1/(2*3.
1415926*sqrt(det))*exp(-0.
5/det*(a*x*x+y*y-2*r*a2*x*y));output;end;end;keepxyz;run;二维曲面:作曲面图和等值线图用G3D过程来绘制曲面图:procg3ddata=dnorm2;plotx*y=z;run;用GCONTOUR过程可以绘制等值线图:procgcontourdata=dnorm2;plotx*y=z/nolegendautolabel;run;226第三章SAS功能基础在INSIGHT中画旋转图时在Output选项中选中Fitsurface可以作曲面图;用"Analyze-ContourPlot(ZYX)"菜单可以作等值线图.
旋转和倾斜用G3D过程绘制曲面图时,在PLOT语句中用ROTATE=指定旋转度数,用TILT=指定倾斜度数.
如datahat;dox=-5to5by0.
25;doy=-5to5by0.
25;z=sin(sqrt(x*x+y*y));output;end;end;run;procg3ddata=hat;ploty*x=z/rotate=45tilt=15;run;quit;三维散点图在G3D过程中用SCATTER语句绘制三维散点图.
如procg3ddata=samp.
iris;scatterpetallen*petalwid=sepallen;run;可以在SCATTER语句中用COLOR=和SHAPE=选项指定区分不同绘点颜色、符号的变量.
3.
8用SAS/GRAPH绘图2273.
8.
3图形的调整与输出图形中的汉字各绘图过程中都指定了丰富的选项来调整图形.
在图形中也可以用TITLE语句和FOOTNOTE语句给图形加标题和脚注.
在GOPTIONS语句中指定了汉字字体后可以在图形中使用汉字,如:goptionsftext="宋体"htitle=2cellshtext=1cells;procgplotdata=sasuser.
class;title"试验SAS图形的汉字功能";symboli=nonev=square;plotweight*height;labelweight="体重"height="身高";run;图形的保存和打印在图形窗口,选"File–Export"菜单,在出现的输入文件名的窗口选择适当的文件类型,如BMP、WMF、JPEG、PS,等等,可以把图形保存为图形文件.
在图形窗口,选"File–Print"可以打印图形.
228第三章SAS功能基础3.
9分析员模块介绍分析员模块介绍Analyst也是用图形界面调用SAS功能的一个模块;它基于正常的SAS程序,界面自动生成要用的SAS程序,可以查看所用的SAS程序,作为学习参考;可以管理数据、进行描述统计、作图、假设检验、回归分析、方差分析、多元分析.
从主菜单"Solutions–Analysis–Analyst"可以进入Analyst系统.
窗口分左右两部分,项目管理和数据窗口.
结果显示在单独的窗口.
3.
9.
1数据管理数据管理—编辑菜单"File–OpenbySASName"打开数据集,以SASUSER.
CLASS为例.
如需修改数据要选"Edit–Mode–Edit"菜单.
修改后需要另存才真的修改数据集.
行或列上有右键菜单提供编辑功能.
右键菜单功能包括:–Add或Insert—添加行或列;–Duplicate—复制行或列;–Delete—删除行或列;–Move—移动列的排列次序;–Hide—隐藏某列不显示;–Hold—指定到本列为止的列在左右翻看时不动;–Sort—按变量值排序;–Labels—切换显示变量标签;–Properties—查看变量属性.
3.
9分析员模块介绍229数据筛选Analyst的Data菜单提供了对数据的一些操作.
"Data—Filter—SubsetData":用Where表达式选择满足条件的行子集;需要另存才能把筛选结果保存下来.
数据变换Compute—计算新变量;Rank—计算秩统计量;Standardize—标准化变量;RecodeValues—变量离散值重新编码;RecodeRanges—连续性变量离散化;ChangeType—改变类型(数值型和字符型转换);可以从自动生成的程序中学习.
随机数生成"Data–RandomVariates"菜单可以生成一列随机数.
分类汇总"SummarizeByGroup"数据汇总功能.
以TOTALS数据集为例.
计算按照分公司(SITE)和部门(DEPT)分类的总销售额,用"Data–SummarizeByGroup".
汇总结果可以保存为数据集.
230第三章SAS功能基础横向合并"Data–CombineTables–MergeByColumns"相当于数据步MERGE和BY语句配合进行横向合并.
例:合并C9501X和C9501Y.
以NAME作为"MERGEBY"变量.
可以从"Combinetablewillkeep"选择:–Matchesonly指两个数据集都出现同一个名字才保留合并的行;–MatchestoTable1指只要在第一个数据集中出现的名字就予以保留;–Allrows指两个数据集中出现的名字不管能否匹配都要保留(这是数据步中MERGE语句的缺省操作).
查看对应的程序.
纵向合并"Data–CombineTables–ConcatenateByRows"作纵向合并.
可以选择:–Append是直接上下合并,这是SET的缺省操作;–Interleave(交错)是合并时按照某个变量的值合并,该变量值相同的观测相邻放置,确保最后得到的数据集按此变量排序.
行列转置"Data–StackColumns"菜单堆把若干列合并到一列.
比如把3.
5节的TWOCOL中的TEST1和TEST2合并到一列VAL.
"Data–SplitColumns"把一列拆分为若干列,比如把3.
5节的ONECOL中的VAL拆分为两列.
"Data–Transpose"对数据集进行转置,比如3.
5节的MAT数据集.
随机抽样"Data–RandomSample"菜单对数据集的观测进行随机抽样.
可以看成是从一个有限总体做无放回抽样.
可以指定要抽取的样本量(Rows)或百分比(Ratio).
3.
9分析员模块介绍2313.
9.
2报表报表—列表相当于PRINT过程.
选"Reports–ListData"菜单.
可设置ID变量;标题(Titles按钮);选项(Options按钮);总计(Options界面的SUM页).
报表—汇总表相当于TABULATE过程.
可以制作五种常见汇总表,简单易用.
选"Reports–Tables"菜单.
如:GPA数据集分男女计算SATM和SATV的平均值、标准差、中位数.
3.
9.
3描述统计描述统计"Statistics–Descriptive"菜单可以计算描述统计量.
"SummaryStatistics"相当于MEANS过程.
可指定分析变量(Analysis);用Statistics的选项可以指定要计算的统计量(包括所有的矩统计量);用Plots的选项可以要求绘制变量的盒形图和直方图;用Output的选项可以指定数值输出格式和是否使用变量标签;用Variables的选项可以指定分组变量(ByGroup)、权重变量(Weight)和频数变量(Frequency),用SaveData的选项把统计量写到一个SAS数据集.
"Statistics–Descriptive–Distributions"相当于UNIVARIATE过程,但是在Analyst中又通过编程提供了增强的功能.
先选定分析变量(Analysis);232第三章SAS功能基础用Fit选项可以要求对数据拟合正态、对数正态、指数、威布尔等四种分布.
用Plots可以要求绘制盒形图、直方图、概率图和QQ图等四种图形,如果已经要求了拟合分布则直方图中将叠加拟合的分布密度,概率图和QQ图也是相对于要拟合的分布来画;概率图(ProbabilityPlot)和QQ图基本相同,两者纵坐标都是分析变量由小到大排序后的数值yi,若yi相当于vi经验分位数(可以是修正过的),这时正态QQ图横坐标是标准正态的vi分位数,横坐标的标度也是正态分位数;而正态概率图的横坐标仍用标准正态分位数但是标度却标分位数相应的概率值即vi本身.
相关系数和频数分布"Statistics–Descriptive-Correlations"菜单计算变量的相关系数,相当于CORR过程,这里增强的地方是可以画散点图并在散点图上画置信椭圆.
"Statistics–Descriptive-FrequencyCounts"菜单进行变量分布频数统计,相当于FREQ过程,同时还可以画离散变量的条形图.
3.
9.
4画图画图用Analyst的Graphs菜单可以做图.
"Graphs–BarChart"画条形图.
可以画通常的竖立的条形图,也可以画水平的条形图.
可以把条形画成三维形状.
区间变量的条形图与直方图没有本质区别,但是分类变量只能作条形图不能作直方图.
"Graphs–PieChart"画扇形图,可以画成三维的形状.
"Graphs–Histogram"画直方图.
Analyst的这个菜单有增强的功能.
通过Fit的选项可以要求拟合正态、对数正态、指数、威布尔四种分布并把拟合的分布密度曲线画在直方图上面.
3.
9分析员模块介绍233画图(续)"Graphs–BoxPlot"画盒形图.
设定盒形图的对话框中有一个Display按钮可以选择具体画法,我们通常见的盒形图在这里相当于Style为Schematic.
"Graphs–ProbabilityPlot"画概率图,以数据集中的变量值为纵坐标,以拟合的理论分布的对应分位数为横坐标但横坐标轴标的是概率值.
可以选正态分布、对数正态分布、指数分布、威布尔分布.
"Graphs–ScatterPlot"画二维散点图或三维散点图.
"Graphs–ContourPlot"关于X,Y,Z三个坐标画等值线图.
"Graphs–SurfacePlot"关于X,Y,Z三个坐标画曲面图.
234第三章SAS功能基础3.
10补充3.
10.
1程序纠错SAS编程纠错SAS程序的各种错误会反映在日志(LOG)窗口.
程序错误类型有:–语法错误,如关键字拼写错误,丢失分号,语句或选项错误.
SAS在编译阶段发现语法错误.
–运行错误,如错误的数学运算,使用了BY语句但输入数据集没有正确排序,文件名错误等.
可以导致程序出错终止,也可能只在日志窗口显示错误或注(NOTE)然后继续运行.
–数据错误,为读取数据时不符合要求,比如应该读取数值的时候输入了字符型.
–句法错误,也是一种运行错误,为语句格式正确但使用错误,比如调用函数时自变量个数不匹配,该用字符型变量的地方使用了数值型,调用为定义的库名.
控制程序质量的自检表为控制程序质量,可以进行如下检查:检查语法,特别是:–每个语句以分号结尾;–字符串的两个撇号必须匹配;–大多数SAS语句以关键字开始,不要拼写错;–DO和SELECT语句要以END语句结尾.
检查程序语句的次序.
比如,INFILE语句必须在INPUT语句之前出现.
每个数据步和过程步以RUN语句结尾.
检查INPUT语句和数据.
尤其是数值型和字符型的分别不要错.
选用INPUT语句的自由格式、列格式还是有格式需要与输入数据情况相符.
3.
10补充2353.
10.
2DATASETS过程DATASETS过程DATASETS过程管理数据库中的SAS文件.
可以列出数据库中的所有数据集;删除、重命名、修复数据集;查询和修改数据集以及数据集中的变量的属性;在库之间复制;在数据集末尾附加其他数据集内容;创建和管理密码、索引(indexes)、审核文件(auditles)、一致性约束.
DATASETS过程的部分功能与CONTENTS、APPEND、COPY、CATALOG等过程的功能重叠,有时单独调用这些过程更易用.
列出一个逻辑库中的所有数据集要列出SAMP库中所有数据集详细信息,程序如PROCDATASETSLIBRARY=sampMEMTYPE=DATANOLIST;CONTENTSDATA=_all_DETAILSNODS;RUN;QUIT;结果显示在输出窗口.
程序中PROCDATASETS的LIBRARY=指定要列表的数据库;MEMTYPE=DATA选项要求仅列出数据集;NOLIST选项取消缺省的数据集列表(否则自动有数据集列表到日志窗口).
CONTENTS语句要求列出指定的数据集,DATA=_all_选项指定列出库中所有数据集.
DETAILS选项要求列出观测个数、变量个数等信息,NODS选项说明不列出数据集中的变量信息,否则会列出数据集的变量信息.
还可以使用PROCCONTENTS列出逻辑库中所有数据集.
236第三章SAS功能基础程序如PROCCONTENTSDATA=samp.
_ALL_NODS;RUN;其中NODS选项取消数据集中变量信息的显示.
把逻辑库的数据集列表存入数据集为了把某逻辑库中的数据集列表保存到一个数据集中,可以使用PROCSQL程序查询隐含的逻辑库DICTIONARY中的TABLES表.
程序如PROCSQL;CREATETABLEsampdirASSELECT*FROMDICTIONARY.
TABLESWHERELIBNAME='SAMP';QUIT;列出一个逻辑库中指定数据集的变量要列出SAMP库中CLASS数据集的变量信息,程序如PROCDATASETSLIBRARY=sampMEMTYPE=DATANOLIST;CONTENTSDATA=classOUT=vlist;RUN;QUIT;结果显示在输出窗口,同时用OUT=选项存入了VLIST数据集中.
程序中CONTENTS语句用DATA=选项指定要列出哪个数据集的变量信息,OUT=选项指定输出数据集.
显示变量名信息时缺省按变量名排序而不是按数据集中变量次序排序,可以使用VARNUM选项要求按数据集中变量次序排列.
3.
10补充237用CONTENTS过程查看数据集结构要列出SAMP库中CLASS数据集的变量信息,也可以用CONTENTS过程,程序如PROCCONTENTSdata=samp.
class;RUN;程序中PROCCONTENTS语句用DATA=选项指定要列出哪个数据集的变量信息.
结果显示在输出窗口.
如果还要把变量列表保存为数据集,只要用OUT=选项,如PROCCONTENTSdata=samp.
classOUT=vlist;RUN;变量列表存入了VLIST数据集中.
可以使用VARNUM选项要求显示各变量信息时按数据集中变量次序排列.
数据集改名用CHANGE语句对LIBRARY=指定的逻辑库中的数据集改名,格式为"旧名字=新名字".
程序如PROCDATASETSLIBRARY=sampMEMTYPE=DATANOLIST;CHANGEc9501f=c9501nvc9501m=c9501nan;RUN;QUIT;238第三章SAS功能基础删除数据集用DELETE语句删除数据集或其它SAS文件.
如程序如PROCDATASETSLIBRARY=workNOLIST;DELETEclassgpa;RUN;QUIT;可以在斜杠后用MEMTYPE=指定要删除的类型,如PROCDATASETSLIBRARY=workNOLIST;DELETEc9501v/MEMTYPE=VIEW;RUN;QUIT;可以删除多个数据集,数据集列表可以使用简写,如"test1-test5"表示编号的5个数据集,或"t:"表示所有名字以字母t开头的数据集.
复制逻辑库为了把某个逻辑库全部内容复制到另一个逻辑库,使用COPY语句,其中用OUT=指定目的地,IN=指定来源.
如PROCDATASETSNOLIST;COPYOUT=WORKIN=SAMP;RUN;QUIT;在COPY语句中可以用MEMTYPE=DATA要求仅复制数据集.
复制数据集为了有选择地复制数据集,在COPY语句之后用SELECT语句选择要复制数据集,或用EXCLUDE语句指定不需复制的数据集.
如3.
10补充239PROCDATASETSNOLIST;COPYOUT=WORKIN=SAMP;SELECTc9501classgpa;RUN;QUIT;在SELECT语句中用数据集选项MEMTYPE=DATA选择数据集,用MEMTYPE=VIEW选择视图,如SELECTgpa(MEMTYPE=DATA);在数据集末尾增添内容用APPEND语句在一个主数据集末尾增加另一个数据集的内容.
APPEND语句中BASE=选项指定主数据集,DATA=选项指定要添加进来的数据集.
如果BASE=或DATA=没有指定库名,则缺省为PROCDATASETS语句中LIBRARY=选项中指定的逻辑库.
如果BASE=指定的数据集不存在,则把用来添加的数据集内容复制生成此数据集.
当主数据集较大时,用APPEND语句添加比使用数据步的SET语句做纵向合并效率更高.
程序如:PROCDATASETSLIBRARY=workMEMTYPE=DATANOLIST;APPENDBASE=c9501fmDATA=samp.
c9501m;APPENDBASE=c9501fmDATA=samp.
c9501f;RUN;QUIT;首先把SAMP.
C9501M内容复制到WORK.
C9501FM中,然后又把SAMP.
C9501F内容添加到WORK.
C9501FM尾部.
DATA=指定的添加数据集可以使用WHERE=数据集选项来选择观测.
240第三章SAS功能基础修改数据集变量属性用MODIFY语句指定要修改的数据集,然后用ATTRIB语句修改变量属性,包括变量标签(LABEL)、变量输出格式(FORMAT)和变量输入格式(INFORMAT).
程序如PROCDATASETSLIBRARY=WORKNOLIST;MODIFYclass;ATTRIBnameLABEL='姓名'weightFORMAT=8.
2;QUIT;PROCPRINTDATA=classlabel;RUN;修改数据集变量名用MODIFY语句指定要修改的数据集,然后用RENAME语句对变量改名,格式为"旧名=新名".
程序如PROCDATASETSLIBRARY=WORKNOLIST;MODIFYclass;RENAMEheight=hweight=w;QUIT;PROCPRINTDATA=class;run;3.
10.
3RANK过程RANK过程RANK过程计算数据集变量的秩(名次).
PROCRANK语句中用DATA=指定输入数据集,用OUT=指定输出数据集.
3.
10补充241用VAR语句指定用来排名次的变量名,用RANKS语句规定用来保存名次(秩)的变量名.
名次缺省为由低到高排列,在PROCRANK语句中加DESCENDING选项可以改为由高到低排列.
同名次时,缺省使用平均名次,比如,第2,3名变量值相同,则名次同取为2.
5.
在PROCRANK语句中用TIES=选项可以规定同名次时的处理方法.
TIES=LOW使用低名次(第2,3名变量值相同时,都算是第2名),TIES=HIGH使用高名次,TIES=MEAN使用平均名次(缺省).
如:PROCRANKDATA=samp.
classOUT=rc;VARage;RANKSagerank;run;下面的程序的年龄名次是由高到低排名,且同名次时取小名次值:PROCRANKDATA=samp.
classOUT=rcDESCENDINGTIES=LOW;VARage;RANKSagerank;run;用BY语句可以分组计算名次.
RANK过程可以计算多种秩统计量,比如名次除以n或n+1后变成[0,1]之间的分数名次,用标准正态分位数变换得到正态得分(normalscore),等等.
3.
10.
4STANDARD过程242第三章SAS功能基础STANDARD过程STANDARD过程对数据集变量进行标准化,使得数据集变量的样本均值变成M,标准差变成S:Yi=M+S·XiXSx其中X和SX是原始变量X的样本均值和样本标准差.
结果保存到OUT=指定的输出数据集,变换后的变量名使用原变量名.
用MEAN=和STD=指定目标M和S.
如:PROCSTANDARDDATA=samp.
classOUT=scMEAN=0STD=1;VARage;run;3.
10.
5FORMAT过程FORMAT过程用PROCFORMAT定义用户自己的输出格式和输入格式.
VALUE语句定义不同值、值范围的输出方式.
PICTURE语句定义数字的特殊输出格式.
INVALUE语句定义输入格式.
还可以把格式保存到数据集、从数据集生成输出格式.
自定义的格式和输入格式也分为数值型和字符型,调用时都要用句点结尾,字符型格式和输入格式名以$符号开头.
定义时不需要句点.
如果输出格式用于数值型变量,则输出格式是数值型的.
如果输出格式用于字符型变量,则输出格式是字符型的.
3.
10补充243如果输入格式转换后的结果是数值型的,此输入格式称为数值型输入格式.
如果输入格式转换后的结果是字符型的,此输入格式称为字符型输入格式.
一一变换的输出格式下例中定义了数值型型输出格式sexotf.
,把1显示成'男',把2显示成'女':procformat;VALUEsexotf1='男'2='女';run;datasexd;inputsex;formatsexsexotf.
;cards;12;run;procprint;run;下例中定义了字符型输出格式"$sexf.
",把'F'转换为'女',把'M'转换为'男':procformat;VALUE$sexf'F'='女''M'='男';run;datasexd;inputsex$;formatsex$sexf.
;244第三章SAS功能基础cards;FM;run;procprint;run;一一变换的输入格式下例中定义了字符型输入格式$sexotinf.
,把1转换为'男',把2转换为'女':procformat;INVALUE$sexotinf1='男'2='女';run;datasexd;inputsex:$sexotinf.
@@;cards;12;run;procprint;run;下例中定义了数值型输入格式"sexinf.
",把'男'转换为1,把'女'转换为2:procformat;INVALUEsexinf'男'=1'女'=2;run;datasexd;inputsex:sexinf.
@@;3.
10补充245cards;男女;run;procprint;run;输入范围的转换输入格式可以把一个范围的输入转换为一个值.
如procformat;INVALUEtrial'A'-'M'=1'N'-'Z'=21-999,1001-1999,2001-2999=39999=.
other=_error_;run;OTHER表示所有其他输入.
等号右边_ERROR_表示该类输入作为错误数据.
等号右边的_SAME_表示该类输入保持原样不变.
值范围的写法值范围写成"开始值-结束值".
可以用LOW表示最小值,用HIGH表示最大值.
用"aλ},其中λ为t(n1)分布的双侧α分位数.
p值设t统计量值为a,则|a|>λ时否定H0,且|a|越大说明零假设H0越不可能成立.
令p=Pr(|t(n1)|>|a|)则|a|>λ当且仅当p0,则否定域为W′={t>λ′},λ′为t(n1)分布的上侧α分位数;这时p值的定义为p=Pr(t(n1)>a),当且仅当pλ′.
注意:a|Z|=0.
5978,没有显著差异.
Kruskal-Wallis,不用.
如果考虑单侧检验,对立假设为男生分数高于女生分数,p值为双侧p值的一半One-SidedPr>Z=0.
2989,不显著.
在Analyst中用"Statistics–ANOVA–NonparametricOne-WayANOVA"进行Wilcoxon秩和检验.
4.
1.
4成对总体均值检验成对总体均值检验成对总体均值检验用于比较同一总体两个指标的比较.
如:为了研究某种刺激对血压的影响,随机抽取若干人后,在刺激前测量血压SBPbefore,施加刺激后再次测量血压SBPafter,这两次测量不是独立的,不能使用独立两样本t检验.
用TTEST过程的PAIRED语句检验.
成对均值检验例试图比较施加刺激前后的血压有无显著差异.
title'PairedComparison';datapressure;inputSBPbeforeSBPafter@@;datalines;120128124131130131118127140132128125140141135137126118130132126129127135268第四章SAS的基本统计分析功能;run;procttestdata=pressuer;pairedSBPbefore*SBPafter;run;结果给出了前后血压差值的基本统计量、置信区间以及成对检验结果.
农历春节将至,腾讯云开启了热门爆款云产品首单特惠秒杀活动,上海/北京/广州1核2G云服务器首年仅38元起,上架了新的首单优惠活动,每天三场秒杀,长期有效,其中轻量应用服务器2G内存5M带宽仅需年费38元起,其他产品比如CDN流量包、短信包、MySQL、直播流量包、标准存储等等产品也参与活动,腾讯云官网已注册且完成实名认证的国内站用户均可参与。活动页面:https://cloud.tencent.c...
如何低价香港服务器购买?想要做一个个人博客,想用香港服务器,避免繁琐备案,性能不需要多高,只是记录一些日常而已,也没啥视频之类的东西,想问问各位大佬有没有低价的香港服务器推荐?香港距大陆近,相比美国服务器最大的优势在于延迟低,ping值低,但是带宽紧张,普遍都是1M,一般戏称其为“毛细血管”。同时价格普遍高,优质稳定的一般价格不菲。大厂云梯队阿里云、腾讯云两家都有香港服务器,要注意的是尽量不要选择...
3C云互联怎么样?3C云互联专注免备案香港美国日本韩国台湾云主机vps服务器,美国高防CN2GIA,香港CN2GIA,顶级线路优化,高端品质售后无忧!致力于对互联网云计算科技深入研发与运营的极客共同搭建而成,将云计算与网络核心技术转化为最稳定,安全,高速以及极具性价比的云服务器等产品提供给用户!专注为个人开发者用户,中小型,大型企业用户提供一站式核心网络云端服务部署,促使用户云端部署化简为零,轻松...