【SAS Says】基础篇:描述性分析(下)

2018-03-28 16:21:32 浏览数 (1)

好吧,这一节是留给处女座的,主要说如何用proc tabulate和proc report产生一个更加耐看的报告。有时候print、means和freq产生的报告形式太过于单一,我们可以用tabulate和report精雕细琢一下。

4.11 用proc freq为数据计数

4.12 用proc tabulate产生一个表格报告

4.13 为proc tabulate增加一个输出统计量

4.14 提升proc tabulate的输出外观

4.15 在proc tabulate输出的顶部

4.16 为proc tabulate的输出的数据方格指定多种格式

4.17 用proc report产生一个简单的输出

4.18 在proc report中使用define语句

4.19 用proc report创建建议报告

4.20 给proc report输出增加

4.21 为proc report输出增加统计量


描述性分析(下)

4.11 用proc freq为数据计数

对一个变量计算频数叫做one-way,两个叫做two-way,多个叫做交叉表。使用proc freq最明显的目的是现实分类数据的分布情况,基本形式为:

PROC FREQ;

TABLES variable-combinations;

产生一维频率表,只要列出变量名。下面的语句列出了变量YearsEducation的每一个值的个数。

TABLES YearsEducation;

建立两个变量的交叉表需要一个*号,下面的语句显示变量Sex by YearsEducation的频数情况:

TABLES Sex * YearsEducation;

这个语句之后可以用/option的形式添加选项,主要下面几个:

  • LIST:用list形式打印交叉表(而不是网格)
  • MISSING:频率统计量中包含缺失值
  • NOCOL:强制在交叉表中不打印列百分比
  • NOROW:强制在交叉表中不打印行百分比
  • OUT=data-set:输出数据集

比如说,使用第二个选项:

TABLESSex*YearsEducation/MISSING;

例子 有一家咖啡店的销售数据,记录了销售的咖啡种类(cappuccino,espresso,kona,or iced coffee),以及每次购买的顾客是打包还是原地就饮:

下面的代码就产生了一个one-way和two-way的频率表:

代码告诉SAS打印两个表,一个是one-way的频率表,一个是交叉表。交叉表的每个小方格内,SAS打印了频数、百分比、行百分比和列百分比。左边和右边是累积百分比。注意计算频数时没有考虑缺失值。

4.12 用proc tabulate产生一个表格报告

比起print,means,freq,Proc tabulate过程产生的报告更耐看。

Proc tabulate的基本形式为:

PROC TABULATE;

CLASS classification-variable-list;

TABLE page-dimension,row-dimension,column-dimension;

Class语句列出分类变量。

Table语句可以定义一个表,可以用多个table语句定义多个表,

维度 table语句可以在报告中指定三个维度:页、行、列。如果只指定一个维度,则默认是列维度;如果指定两个,则是行和列。

缺失数据 默认下不考虑缺失数据,在proc语句后面增加missing选项可以改变这种默认:

PROC TABULATE MISSING;

例子有关于船的一些数据,Boats.dat,记录了每艘船的姓名、港口、移动方式(sailing或者power vesse)l,类型(schooner,catamaran,or yacht),使用它远行的价格

你想得到一份报告,包含了每一个港口的、sailing或者power vessel的、每一种类型的、船的数量,下面的代码用proc tabulate创建了一个三维报告:港口作为页、移动方式作为行、类型作为列:

报告分两页,及港口的每个值情况为一页:

4.13 为proc tabulate输出增加统计量

Class语句列出分类变量,而VAR语句告诉SAS那些变量装的是连续数据。基本形式为:

PROC TABULATE;

VAR analysis-variable-list;

CLASS classification-variable-list;

TABLE page-dimension,row-dimension,column-dimension;

关键词 下面是tabulate可以计算的值:

  • ALL:增加行、列或页,显示总数
  • Max:最高值
  • Min:最低值
  • Mean:算术均值
  • Median:中位数
  • N:非缺失值个数
  • Nmiss:缺失值数
  • P90:90th分位数
  • Pctn:某类的观测值百分数
  • Pctsum:某类值总和的百分数
  • STDDEV:标准差
  • SUM:求和

Concatenating,crossing,and grouping 维度、变量和关键词可以Concatenating,crossing,andgrouping,Concatenating变量或关键词,只需用空格分开列出即可;cross变量或关键字只需要用*分开列出即可;group变量只需要用括号括住变量或关键词。

