1、课程介绍

SAS 简介

SAS 公司

课程目标

  • 了解 SAS并掌握SAS 基本使用

  • SAS认证

  • 常用统计程序的SAS代码

参考教材

  • The Little SAS Book (4th edition) 中文版 代码以及数据文件

  • Common Statistical Methods for Clinical Research with SAS Examples, Second Edition

考核方式

  • 考勤 20%
  • 课堂作业 20%
  • 课程论文 60%

2、 SAS软件入门

启动

软件简介

SAS语句

  • SAS语句不区分大小写
  • 一条语句可以持续到第二行(只要不把一个单词分开)。
  • 几条语句可以用一行。
  • 可以在任何一列中开始一条语句
DATA uspresidents;    
INPUT President $ Party $ Number;
   DATALINES;
Adams     F  2
Lincoln   R 16
Grant     R 18
Kennedy   D 35
   ;
proc print;
RUN;

关于SAS的注释

SAS数据集

变量和观测值

数据类型

  • SAS中只有两种数据类型——数值型和字符型

缺失值

  • 数值变量的缺失值用句号(.)表示

SAS数据集的大小

  • 在SAS 9.1之前(prior to SAS 9.1),SAS数据集可以包含32767个变量
  • 从SAS 9.1开始(beginning with SAS 9.1),SAS可包含的最多变量数由电脑可用资源决定

SAS命名规则

  • 名字的长度要小于等于32个字节。(一个字母1个字节,一个汉字2个字节)
  • 以字母或下划线开头。
  • 可以包含字母、数字、或者是下划线,不能是%$!*&#@。
  • 可以是小写或大写字母,且不区分大小写。

SAS程序的基本模块

  • 数据歩
  • 过程歩
DATA uspresidents;    
INPUT President $ Party $ Number;
   DATALINES;
Adams     F  2
Lincoln   R 16
Grant     R 18
Kennedy   D 35
   ;
proc print;
RUN;

数据步的内置循环

  • SAS会自动执行: 数据步按照一行一行、一个观测值一个观测值的顺序执行

3、SAS数据输入

直接输入

导入向导(Import Wizard)读入xls文件

  • 导入文件 baseball.xls下载(右键另存)

导入过程(IMPORT procedure)

PROC IMPORT OUT= WORK.baseball 
            DATAFILE= "C:\MyRawData\Baseball.xls" 
            DBMS=EXCEL REPLACE;
     RANGE="Sheet1$"; 
     GETNAMES=YES;
     MIXED=NO;
     SCANTEXT=YES;
     USEDATE=YES;
     SCANTIME=YES;
RUN;

读入 dat文件

DATA toads;
   INFILE 'c:\MyRawData\ToadJump.dat';
   INPUT ToadName $ Weight Jump1 Jump2 Jump3;
RUN;
* Print the data to make sure the file was read correctly;
PROC PRINT DATA = toads;
   TITLE 'SAS Data Set Toads';
RUN;

list input读取空格分开的原始数据

  • 青蛙跳跃比赛,记录了每只参赛青蛙的名字、体重、和三次跳跃的距离:

column input 读取按固定列排列的原始数据

column input有如下优势:

  • 不要求变量值之间的空格;
  • 缺失值可以直接用空格代替;
  • 字符串中可以包含空格;
  • 可以跳过不需要的变量。

原始数据记录如下:

DATA sales;
   INFILE 'c:\MyRawData\OnionRing.dat';
   INPUT VisitingTeam $ 1-20 ConcessionSales 21-24 BleacherSales 25-28
         OurHits 29-31 TheirHits 32-34 OurRuns 35-37 TheirRuns 38-40;
RUN;
* Print the data to make sure the file was read correctly;
PROC PRINT DATA = sales;
   TITLE 'SAS Data Set Sales';
RUN;

informats读取非标准格式的原始数据

混合读取方式

临时和永久数据集

练习;

写一个数据歩的SAS程序,输入下列数据集

4、数据歩深入

定义变量

  • 如下是一个农产品估重数据,每位农民要求对他们的番茄、南瓜、豌豆、葡萄进行估重: 下面代码从garden.dat原始文件中读取数据,并进行修改

  • Garden.dat 下载

