統計軟件SAS入門教程:SAS程序初步

本文鏈接:http://www.itongji.cn/article/0I12292011.html

很好的一篇文章,特適合入門者。

從本質上講,SAS是一種完善的第四代計算機語言。因此要真正掌握它,我們仍然要拋開其華麗的外表,從學習它的核心――SAS程序開始。

現在,讓我們將SAS看成一個計算能力極強的統計學白癡(之所以這樣說,是因爲它計算能力雖然極強,卻只能幫你計算而不能提出自己的實驗設計方案或研究方向來),而你有一個非常小的關於數據分析的問題要請它幫忙。自然你要開口提出請求,無論措辭是委婉動聽還是直截了當,你的大實話無非是“喂,老兄,我有這樣一些數據,我想做這樣一種統計分析,您能幫我嗎?”。他迅速檢查您的要求,在認爲合情、合理並且合法後,就開始進行計算,並且在很短的時間內給出計算結果。

好的,計算機語言就是我們和計算機對話時所用的語言。和以上人類對話的例子相對照,“我有這樣一些數據”對應SAS程序中的數據步;而“我想做這樣一些統計處理”對應SAS程序中的程序步;最後的那一句哀求“您能幫我嗎”則對應了Submit命令。在默認情況下,運行結果或者出錯信息將自動給出(當然你也可以強制不讓它輸出)。此外,還有一些系統環境控制語句,如Libname、title等。SAS程序就是由一個或多個數據步和/或程序步加上一些亂七八糟的環境控制語句組成。在本章中,我們將首先學習SAS對數據的管理方式,然後會瞭解到什麼是數據步和程序步,最後則介紹一下SAS語言中結構化語句的語法。

§3.1 SAS系統對數據的管理

在SAS系統中只有SAS數據集才能被SAS過程直接調用,SAS數據集的結構和DBF數據庫完全相同,因此無須多講。而SAS數據集存儲在被稱爲SAS數據庫的文件集中,在PC系統中,SAS數據庫與某一個文件夾相對應,我們要爲每一個數據庫指定一個庫標記(庫名)來識別該庫,使用Libname命令可以指定庫標記。它的一般格式如下:

Libname 庫標記 ’文件夾位置’ 選項;

例如要指定目錄“C:\USER”爲庫標記A,可以在視窗中提交如下語句:

libname a ’c:\user’;

數據庫可分爲永久庫和臨時庫兩種。臨時庫只有1個,名爲WORK,它在每次啓動SAS系統後自動生成,關閉SAS時庫中的數據集被自動刪除;永久庫可有多個,用戶可以使用Libname語句指定永久庫的庫標記,永久庫中的所有文件都將被保留。但庫標記仍是臨時的,每次啓動SAS系統後都要重新指定。不過爲了方便用戶,SAS在每次啓動時都會自動指定兩個庫標記:

SASUSER:指明爲永久庫,即庫中的數據集被保存起來,以便下次啓動系統時使用。
WORK:指明爲臨時庫,對於開發和檢查新程序非常有用,但每次SAS運行結束後WORK庫中的所有文件將被刪除。在程序中引用該庫中的數據集可以省略庫標記,即它被認爲是缺省的數據庫。
 SAS數據庫對應文件夾,如SASUSER對應c:\sas\sasuser,WORK對應c:\sas\saswork, SAS數據集則對應文件,每個數據集實際上是在硬盤的相應文件夾內產生一個文件名爲數據集名,而擴展名爲.sd2的文件,因此如果你成功的建立了一個數據集,理論上你就可以反覆使用它直到硬盤報廢。

每一個數據集都有一個兩級名,第一級是庫標記,第二級是數據集名,中間用“.”隔開,在程序中通過指定兩級名來識別文件。文件兩級名的一般形式如下:

庫標記.數據集名

如在a庫中的數據集abc可以這樣來引用:a.abc 。

§3.2 SAS程序的數據步

3.2.1 預備知識

