SAS统计分析教程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 SAS用法简介

1.2.1 初学者学习SAS的快捷方式

在1.1节中,在介绍SAS程序结构和常用SAS语句时已顺便介绍了如何用编程法使用SAS。由此可见,使用SAS并不是一件非常困难的事。难就难在SAS语言(包括SAS语句、SAS函数、SAS过程、SAS高级编程技术)内容很多,需要花很多时间去学习和实践。

笔者给初学者提供一种学习SAS快速入门的方法,即调用他人编制好的SAS程序,只要解决了“对号入座”问题(即每个程序是干什么的),用自己的数据替换掉已有的SAS程序中的数据,将程序发送给SAS系统去执行,就可获得自己所需要的计算结果。每次结合他人的SAS程序和程序语句的讲解,一次学一点,不需多长时间,自己就慢慢掌握了很多常用的SAS语言,也就是说,边学边解决实际问题,不仅不会望而生畏,而且见效很快。

当数据少时,直接将数据写在程序中即可。但是,当数据量很大时,这样做就不够方便了,尤其遇到第3方格式数据时,SAS是不能直接读取的。如何用SAS进行实验设计、进行资料表达等内容,虽然很简单,但却是必须了解的内容。下面就这些基本内容做一扼要介绍。

1.2.2 实际运行SAS

什么叫实际运行SAS?若拟采用非编程法运行SAS,只需根据SAS说明书中所交代的步骤去“选择菜单(参见本书配套光盘中相应内容)”就能获得所需要的结果,这是第1种实际运行SAS的方法。第2种实际运行SAS的方法为:在SAS程序编辑器中输入一段正确的SAS程序,如将本章1.1节介绍的SAS程序发送给SAS系统执行,就称为实际运行SAS,会产生如下的输出结果:

这是对输入的原始数据的详细描述,每个格内第1行为观察的频数;第2行为百分比,即以每个格上的频数为分子,以总频数为分母计算得到的相对数;第3行为行百分比;第4行为列百分比。

这是用4种方法分析四格表资料所得到的结果,第1种为一般χ2检验,χ2=1.7174,P=0.1900;第2种为似然比χ2检验,χ2=1.7497,P=0.1859;其他从略。

最后3行为度量列联表中行变量与列变量间关联性强弱的系数,其绝对值越接近于1,表明关联越密切。因未对其进行假设检验,故无太大参考价值。

以上是采用Fisher精确法分析四格表资料所得到的结果。

统计和专业结论:因χ2=1.7174,P=0.1900,故说明2个工厂该产品的次品率之间的差别无统计学意义。虽然乙厂的次品数是甲厂次品数的2倍,但2个次品率(即P=5/254=1.97%与P=10/254=3.94%)之间的差别无统计学意义。说明2个工厂此种零件的次品率接近相等,即质量水平相当。

1.2.3 从实验设计角度谈SAS用法

与实验设计有关的内容可大致分为3类:一是进行随机化(SAS中有PLAN过程等);二是估计样本含量和检验效能(SAS中有POWER过程和GLMPOWER过程等);三是给出实验设计方案(具体地说,就是与特定设计类型对应的可用于安排实验的设计表格,SAS中有多个过程可用于此目的)。以上内容都可以通过非编程法和编程法来实现,具体做法参见本书有关章节和配套光盘。

1.2.4 从资料录入角度谈SAS用法

1.按数据库格式录入统计资料

人们收集的科研资料往往错综复杂,但绝大部分统计资料都可表达成表1-1的形式,它常被称为“数据库格式”的复合型统计资料。这种呈现资料的方式把每个变量在每个个体身上的具体取值都清楚地展示出来了,可以说是比较准确的原始资料。可以根据研究者提出的不同分析目的,从中提取不同的变量或观测进行特定的统计表达与描述和统计分析。

表1-1 冠心病人与正常人多项指标的观测结果

【例1-2】有人对103例冠心病患者(G=1)和100例正常对照者(G=2)进行了多项指标的观测,资料如表1-1所示。请问:如何在SAS系统中录入这些资料,以便于采用SAS软件对数据进行各种统计表达与描述或进行各种统计分析?

【分析与解答】若这些数据是写在纸上的,只能在SAS软件的编辑窗口内一行一行地输入数据。每行代表一位受试者的全部信息(在SAS中,称其为一个观测),通常,同一行上的数据之间用空格符隔开;每一列代表一个变量在不同受试者身上的具体取值,变量的含义很广,它可以代表第1列的序号、可以代表第2列的组别,…,可以代表最后一列的合并用药情况。变量代表的内容可以是辅助信息,可以是分组标志或影响因素,可以是定量或定性的观测结果。