DATA homegarden;
   INFILE 'c:\MyRawData\Garden.dat';
   INPUT Name $ 1-7 Tomato Zucchini Peas Grapes;
   Zone = 14;
   Type = 'home';
   Zucchini = Zucchini * 10;
   Total = Tomato + Zucchini + Peas + Grapes;
   PerTom = (Tomato / Total) * 100;
RUN;
PROC PRINT DATA = homegarden;
   TITLE 'Home Gardening Survey';
RUN;

使用SAS函数

DATA contest;
   INFILE 'c:\MyRawData\Pumpkin.dat';
   INPUT Name $16. Age 3. +1 Type $1. +1 Date MMDDYY10.
         (Scr1 Scr2 Scr3 Scr4 Scr5) (4.1);
   AvgScore = MEAN(Scr1, Scr2, Scr3, Scr4, Scr5);
   DayEntered = DAY(Date);
   Type = UPCASE(Type);
RUN;
PROC PRINT DATA = contest;
   TITLE 'Pumpkin Carving Contest';
RUN;

使用IF-THEN语句

条件语句IF-THEN的基本形式为:IF 条件 THEN 执行; 比如:IF Model=‘Mustang’ THEN Make=‘Ford’;

  • UsedCars.dat 下载

  • 使用IF-THEN语句填满缺失值,并创建一个新变量Status

DATA sportscars;
   INFILE 'c:\MyRawData\UsedCars.dat';
   INPUT Model $ Year Make $ Seats Color $;
   IF Year < 1975 THEN Status = 'classic';
   IF Model = 'Corvette' OR Model = 'Camaro' THEN Make = 'Chevy';
   IF Model = 'Miata' THEN DO;
      Make = 'Mazda';
      Seats = 2;
   END;
RUN;
PROC PRINT DATA = sportscars;
   TITLE "Eddy抯 Excellent Emporium of Used Sports Cars";
RUN;
  • Home.dat 下载

  • 新建了一个CostGroup的变量。根据Cost的值将数据分成high、medium、low和missing三类:

DATA homeimprovements;
   INFILE 'c:\MyRawData\Home.dat';
   INPUT Owner $ 1-7 Description $ 9-33 Cost;
   IF Cost = . THEN CostGroup = 'missing';
      ELSE IF Cost < 2000 THEN CostGroup = 'low';
      ELSE IF Cost < 10000 THEN CostGroup = 'medium';
      ELSE CostGroup = 'high';
RUN;
PROC PRINT DATA = homeimprovements;
   TITLE 'Home Improvement Cost Groups';
RUN;

构造子集

* Choose only comedies;
DATA comedy;
   INFILE 'c:\MyRawData\Shakespeare.dat';
   INPUT Title $ 1-26 Year Type $;
   IF Type = 'comedy';
RUN;
PROC PRINT DATA = comedy;
   TITLE 'Shakespearean Comedies';
RUN;
DATA librarycards;
   INFILE 'c:\MyRawData\Library.dat' TRUNCOVER;
   INPUT Name $11. + 1 BirthDate MMDDYY10. +1 IssueDate ANYDTDTE10.
      DueDate DATE11.;
   DaysOverDue = TODAY() - DueDate;
   Age = INT(YRDIF(BirthDate, TODAY(), 'ACTUAL'));
   IF IssueDate > '01JAN2008'D THEN NewCard = 'yes';
RUN;
PROC PRINT DATA = librarycards;
   FORMAT Issuedate MMDDYY8. DueDate WEEKDATE17.;
   TITLE 'SAS Dates without and with Formats';
RUN;
* Using RETAIN and sum statements to find most runs and total runs;
DATA gamestats;
   INFILE 'c:\MyRawData\Games.dat';
   INPUT Month 1 Day 3-4 Team $ 6-25 Hits 27-28 Runs 30-31;
   RETAIN MaxRuns;
   MaxRuns = MAX(MaxRuns, Runs);
   RunsToDate + Runs;
RUN;
PROC PRINT DATA = gamestats;
   TITLE "Season's Record to Date";
RUN;