SAS程序的語句從上一個語句結束處開始,以一個分號結束,可佔多行。

3.2.2 數據步

以DATA語句開始,用於創建和處理數據集。其中最常用的語句有:

DATA語句 它的主要功能是:
標誌數據步的開始。
命名將要創建的SAS數據集。
DATA語句的一般形式如下:

DATA 數據集名;

INFILE語句 用於從外部文件讀入數據,必須出現在INPUT語句之前。它的主要功能是:
確定一個包含原始數據的外部文本文件。
INFILE語句的格式如下:

INFILE ’外部文件的所在位置及名稱’ 選項;

CARDS語句 用於直接輸入數據,標誌着數據塊的開始。格式如下:
CARDS;
數據塊
;
INPUT語句 用於向系統表明如何讀入每一條記錄。它的主要功能有:
讀入由語句指定的數據列。
爲相應的數據域定義變量名。
確定變量的讀入模式。
INPUT語句的格式如下:

INPUT 變量名 [變量類型 起止列數]...;

方括號表示其中的內容爲可選,如果不輸入,系統會以默認值代替。

3.2.3 數據的兩種輸入方式

上面我們學到了INFILE語句和CARDS語句,它們分別對應了兩種數據輸入的方式:

【直接輸入方式】

實際上我們在第一章已經用到了直接輸入方式,仍以那個程序爲例,其中的數據步如下:

data temp;
 命名將要建立的數據集爲work.temp
input x y@@;
 要輸入的變量爲x、y,並且連續輸入

cards;
 直接輸入數據,數據塊開始

34 56 78 90 35 67 89 10 23 65 77 45
 數據塊
;
 數據塊結束

變量y後面的@@表示數據可以在一行裏連續讀入,SAS默認按列來分隔變量,可是這裏只有兩個變量,輸成兩列數據太長,因此加上兩個@@,SAS見到這個符號,在按變量名依次讀取完數據後,不是跳到下一行,而是繼續在該行讀數據,直至本行結束或到達分號爲止。

如果你對這段敘述無法理解,請去掉兩個@@,重新運行一遍程序,看看LOG視窗中的提示都有些什麼變化。


【外部文件讀入方式】

如果剛纔的數據已經事先輸好,在硬盤上的“C:\USER”文件夾內存爲temp.dat文件,該文件內容如下(純文本):

34 56 78 90 35 67 89 10 23 65 77 45

則我們可以輸入程序如下:

data temp; 命名將要建立的數據集爲work.temp
Infile ’c:\user\temp.dat’; 指定外部數據文本文件名
input x y@@; 要輸入的變量爲x、y,並且連續輸入

Run; 數據步結束,以上語句可以執行了

數據步以DATA語句開始,那麼在哪裏結束?在遇到run語句或另一個數據步/程序步時就結束了。

爲什麼程序的最後都要加一句run?這個問題還不太好解釋,每一個程序應至少在最後有一個run語句,表明前面的所有語句可以提交運行了,如果沒有這一句,SAS會以爲你後面還有語句要輸入,從而將一些非立即執行的語句保留在編譯緩衝區中,等待後續命令發出後一起執行,這有時會把事情弄得很糟。出於減少麻煩的需要,建議大家養成在每一個數據步或程序步後都寫上一句run的習慣。

Submit命令和run語句有什麼區別?這是初學者最愛問的一個問題,也同樣是一個難以回答的問題。簡單地講,run是程序語句,可在程序中多次出現,它表示前面的程序段已經全部寫完,可以作爲一個或幾個整體提交運行了,而Submit則是SAS命令,只在最後程序運行的時候發出,表示將程序正式提交運行。如果你還不明白,那麼我還是來給你打個比方,run語句是你對SAS說“我想讓您做的就是這些了”,而Submit命令就是對SAS說“現在開始爲我做這些事,好嗎”,明白了嗎?

【讀入其他格式的數據文件】