(1)若在SAS程序编辑窗口内输入的仅仅是数据(包括字符型数据),将其以文本格式存入外部媒介(硬盘、优盘或软盘)上,就称为“数据文件”。这种格式的数据文件可以在SAS窗口编写SAS程序实现调用,调用的关键SAS语句是INFILE语句和INPUT语句。

例如,在SAS程序编辑窗口中输入例1-1的数据,形式如下:

        1    1    5
        1    2   249
        2    1   10
        2    2   244

说明:第1列代表工厂编号,“1”代表甲厂、“2”代表乙厂;第2列代表产品检查结果,“1”代表次品、“2”代表正品;第3列代表各条件下的样品数。按下面的方法可将此数据存储在D盘SASTJFX文件夹内,形成数据文件,假定数据文件名为PRODUCT.DAT。

在SAS程序编辑窗口左上角:文件(FILE)→Save As(另存为)→在弹出的“另存为”窗口内左上角寻找并确定路径:D/SASTJFX→在此窗口下方倒数第2行的文件名命令盒内输入数据文件名:PRODUCT→在此窗口倒数第1行的文件类型命令盒中选择“.DAT”作为文件的扩展名→单击“保存(或确定)”按钮。

如何将数据文件读入程序编辑窗口,进行四格表资料的各种统计分析呢?在SASTJFX1_1.SAS程序中,只需将数据修改成如下的形式,而过程步不需改动:

        DATA rate;
            INFILE 'D:\SASTJFX\product.dat';  INPUT a  b  f;
        ODS HTML;
        PROC FREQ DATA=rate; WEIGHT f; TABLES a*b / CHISQ; RUN;
        ODS HTML CLOSE;

将这段SAS程序发送给SAS系统执行,可达到同样的效果。这种使用SAS的方法适合数据量很大的场合。

(2)若在SAS程序编辑窗口内输入数据时,第1行输入了变量名,从第2行开始是变量的具体取值,也将其存成数据文件,这是错误的数据文件,不能用前述的方法被SAS系统直接调用,只能在日后给用户提个醒,每列数据的变量名是什么,若变量名写得比较科学,其含义一看便知,则对理解这些数据能起到“备忘录”的作用,否则,没有任何价值!

(3)若从SAS窗口通过“工具→表编辑器”方式进入表编辑器窗口,在此窗口内直接输入数据,窗口第1行带有变量名(用户可修改变量名),然后,将数据存入外部设备或计算机缓存区,就成为能被SAS系统直接调用的SAS数据集了。存入SAS系统自动创建的逻辑库WORK中的数据集称为临时SAS数据集,存入其他位置的SAS数据集称为永久SAS数据集。

2.按实验设计类型录入统计资料

人们收集完数据后,有时,习惯将它们分类整理成一张统计表,统计表的分组标志通常是定性变量,而结果变量通常是定量的。对于这样的数据,当属于单因素设计定量资料时,常需进行t检验、单因素设计定量资料的方差分析或秩和检验;当属于某种多因素设计定量资料时,常需进行相应设计定量资料的方差分析。请看下面的例子。

【例1-3】某实验同时涉及A、B、C 3个地位平等的实验因素,A分为2个水平、B分为3个水平、C分为4个水平,观测指标为OD值,受试对象为样品,在不同实验条件下均独立地重复做了2个样品,资料如表1-2所示。请在SAS编辑窗口输入此表中的主要变量和相应的数据,以便能进行相应设计定量资料的方差分析。

表1-2 3个实验因素作用下OD值的测定结果

【分析与解答】如果采取上例的方法输入数据,需要在每个定量数据前输入4个变量的水平代码。例如,对于第一个数据0.39,应当输入如下信息:1 1 1 1 0.39,这4个1分别代表因素A、B、C和重复实验次序都取1水平;同理,对于第2个数据0.41,应当输入如下信息:1 1 1 2 0.41,…,对于最后一个数据0.37,应当输入如下信息:2 3 4 2 0.37,这4个数分别代表因素A取2水平、因素B取3水平、因素C取4水平,而重复实验次序为第2次。显然,这样做太麻烦了,而且,很容易出错。简便的做法是,用SAS语言中的DO-END循环语句来自动产生因素A、B、C和重复实验次序的水平,其数据步如下,设SAS程序名为SASTJFX1_3.SAS。

        data doxunhuan;
          do A=1 to 2; do B=1 to 3; do C=1 to 4; do cixu=1 to 2;
              input OD @@; output;
          end; end; end; end;
        cards;
        0.39 0.41 0.37 0.39 0.42 0.38 0.44 0.41
        0.37 0.36 0.43 0.45 0.41 0.37 0.42 0.39
        0.45 0.43 0.46 0.39 0.38 0.35 0.39 0.37
        0.36 0.41 0.45 0.36 0.41 0.45 0.41 0.46
        0.42 0.37 0.38 0.41 0.38 0.36 0.43 0.38
        0.37 0.43 0.36 0.39 0.43 0.42 0.35 0.37
        ;
        run;