Concatenating:

TABLE Locomotion Type ALL;

Crossing:

TABLE MEAN*Price;

Crossing,grouping,and concatenating:

TABLE PCTN*(Locomotion Type);

例子 仍然是船的例子,

下面的代码类似4.12,但多了VAR语句,table只包括两维,但使用了Concatenate,cross,and group:

输出结果如下:

4.14 提升proc tabulate的输出外观

三种方式可以提升输出的外观:

Format=option 可以改变数据的格式,比如,在表中使得数字有逗号,并不含小数,则使用:

PROC TABULATE FORMAT=COMMA10.0;

Box=和misstext=options format只能用在proc语句中,而box=和misstext=只能用在table语句中。box=的作用是在tabulete报告的左上角的空格中写下一句简洁的语句(作用类似标题)。Misstext则是位空数据格指定一个值,默认是一个句号,比如下句:

TABLE Region, MEAN*Sales/BOX='Mean Sales by Region' MISSTEXT='No Sales';

这是告诉SAS在左上角打印“Mean Sales by Region”,并且在没有数据的方格内打印“No Sales”

例子 仍然是船的数:

如下代码比前面多了format、box、misstext语句。注意format要出现在proc语句中,而box和misstext语句则出现在table语句中。

这是“被提升了的”外观,由于format指定dollar9.2,因此都用货币格式输出。左上角的full day excursions是由于box语句,空方格内的none是由于misstext语句。

4.15 在proc tabulate输出的顶部

有两种方法可以改变顶部信息

Class 变量变量值 要改变class语句列出的变量值的顶部,使用format创建一个用户定义的格式,然后用format语句将格式赋给变量。

变量名和关键字 改变变量名和关键字的顶部,用=’text’赋值即可,可以用等号加空值的方法去除顶部,即=’’,语句为:

TABLE Region='',MEAN=''*Sales='Mean Sales by Region';

这是告诉SAS移去region和mean的顶部,并且将sale的顶部换为“Mean Sales by Region”

有时候当行顶部被赋为空格时,会留下一个空白空格,可以用row=float强制去除这种空白空格:

TABLEMEAN=''*Sales='Mean Sales by Region',Region=''/ROW=FLOAT;

例子 仍然是船的数据:

下面的代码和以前一样,多了对顶部的改变,format语句创建了一个用户定义的格式$typ,并用format语句把这个格式赋给变量type,table语句中locomotion、mean、type的顶部被赋为空格,price的顶部被赋值“Mean Price by Type of Boat.”

输出结果为:

这样的结果看起来清晰且紧凑。

4.16 为proc tabulate输出的数据方格指定多种格式

可以为不同变量指定不同格式,基本形式为:

variable-name*FORMAT=formatw.d

比如在table语句中插入这个复杂的语句:

TABLE Region,MEAN*(Sales*FORMAT=COMMA8.0 Profit*FORMAT=DOLLAR10.2);

这是给变量sales指定格式comma8.0,给变量profit指定格式dollar0.2

例子 仍然是船的数据,新增加了一个变量,以显示船的长度:

假如你想在报告中同时show出平均价格和平均长度,仅为价格指定货币格式。下面的代码这样实现,为变量price指定格式dollar6.2,为length指定格式6.0:

输出结果如下,注意价格和长度的格式不一样:

4.17 用proc report产生一个简单的输出

Report包含print、means和tabulate、sort的所有功能,可以用一本书来介绍,基本形式为:

PROC REPORT NOWINDOWS;

COLUMN variable-list;

Column语句类似于proc print的var语句,告诉SAS哪些变量该包括并以何种顺序,如果遗漏语句column,SAS默认在数据集中包括所有变量,如果遗漏选项nowINDOWS,SAS默认启用交互report窗口。为使数据和顶部能很好的区分开来,可以使用headline和headskip:

PROC REPORT NOWINDOWS HEADLINE HEADSKIP;

Headline在顶部下面拉了一条线,headskip在顶部下面留了一段空白。

数值变量VS字符串变量 从proc report得到的报告类型,部分依据于使用的数值类型。只要报告中起码有一个字符串变量,默认的报告就是每个观测值一行。但如果报告全是数值变量,默认proc report将会加总这些变量,即使是日期变量也会被加总。

例子 有一份关于美国国家公园(national parks)和国家纪念碑(monuments)的数据,Parks.dat,变量包括名字、类型(NP for national park or NM for national monument),地区(East orWest),博物馆的数量,野营地的数量:

下面的代码形成了两份报告,第一份没有column语句,SAS使用所有变量,第二份使用column语句,选择部分变量:

第一份报告与proc print相似,第二份报告,由于只选择museum变量和camping两个数值型变量,默认直接显示加总情况:

4.18 在proc report中使用define语句

Define用来为单个变量指定一些选项,基本形式为:

DEFINE variable/options’column-header’;

Usage选项 这个选项告诉SAS如何使用这个变量,可能的usage选项包括:

  • Across:为变量的每一个变量值都创建一个列
  • Analysis:为变量创建统计量,数值变量默认有这个usage选项,且统计量默认为sum。
  • Display:为数据集中的每一个观测值都创建一行(对于字符串变量,这个选项是默认的)。
  • Group:为每个变量的变量值都创建一行。
  • Order:为每个观测值都创建一行,且行值的排列是是按照指定的变量来顺序。

改变列顶部 proc report中几种方法可以改变列顶部,4.1中的label语句,或者用define语句指定列顶部,下面的代码使得SAS的report按照age排序,并且以“Age at Admission”作为列顶部:

DEFINE Age / ORDER 'Age at/Admission';

缺失数据 默认在order,group,和across variables中不考虑缺失值,用missing选项可以改变这种默认:

PROC REPORT NOWINDOWS MISSING;

例子 仍然是关于国家公园和纪念碑的数据,

下面的代码包含两个define语句,第一个用order选项来定义region,第二个为变量camping定义列顶部。Camping是一个数值变量,默认有analysis选项。Missing选项也出现在了proc语句中,因此缺失值也会被考虑在报告中:

输出结果为:

Region有三个变量值,第一个是missing缺失值。

4.19 用proc report创建简易报告

Group创建简易行,across创建简易列。

Group 变量 下面的代码告诉SAS创建一个显示每个部门工资总和、奖金总和(数值变量将默认被加总)的报告:

Across变量 corss变量,也需要define语句,不同的是,SAS默认不是对变量值求和,而是计数。如果要加总,则需要再across变量和analysis变量之间加逗号,告诉SAS哪个变量要加总,下面的代码告诉SAS用列来显示出每个部门工资和奖金的总和:

例子 仍然是国家公园和纪念碑的例子,

下面的代码包含两个proc report,第一个中,region和type都被定义成group变量,第二个中,region仍然是个group变量,但type是across变量。注意两个column语句基本一样,除了第二个中增加了标点(to cross the across variable with the analysis variables.)。

输出结果为

4.20 给proc report输出增加

Break语句可以为报告增加停顿,为每个指定的变量的变量值增加停顿。基本形式如下:

BREAK location variable/options;

RBREAK location/options;

Location有两种可能值——before和after,决定是之前停顿还是之后停顿。斜杠之后的选项告诉SAS插入哪种停顿,主要类型有:

  • OL 停顿的地方加入横线
  • Page 开始一个新的页面
  • Skip 插入一个空行
  • Summarize 插入数值变量之和
  • UL

需要注意的是,break要求指定一个变量,而rbreak不需要。因为rbreak只产生一个停顿(开始或结尾),而break语句为指定的变量的每一个变量值都产生停顿。这个变量必须是group变量或order变量,并且要在define语句中定义过。可以在任何报告中使用rbreak语句,但只能在有最起码一个group或者order变量的报告中使用break语句。

例子 仍然是国家公园和纪念碑的例子:

下面的代码将region定义为order变量,使用break和rbreak语句和after选项,summarize加总数值变量的和:

输出结果为:

4.21 为proc report输出增加统计量

简单的方法是在column语句中加入统计量的关键字,常用的有:

Max、min、mean、median、n、nmiss、p90、pctn、pctsum、std、sum

给变量应用统计量 给变量应用统计量,在变量和统计量之间插入逗号即可,统计量N不需要逗号。如:

COLUMN Age,MEDIAN N;

为多个变量应用多个统计量,需要括号,如下面代码要求一个变量age应用两个统计量min和max;两个变量height和weight应用一个统计量mean:

COLUMN Age,(MIN MAX)(Height Weight),MEAN;

例子 仍然是国家公园和纪念碑的数据:

下面的代码包括了两个proc report,都应用了统计量N和mean,但第一个定义type为group变量,第二个定义type为across变量。

输出结果为:


sas

0 人点赞