除了以上的兩種通過數據步創建數據集的方法,SAS還提供了一些其他的方式可以用來讀入其他格式的數據文件。6.11版本以上的SAS可以利用FILE菜單上的import命令將其他格式的數據文件導入SAS系統,創建SAS自己的數據集。可以導入的數據文件格式有:dBase數據庫,EXCEL工作表,LOTUS的數據庫,純文本的數據文件等。

導入的操作完全是對話式的,界面友好,簡便實用。以下簡單敘述導入的步驟,假如例1.1的數據輸成一個dBASEIII數據庫文件temp.dbf, 已經存放在"c:\user"下,要導入成數據集work.li1_1。選擇FILE菜單上的import,彈出一個對話框,按照嚮導的提示進行下去。

1. 選擇導入的數據格式,從下拉式菜單上選擇DBF格式,單擊NEXT按鈕。

2. 給出數據文件的位置和文件名,在對話框中鍵入C:\USER\temp.DBF,或點BROWSE直接從上面選擇文件,選好後單擊NEXT按鈕。

3. 選擇導入的目的地,即指定要創建的數據集的名字和存放的數據庫名,先在左面的對話框選擇數據庫名WORK(臨時庫),在右面的對話框鍵入數據集的名字li1_1,此名可任意起,少於8個字符,選擇完後,單擊FINISH按鈕,就完成了此次操作。

這時已經建好了一個數據集,名爲WORK.li1_1,與我們前面建立的數據集完全一致。

§3.3 SAS程序的程序步

通俗的講,SAS的程序步(有的書中也稱過程或過程步)就是已經編好了的用於數據整理和統計的計算機程序,你只需要調用它們就是了。程序步總是用一個PROC語句開始,後面緊跟着程序步名,用以區分不同的程序步。以下是一些常用的程序步的名稱及功能。

程序步名
功 能

SORT 將指定的數據集按指定變量排序
PRINT 將數據集中的數據列表輸出
MEANS 對指定的數值變量進行簡單的統計描述
FREQ 對指定的分類變量進行簡單的統計描述
TTEST 對指定的變量做t檢驗
ANOVA 對指定的變量做方差分析
NPAR1WAY 對指定的變量做非參數檢驗
REG 對指定的變量做迴歸分析
CORR 對指定的變量做相關分析
CHART 繪出低分辨率的統計圖

PROC就是程序(procedure)的縮寫,而程序步的名字大都是其功能相對應的單詞或詞組的縮寫。

可見SAS的許多功能就是通過程序步來體現的,可如此多的種類也使我們難以總結出一個程序步的通式來。不過仍可大致給出如下結構:

PROC 過程名 [DATA=數據集名] [選項];
    該過程的專用語句描述;
    [VAR 變量序列;]
    [WHERE 條件表達式...;]
    [BY 變量序列;]
Run;

方括號裏的語句均可以省略,在這時該過程按最通常的情況來處理,即:

處理最新建立的SAS數據集。
處理所有的變量(或對一個計算過程來說處理全部數值變量)。
一次處理整個數據集而不是某個子集。
我們在第一章中用到的PRINT程序步就是採用的這種默認方式。

但有時我們的要求超出了默認方式所提供的範圍,這時就要動用方括號裏的祕密武器了。

DATA參數 指明所需處理的數據集名,請注意在這裏它是一個參數而不是語句。
VAR語句 如果只想分析某一個或幾個特定的變量,則可用VAR語句指定它們。例如只想顯示變量x的列表,則PRINT過程如下:
Proc print ;
    Var x;
Run;

如果想顯示x和y兩個變量,則將VAR語句改爲如下形式即可:

var x y;

當然,也可以將VAR語句刪除,結果相同。

Where語句 如果你想處理的不是整個數據集而只是其中符合某種條件的子集,那麼WHERE語句將會非常有用,如上例中我們只想顯示大於50的x變量的值,則在PRINT過程中加入where語句如下:
Where x>50;

如果條件變爲x、y兩個變量的值都要大於50,則where語句改爲:

where x>50 and y>50;