程序说明:最外层的DO-END循环控制表中横向上水平变化最慢的变量(因素A),第2层DO-END循环控制表中横向上水平变化较快的变量(因素B),这两个变量已将全部6行打上A与B的水平标记,即前3行A均标记为1、后3行A均标记为2;而B的标记从上到下分别为1、2、3、1、2、3。每行有8个数据,先按因素C分为4组,其标记分别为1、2、3、4,每组内再按次序(cixu)分为标记1、2。其效果是所形成的SAS数据集中的排列顺序与前面用“笨方法”产生的结果一致,即(因篇幅太大,中间部分省略了):

3.按列联表类型录入统计资料

与前面的定量资料类似,人们在表达多因素影响下的定性资料时,习惯上将数据整理成列联表的形式,特别是高维列联表资料,很少用“数据库”的形式呈现资料,见下面的例子。

【例1-4】某临床医生收集到如表1-3所示的资料,请在SAS编辑窗口输入此表中的主要变量和相应的数据,以便能进行相应设计定性资料的统计分析。

表1-3 甲、乙两种治疗方法对不同病程和不同病情的患者的治疗效果

注:这个例子是假设的

【分析与解答】与前例相同,输入数据的方法也有两种:第1种是在每个频数前需要提供4个变量的标记,它们分别是治疗方法(treatment)、病程(time)、病情(degree)、疗效(effect)。这是很麻烦的事!用DO-END循环语句就可方便地实现上述目标,其SAS数据步如下,设SAS程序名为SASTJFX1_4.SAS。

        data doxunhuan;
            do treatment='JIA','YI'; do time='short','long';
                  do degree='light','weight';
                      do effect='zhiyu','xianxiao','haozhuan','wuxiao';
                        input number @@; output;
            end; end; end; end;
        cards;
        50 46 37 12
        42 35 32 23
        37 30 28 14
        31 24 25 38
        45 49 44 16
        38 43 39 22
        29 38 34 19
        22 33 30 28
        ;
        run;

程序说明:最外层的DO-END循环控制表中横向上水平变化最慢的变量(治疗方法treatment),第2层DO-END循环控制表中横向上水平变化较快的变量(病程time),第3层DO-END循环控制表中横向上水平变化最快的变量(病情degree),这3个变量已将全部8行打上treatment(治疗方法)、time(病程)、degree(病情)的水平标记,即前4行treatment均标记为JIA(甲),后4行treatment均标记为YI(乙);time的标记从上到下分别为short(短)、short(短)、long(长)、long(长)、short(短)、short(短)、long(长)、long(长);而degree的标记从上到下依次是light(轻)、weight(重)交替出现;每行上的4列是effect(疗效)的水平标记,依次是zhiyu(治愈)、xianxiao(显效)、haozhuan(好转)、wuxiao(无效),INPUT语句中的number读取各行上的频数。形成的SAS数据集的样式与前例相似,此处从略。

1.2.5 从不同格式数据转换角度谈SAS用法

1.由非统计软件创建的数据文件与SAS数据集之间的互相转换

若待分析的数据已采用某些第3方非统计软件(如Excel软件等)创建了不同格式的数据文件,其中有些可用SAS系统提供的导入数据接口方便地转换为SAS数据集(利用导出数据接口可以实现相反的操作)。请看下面的例子。

【例1-5】设有一个用Excel软件创建的数据文件zhanghongleidata1.xls,该文件中有2列数据,第1列变量名为A,第2列变量为B,A、B的具体取值分别是计算机导航辅助方法与CT方法测定每一位骨病患者置入颈椎椎弓根螺钉的相对角度的数据。共有140对数据,假定它们测自140位患者,试将其转换为SAS数据集。

【分析与解答】假定用Excel软件创建的数据文件zhanghongleidata1.xls存放在D:\SASTJFX内,则通过如下步骤,可将其转换为临时SAS数据集。

(1)进入SAS系统→文件→导入数据→在窗口右边弹出一个含有命令盒的窗口。

在命令盒中显示可导入的数据文件类型为:97、2000或2002年版的Excel软件产生的数据文件,用户可通过此命令盒最右边的三角调整拟导入的数据文件的格式。

(2)单击窗口下边的“Next”按钮→弹出一个小窗口,要求通过浏览方式确定拟导入的Excel文件的路径和文件名→选中D:\SASTJFX\zhanghongleidata1.xls→单击“OK”按钮。

(3)系统询问要导入的Excel文件是表几(自动显示表1,即sheet1$。若不是表1,可重新选择)→单击“Next”按钮。

