SAS語言

SAS語言

SAS語言是一種專用的數據管理與分析語言,它提供了一種完善的程式語言。類似於計算機的高級語言,SAS用戶只需要熟悉其命令、語句及簡單的語法規則就可以做數據管理和分析處理工作。因此,掌握SAS編程技術是學習SAS的關鍵環節。在SAS中,把大部分常用的複雜數據計算的算法作為標準過程調用,用戶僅需要指出過程名及其必要的參數。這一特點使得SAS編程十分簡單。

基本介紹

  • 中文名:統計分析系統
  • 外文名:SAS
  • 全稱:Statistics Analysis System
語言簡介,SAS語句,SAS表達式,SAS程式規則,作用,常用函式,

語言簡介

SAS系統強大的數據管理能力、計算能力、分析能力依賴於作為其基礎的SAS語言。SAS語言是一個專用的數據管理與分析語言,它的數據管理功能類似於資料庫語言(如FoxPro),但又添加了一般高級程式設計語言的許多成分(如分支、循環、數組),以及專用於數據管理、統計計算的函式。SAS系統的數據管理、報表、圖形、統計分析等功能都可以用SAS語言程式來調用,只要指定要完成的任務就可以由SAS系統按照預先設計好的程式去進行,所以SAS 語言和FoxPro等一樣是一種第四代語言。這裡簡單介紹SAS語言的基本成分與規則。

SAS語句

SAS語言程式由數據步和過程步組成。數據步用來生成數據集、計算、整理數據,過程步用來對數據進行分析、報告。SAS語言的基本單位是語句,每個SAS語句一般由一個關鍵字(如DATA,PROC,INPUT,CARDS,BY)開頭,包含SAS名字、特殊字元、運算符等,以分號結束。SAS關鍵字是用於SAS語句開頭的特殊單詞,SAS語句除了賦值、累加、注釋、空語句以外都以關鍵字開頭。SAS名字在SAS程式中標識各種SAS成分,如變數、數據集、資料庫,等等。SAS 名字由1到8個字母、數字、下劃線組成,第一個字元必須是字母或下劃線。SAS關鍵字和SAS 名字都不分大小寫。

SAS表達式