SAS語言中常用的邏輯表達符號有and(和)、or(或)、xor(異或)、ne(不等)等。

By語句 如果你需要分組處理數據,例如要按性別分組輸出統計結果,你有兩種選擇,一是用不同的where語句將同一個程序步反覆寫幾遍;另一種顯然更酷的方法就是採用by語句。如上例我們想按不同的y值輸出x值,則加入by語句如下:
By y;

使用BY語句要求數據集已經按BY語句中指定的變量排序。如果沒有排序,則程序無法正確運行。可以用SORT過程來排序,語法結構如下:

PROC SORT DATA=數據集名;
    BY 變量名列;
RUN;

§3.4 結構化語句簡介

每一種結構化語言編寫的程序都由順序、分支、循環三種結構構成, SAS語言也不例外。在這裏簡要介紹一下分支和循環語句的語法。這些語句均可直接在數據步和程序步中使用,適當地使用它們可以大大簡化我們的工作。

3.4.1 分支(條件)語句

【語法格式】

語法格式如下:

IF 條件 THEN
    程序塊;
ELSE

程序塊;

可見其語法和FOXBASE語言十分相似,只是前面多了THEN,結尾沒有ENDIF,可以將兩者相比較來理解。其中程序塊如果只有一句,則可直接寫出,否則應以DO開頭,以END結束。

【應用實例】

例3.1 在產生數據集temp的同時爲其增加變量class,當x>50時class=1,否則class=2。

解:程序如下:

data temp;
 數據步開始,定義要建立的數據集爲WORK庫的TEMP
    input x y@@;
 要輸入的變量爲X和Y,並且採用數據連續讀入方式
    if x>50 then class=1;
 建立新變量CLASS,如果X>50,則CLASS=1
    else class=2;
 否則,CLASS=2
cards;
 數據塊開始
34 56 78 90 35 67 89 10 23 65 77 45
 數據塊
;
 數據塊結束
proc print; 列表輸出數據集中的數據,檢查有無錯誤
run; 程序結束,開始運行以上程序

以上程序在書寫時採用了縮進格式,使程序的結構更清楚。當然大家可以左對齊寫完所有的語句,但這樣書寫的程序在較長時難以閱讀。

爲什麼可以這樣寫?在這裏有必要解釋一下數據步的執行過程,input語句按變量順序將數據讀入內存緩衝區,直至每一個變量都有值相對應。然後數據步繼續向下執行,從而其它語句可以修改內存緩衝區,如修改值、增加變量等,在執行到數據步結束後,程序又回到input語句處繼續執行,直到數據讀完爲止。現在再看看這個程序,大家可以理解它了吧!

3.4.2 循環語句

【語法格式】

語法格式如下:

DO 起始條件 TO 終止條件;
     程序塊;
END;

該語句主要用於建立數據集。

【應用實例】

例3.2 在產生數據集temp的同時爲其增加變量class,取值依次爲1、2。

解:程序如下:

Data temp; 數據步開始,定義要建立的數據集爲WORK庫的TEMP
    do class = 1 to 2; 循環開始,循環控制變量爲CLASS,取值從1到2
        input x y@@; 要輸入的變量爲X和Y,並且採用數據連續讀入方式
        output; 用OUTPUT語句將循環控制變量寫入數據集中
    end; 循環結束
cards; 數據塊開始
34 56 78 90 35 67 89 10 23 65 77 45
 數據塊
; 數據塊結束
run; 程序結束,開始運行以上程序

注意在數據步中,我們不需要用語句改變循環變量的大小,系統會自動改變。

現在,SAS語言的基本知識算是介紹完了。在理論上,你現在可以坐在計算機前,獨立編寫程序以做出你的統計作業或者是向SAS公司發射核導彈。但爲了使你能儘可能地少走彎路(我指的是做統計作業而不是後者),在以後的各章中我們將重點介紹一些常用的程序步,並且在必要的時候介紹一些較爲深入的內容。 
發佈了65 篇原創文章 · 獲贊 19 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章