(4)弹出一个新窗口,有两个命令盒,上行为逻辑库名(自动显示临时库名WORK,也可改变),下行为拟创建的数据集名→输入dao_hang_and_CT_data→单击“Finish”按钮。

(5)在窗口左边逻辑库中WORK库内就有刚创建的SAS数据集。

(6)用鼠标左键双击此数据集,可显示此数据集的内容。

将Excel文件显示的界面与已转换后得到的SAS数据集做一个直观比较。

不难发现:变量名被SAS系统修改了,A、B分别被改为F1和F2;Excel文件中的第一行数据被SAS系统“吃掉了”!造成这种不良后果的主要原因是在将Excel文件转换成SAS数据集的最后一步未取消系统中一个隐含的“设置”,在上面导入数据的第2步之后,会弹出一个窗口。其内的命令盒里有“Sheet1$”。在“Sheet1$”之下有一个“Options”按钮,单击此按钮会弹出另一个窗口。

在此窗口上的第1行处于被选中的状态,即使用Excel文件中的第1行作为SAS数据集中的变量名。若用户在Excel文件中第1行输入的是数据不是变量名,则应将第1行中复选框内的“√”去掉。去掉后单击右边的“OK”按钮,接下来的操作步骤与上面的第(4)步到第(6)步相同,可获得正确的转换结果。

本例还可以通过在SAS编程窗口运行下面的一段SAS程序,实现将Excel文件转成SAS数据集的目的。设程序名为SASTJFX1_5.SAS。

        PROC IMPORT OUT=WORK.ZHANGHONGLEI DBMS=EXCEL REPLACE
                  DATAFILE="D:\SASTJFX\zhanghongleidata1.xls";
            SHEET="Sheet1$";  GETNAMES=YES;  RUN;

值得注意的是,本例Excel文件中第1行不是变量名而是数据,所以上面程序中倒数第2句应改为“GETNAMES=NO”;若要转换的数据在Excel文件的第3张表单中,则上面的程序倒数第3句应改为“SHEET="Sheet3$"”。若转换成功,则新产生的临时SAS数据集ZHANGHONGLEI存放在SAS/WORK库中,可通过SAS资源管理器找到此库,双击此库中的SAS数据集名,便可将其打开,也可在编程窗口直接调用这个临时SAS数据集。

2.用SAS系统读入其他版本或分析软件创建的数据集

若待分析的数据已采用第3方统计软件(如SPSS、BMDP等统计软件包)创建了不同格式的数据集,则需要通过使用libname语句和在SAS中内置的转换程序(称为读取特定格式数据的库引擎)将特定的数据文件转换为SAS数据集。这种方式使用起来不很方便,下面介绍如何利用SPSS软件提供的文件存储功能将SPSS数据集转换成SAS数据集。

如果用户正在使用的计算机上正确地安装了SPSS软件,直接用鼠标左键双击SPSS数据文件进入SPSS系统并打开该文件,选择“另存为”,在弹出的存储文件的窗口内选择合适的“保存类型”并输入拟创建的SAS数据集名,确定后,就得到转换后的SAS数据集。

1.2.6 从资料表达角度谈SAS用法

SAS中有些过程给出的结果并不太理想,如用FREQ过程生成定量资料的频数分布表,只要两个数据不完全相等,就形成两个分组标志,这样形成的频数分布表很长,显得过细,没有实用价值。实际上,可以在使用FREQ过程的基础上配合使用FORMAT过程,生成比较有实用价值的频数分布表;还可按用户的需要去选定第一组的组段下限、组距、组数等要求,利用丰富的SAS语言编程,产生用户自己量身订制的频数分布表。

1.2.7 从统计分析角度谈SAS用法

若用户需要进行的统计分析在SAS软件中已有相应的过程(例如,对于单因素两水平设计定量资料t检验,有TTEST过程;对于两因素析因设计定量资料一元方差分析,有ANOVA过程和GLM过程等;对于列联表资料的分析,有FREQ过程和CATMOD过程等),直接调用SAS过程实现统计分析就比较简单了。然而,对于某些计算问题,SAS中尚无现成的SAS过程,此时,可以利用SAS语言并按已知的计算公式或算法编写SAS程序,从而实现统计分析。

总之,要想利用SAS解决自己的各种问题,除了要会调用SAS中的全部过程外,还应该全面掌握SAS语言。运用SAS语言,可以编写出当前已有但SAS过程解决得不满意的问题或尚解决不了的一些问题。如果用户使用某种其他编程语言(如C语言、C++语言或Java语言),需要写大量的代码来设置环境、构造窗口等;而用SAS语言,只需把精力放在要解决的具体问题上,编程工作量就小多了。此时,用户不难体会到,SAS的用途的确很广。