SAS數據步程式中的計算用表達式完成。表達式把常量、變數、函式調用用運算符、括弧連線起來得到一個計算結果。
常 量
SAS常量主要有數值型、字元型兩種,並且還提供了用於表達日期、時間的數據類型。
數值型:數值型常數可以用整數、定點實數、科學計數法實數表示。如:
12,-7.5,2.5E-10
字元型:字元型常數為兩邊用單撇號或兩邊用雙撇號包圍的若干字元。如:
'Beijing',"Li Ming","李明"
日期、時間:
日期型常數是在表示日期的字元串後加一個字母d大小寫均可),中間沒有空格。時間型常數是在表示時間的字元串後加一個字母t。日期時間型常數在表示日期時間的字元串後加字母dt。
日期型:'13JUL1998'd
時間型:'14:20't
日期時間型:'13JUL1998:14:20:32'dt
因為SAS是一種數據處理語言,而實際數據中經常會遇到缺失值,比如沒有觀測到數值,被訪問人不肯答,等等。SAS中用一個單獨的小數點來表示缺失值常量
變 量
SAS變數的基本類型有兩種:數值型和字元型。日期、時間等變數存為數值型(實際記錄為距1960/01/01的天數)。SAS的數值型變數可以存儲任意整數、定點實數、浮點實數,一般不關心其區別。數值型變數在數據集中的存貯一般使用8個位元組。SAS的字元型變數預設的長度是8個字元,但是如果在INPUT 語句中輸入字元型變數時指定了長度則不受此限制。可以用LENGTH語句直接指定變數長度。
LENGTH 語句一般應出現在變數定義之前,格式為:
LENGTH 變數名 $ 長度;例如:
LENGTH name $ 20;
運算符
SAS運算符包括算術、比較、邏輯及其它的運算符。
算術運算符
算術運算符: + - * / **,運算優先權按通常的優先規則。
比較運算符
比較運算符用於比較常量、變數的值大小、相等,包括
= ^= > < >= <=
EQ NE GT LT GE LE IN
其中EQ等名字和=等特殊字元是同一運算符的等價寫法。比較運算符得到“真”或“假” 的結果,主要用於需要條件的分支、循環等語句中。
運算符IN是一個SAS特有的比較運算符,用來檢查某個變數的取值是否在一個給定列表中,例如:
prov in ('Beijing', 'Tianjin', 'Shanghai', Chongqing')
可以判斷變數prov的取值是否為四個直轄市之一。
邏輯運算符用來連線比較得到的結果以構成複雜的條件,有三種邏輯運算符: &(AND) |(OR) ^(NOT) 。其中AND是&(與)的等價寫法,OR是|(或)的等價寫法,NOT是^(非)的等價寫法。
例如:
(salary >= 1000) AND (salary < 2000)
表示工資收入在1000-2000之間(不含2000)
(age <= 3) OR (sex = '女')
表示三歲以下(含三歲)的嬰兒及婦女
NOT ((salary >= 1000) AND (salary < 2000))
表示工資收入不在1000-2000之間
複雜的邏輯表達式最好用括弧表示其運算優先權,以免誤記優先規則並可利於閱讀程式。
其它的運算符
其它的運算符:
||(兩個連續的|號),兩個字元串連線
<> 取兩個運算值中較大一個的(比如3<>5結果為5)
>< 取兩個運算值中較小一個的 (比如3><5結果為3)
注意:<>符在有些語言中用作“不等於”比較算符,而SAS 中用法則較特殊。

SAS程式規則

SAS程式由語句構成。每個語句以分號結尾。在SAS程式中,一個語句可以寫到多行(不需任何續行標誌),也可以在一行連續寫幾個語句。SAS語言中只要允許用一個空格的地方就可以加入任意多個空白(空格、制表符、回車),允許用空格的地方是名字周圍、運算符周圍。另外,SAS關鍵字和名字大小寫不分,但字元型數據值要區分大小寫,比如"Beijing" 和"BEIJING"被認為是不同的數據值。
在SAS程式中可以加入注釋,注釋的內容用/*和*/在兩端界定。這種注釋可以出現在任何允許加入空格的位置,可以占多行。SAS中一般只把注釋單獨占一行或若干行,不把注釋與程式代碼放在同一行。注釋的另一個作用是把某些代碼暫時禁止使其不能運行。
SAS程式包括數據步和過程步兩種結構,每一個步是一段相對完整的可以單獨運行的程式。數據步用來生成、整理數據和自編程計算,過程步調用SAS已編好的處理過程對數據進行處理。自己用SAS編程式進行計算主要在數據步中進行。
SAS數據步以DATA語句開頭,以RUN語句結尾。DATA步中可以使用INPUT、CARDS、INFILE 、SET、MERGE等語句指定數據來源輸入數據,也可以用賦值、分支、循環等編程結構直接生成數據或對輸入的數據進行修改。

作用

SAS是一種專用的數據處理、統計計算語言,但是它也包含一般的高級語言編程能力並擴充了許多數學、統計等方面的函式。
SAS語言的編程計算能力主要由SAS數據步提供。DATA語句以關鍵字DATA 開頭,後面給出一個數據集名,例如:
data out1;
則在本數據步要生成的數據集,其名字為out1。我們也可以省略數據集名,這時SAS自動生成一個臨時數據集名。也可以使用特殊名字_NULL_ ,表示本數據步不生成數據集。
一賦值語句
在SAS中用賦值語句計算一個值並存放到變數中。
格式為
變數名 = 表達式;
例如:
avg = (math + chinese)/2;
isfem = (sex='女');
y=sin(x)**2;
newv = .;
其中第一個賦值語句用一個公式計算平均分數。第二個生成一個取值為0或1的變數,性別為女時為1,否則為0。第三個使用了正弦函式和乘方運算。第四個給變數賦了缺失值。
二輸出語句
SAS數據步的輸出一般是數據集,用賦值語句計算的結果會自動寫入數據集。SAS也提供了一個PUT語句用於立即列印輸出結果。
PUT語句的語法:
PUT 輸出項表
輸出項表中只能是變數或字元串,項間用空格隔開。如:
data;
x=0.5;
y=sin(x);
put 'Sine function value of ' x 'is ' y;
run;
結果將在運行記錄視窗顯示一行
Sine function value of 0.5 is 0.4794255386
PUT說明
⒈在PUT語句中,若在變數名後加“=”,則指定輸出項可以顯示帶有變數名的輸出結果。
比如把上程式中的PUT語句改為
put x= y=;
則結果在LOG視窗顯示為
X=0.5 Y=0.4794255386
⒉指定變數輸出項的具體列位置及小數位數
絕對位置格式:
變數 起始列-結束列.小數位數
比如,
put x 10-20 .6 y 30-40 .6;
指定把X數值顯示在第10-20列,保留6位小數,把
Y數值顯示在第30-40列,保留6位小數。
在指定的列位置內,數值型數據靠右對齊,字元型
數據靠左對齊。變數為整數值或者字元型則不指定
小數位數。
相對位置格式:
變數 寬度.小數位數(用於數值型)
變數 $寬度.(用於字元型)
如:put x 20.8 y 20.8; 使X占用第1-20列,8位小數,右對齊;Y占用第21-40列,8位小數,右對齊。
而put name $10.;使name占用10列。
輸出占位不滿指定寬度時,數值型數據向右對齊,字元型數據向左對齊。
⒊如果希望PUT語句的輸出不產生換行,使下一個PUT的結果可以顯示在同一行,只要在PUT 語句結尾處加一個@符。
PUT語句的輸出結果預設情況下被送到運行記錄視窗。若在PUT語句之前用FILE語句可以改變PUT語句的輸出目的地。如,在PUT語句之前用file print;可以把PUT語句的輸出轉向到輸出視窗。在FILE語句中指定一個包含檔案名稱的字元串可以把PUT語句的輸出轉向到此檔案中。比如file 'tmp.out';輸出檔案把後續的PUT語句輸出轉向到當前工作目錄下的檔案“tmp.out”中,生成tmp.out 。注意當前工作目錄在SAS狀態欄的右方顯示,雙擊可以更改。檔案名稱也可以指定全路徑,比如“C:\SAS\TMP.OUT”。
三分支結構
⒈if...then...else 結構
⒉SELECT結構
1. if...then...else 結構
格式為:
IF 條件 THEN 語句;
ELSE 語句;
例: data temp1
input x @@;
if x>0 then put x '是正數';
else put x '是負數';
cards;
1 2 -3 4 -5
;
run;
有時我們在條件成立時需要進行的操作無法用一個語句完成,這時可以使用SAS提供的複合語句功能。例:
data;
input x@@; /*不分行符@@的使用:每讀入一天記錄後,數據指針保持原位不換行,
繼續讀下一條記錄*/
if x>0 then do;
y=2*x;
put 'f(' x ')=' y;
end;
else put 'Data Error!';
cards;
1 2 -3 4 -5
;
run;
如果當條件不成立時,不進行什麼操作,可以不使用ELSE及其後面的語句。
2.SELECT結構
格式一:
SELECT (選擇表達式);
WHEN(值列表) 語句;
WHEN(值列表) 語句;
……
OTHERWISE 語句;
END;
功能及流程:
執行SELECT結構時,先計算出選擇表達式和值列表中的所有值,然後把選擇表達式值由前向後與值列表中的值相比,發現相等值則執行對應的語句,然後退出SELECT結構(不再查看後面的值列表)。如果選擇表達式的值不等於任何值列表中的值則執行OTHERWISE對應的語句,這種情況下沒有OTHERWISE語句會出錯。
例:
DATA ;
INPUT month $ @@;
put month @;
SELECT(month);
WHEN('Feb', 'Mar', 'Apr') put '春天';
WHEN('May', 'Jun', 'Jul') put '夏天';
OTHERWISE put '秋天或冬天';
END;
CARDS;
Mar Jun oct
;
run;
格式二:
SELECT;
WHEN(條件) 語句;
WHEN(條件) 語句;
……
OTHERWISE 語句;
END;
這種SELECT語句沒有選擇表達式,而是在每
一個WHEN語句指定一個條件(邏輯表達式),
執行第一個滿足條件的WHEN後的語句。如果所
有條件都不滿足則執行OTHERWISE後的語句。
例:
data;
input age @@;
put age @;
SELECT;
WHEN(age<=12) put '少年';
WHEN(age<35) put '青年';
OTHERWISE put '中老年';
END;
cards;
10 30 50
;
run;
四循環結構
⒈計數DO循環
⒉當型循環
⒊直到型循環
⒈計數DO循環
計數DO循環的格式:
DO 計數變數 = 起始值 TO 結束值 BY 步長;
循環體語句……
END;
這種結構與BASIC中計數循環很類似,功能也相當,只是在SAS中是以關鍵字DO開頭(不是FOR),另外步長用BY引導(不是STEP),而結構以END結束(而不是NEXT)。
其功能與流程:
程式先把計數變數賦值為起始值,如果此值小於等於結束值則執行循環體語句,然後把計數變數加上步長,再判斷它是否小於等於結束值,如果是則繼續執行循環體,直到計數變數的值大於結束值為止。上述結構中“BY 步長”可以省略,這時步長為1。如果步長取負值,則繼續循環的條件是計數變數大於等於結束值。
計數DO循環舉例
data;
sum=0;
DO i = 1 TO 10 ;
sum +i;
/*此處sum+i等價於sum=sum+i*/
END;
PUT sum=;
run;
在循環體中可以用LEAVE語句跳出循環(功能與C語言的break語句相當),如:
data;
n=13;
flag=1;
DO i = 2 TO n/2 ;
if mod(n,i)=0 then do;
flag=0;
leave;
end;
END;
if flag=1 then
put n "是素數";
else
put n "不是素數";
run;
⒉當型循環
當型循環的格式:
DO WHILE(循環繼續條件);
循環體語句……
END;
程式先判斷循環繼續條件是否成立,成立時執行循環體語句,再判斷循環繼續條件,如此重複,直到循環繼續條件不再成立。
data;
x=243;
y=63;
z=mod(x,y);
DO WHILE (z ^= 0);
x=y;
y=z;
z= mod(x,y);
END;
put y;
run;
⒊直到型循環
直到型循環的格式:
DO UNTIL (循環退出條件);
循環體語句……
END;
程式先判斷循環退出條件是否成立,成立則結束循環,否則繼續。例:
data;
n=0;
do until (n>=5);
n+1;
put n=;
end;
run;

常用函式

⒈算術函式(Arithmetic Functions)
ABS(x) :求x的絕對值。 例如ABS(-56.3)=56.3 。
MAX(x1,x2,…,xn) :求所有自變數中的最大一個。 例如MAX(52,15,67,89)=89 。
MIN(x1,x2,…,xn) :求所有自變數中的最小一個。例如MIN(52,15,67,89)=15 。
MOD(x,y) :求x除以y的餘數。 例如MOD(24,3)=0 。
SIGN(x) :計算x的符號,結果為1、-1、0。例如SIGN(-5)=-1,SIGN(20)=1,SIGN(0)=0。
SQRT(x) :求x的平方根。 例如SQRT(225)=15 。
⒉數學函式(Mathematical Functions)
ERF(X):誤差函式 。
EXP(X):指數函式 。
GAMMA(X):計算 的值。
LOG(X):計算x的自然對數。
LOG10(X):計算x的以10為底的對數。
LGAMMA(X):計算函式的自然對數。
⒊截斷函式(Truncation Functions)
CEIL(X):計算x的最小整數,當x為整數時就是x本身,否則為x右側最近的整數。
例如CEIL(-134.45)=-134,CEIL(34.45)=35,CEIL(78)=78。
FLOOR(X):計算小於或等於x的最大整數,例如FLOOR(-134.45)=-135,FLOOR(34.45)=34。
INT(X):求x舍掉小數部分後的整數部分。例如INT(-134.45)=-134,INT(34.45)=34。
ROUND(x,unit):計算x按照unit指定的精度四捨五入後的結果,例如ROUND(134.4567,0.01)結果為134.46,ROUND(3678.2398,10)結果為3680。
⒋三角和曲線函式(Trigonometric and Hyperbolic Functions)
ARCOS(y):計算反餘弦函式。
ARSIN(y):計算反正弦函式。
ATAN(y):計算反正切函式。
COS(X):計算x的餘弦函式。
SIN(X):計算x的正弦函式
⒌字元函式(Character Functions)
COMPBL(S):將字元串S中的多餘空格去掉。
COMPRESS(S,S1):將字元串S中包含的所有字元串S1去掉。
INDEX(S,S1):查找字元串S1在S中的位置。如果S中不包含S1則返回0。
LOWCASE(S):把字元串S中所有大寫字母轉換為小寫字母。
UPCASE(S):把字元串S中所有小寫字母轉換為大寫字母。
RANK(S):求字元串S的ASCII碼值。
REPEAT(S,N):將字元串S重複N次。
SUBSTR(S,N,LONG):字元串S中的第N個字元開始抽取long個字元長的子串。
TRANWRD(S,S1,S2):將字元串S中的所有字元串S1替換成字元串S2。
⒍日期和時間函式(Date and Time Functions)
常用日期和時間函式有:
DATEIF(sdate,edate,basis):計算兩個日期之間相距的天數,basis指定日期格式。
DATE:計算當前SAS系統的日期。
DAY(date):有SAS日期值date得到是幾日。
DHMS(date,hour,minute,second):有日期、小時、分鐘、秒得到SAS日期和時間值。
MDY(month,day,year):生成月日年的SAS日期值。
MONTH(date):有SAS日期值date得到月。
QTR(date):有SAS日期值date得到季度值。
WEEKDAY(day):有SAS日期值date得到星期幾。
YEAR(DATE):有SAS日期值date得到年。
其它日期和時間函式參見SAS系統的幫助信息。
⒎機率與密度函式(Probability and Density Functions)
作為一個統計計算語言,SAS提供了多種機率分布函式。分布密度、機率、累積分布函式等可以通過集中統一的格式調用,格式為:
CDF(‘dist’,quantile,parm-1,…,parm-k):計算累計分布函式。Dist為分布名稱,quntile為分為數,隨後是相關參數。
PDF|PMF(‘dist’,quantile,parm-1,…,parm-k):計算機率密度函式。Dist為分布名稱,quntile為分為數,隨後是相關參數。
LOGPDF|LOGPMF(‘dist’,quantile,parm-1,…,parm-k):計算機率密度函式的對數值。Dist為分布名稱,quntile為分為數,隨後是相關參數。
LOGSDF(‘dist’,quantile,parm-1,…,parm-k):計算生存函式的對數值。Dist為分布名稱,quntile為分為數,隨後是相關參數。
PROBCHI(x,df<,nc>):計算卡方分布的機率值。可選參數nc為非中心參數。
PROBF(x,ndf,ddf<,nc>):計算F分布的機率值。可選參數nc為非中心參數。
PROBGAM(x,a):計算伽馬分布的機率值。
PROBNORM(x):計算標準常態分配的機率值。
⒏分位數函式(Quantile Functions)
分位數函式是機率分布函式的反函式。其自變數在0-1之間取值。分位數函式計算的是分布的左側分位數。
BETAINV(p,a,b):計算參數為(a, b)的 分布的p分位數。
CINV(p, df<,nc>):計算自由度為df的卡方分布p分位數。可選參數nc為非中心參數。
FINV(p, ndf, ddf<,nc>):計算F (ndf , ddf)分布的p分位數。可選參數nc為非中心參數。
GAMINV(p, a):計算參數為a的伽馬分布的p分位數。
PROBIT(p):計算標準常態分配的p分位數。
TINV(p, df>,nc<):計算自由度為df的t分布的p分位數。可選參數nc為非中心參數。
⒐隨機數函式(Random Number Functions)
SAS提供了常見分布的偽隨機數生成函式。
NORMAL(seed):產生服從常態分配的隨機數。seed為0,或5位、6位、7位的奇數。
RANNOR (seed):產生服從常態分配的隨機數。seed為任意數值常數。
RANBIN(seed,n, p):產生參數為(n, p)的二項分布隨機數,seed為任意數值。
均勻分布隨機數。系統提供兩個均勻分布隨機數函式:
UNIFORM(seed):產生服從均勻分布的隨機數。參數seed必須是常數,為0,或5位、6位、7位的奇數。
RANUNI (seed):產生服從均勻分布的隨機數。參數seed為小於2**31-1的任意常數。在同一個數據步中對同一個隨機數函式的多次調用將得到不同的結果,但不同數據步中從同一種子出發將得到相同的隨機數序列。隨機數種子如果取0或者負數,則種子採用系統日期時間。
RANEXP(seed):產生服從指數分布的隨機數。seed為任意數值,產生參數為1的指數分布的隨機數。
RANPOI(seed,lambda):產生參數為lambda>0的泊松分布隨機數,seed為任意數值。
RANTBL(seed,P1,…,Pn)生成取1,2,…,n的機率分別為P1,…,Pn的離散分布隨機數。
⒑樣本統計函式(Sample Statistics Funtions)
樣本統計函式把輸人的自變數作為一組樣本,計算樣本統計量。其調用格式為“函式名(自變數1,自變數2,…,自變數n)”或者“函式名(OF變數名列表)”。比如SUM是求和函式,如果要求x1、x2, x3的和,則可以用SUM(xl,x2,x3),也可以用SUM(of x1-x3)。
各樣本統計函式為:
CSS:離差平方和
CV:變異係數
KURTOSIS:峰度
MEAN:均值
MAX:最大值
MIN:最小值
N:非缺失數據的個數
NMISS:缺失數值的個數
RANGE:極差=MAX - MIN
SKEWNESS:偏度
STD DEV:標準差
STDERR:均值估計的標準誤,用STD/SQRT(N)計算
SUM:求和
USS:平方和
VAR:方差

相關詞條

熱門詞條

聯絡我們