SAS函數與CALL子程序課件_第1頁
SAS函數與CALL子程序課件_第2頁
SAS函數與CALL子程序課件_第3頁
SAS函數與CALL子程序課件_第4頁
SAS函數與CALL子程序課件_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第3章 SAS函數與CALL子程序清華大學經管學院 朱世武SAS函數定義 SAS函數是一個子程序,對自變量返回一個結果值。SAS函數的形式:函數名(X1, X2, )函數用于組合表達式可以簡化編程和統(tǒng)計計算例3.1 表達式中用函數。data a(keep=date y d min); /*保留date, y, d, min四個變量*/set ResDat.idx000001;y=year(date); /*函數year給出變量date年份*/d=weekday(date); /*函數weekday給出變量date在一周內的哪一天*/min=min(sum(oppr, hipr, lopr,cl

2、pr),1000); run;例3.2 條件語句中使用函數。data a;set ResDat.idx000001;where year(date)1996; /* Where語句中使用Year函數 *run;用函數處理多變量可以簡化程序例3.3 用與不用SAS函數時的程序。不用SAS函數。totx=xl+x2+x3+x4+x5+x6+x7+x8+x9+x10; if totxy then least=totx;else least=y;使用SAS函數。leastmin(sum(of x1-x10),y);例中,兩段程序的結果相同,第二段只有一個語句,非常簡單。函數自變量自變量類型: 變量名;

3、 常數; 函數; 表達式。例3.4 函數及其自變量類型舉例。 自變量個數: 有些函數不需要自變量,有些只需要一個自變量,有些函數有多個自變量。SAS9.1中,自變量個數不能超過32767。 如果函數的自變量是表達式,在函數被調用之前,所有表達式自變量首先計算。自變量表示法:當函數有多個自變量時,必須用逗號分隔開。自變量名縮寫方法: 函數名(OF變量名1變量名n ) 例3.5 正確與錯誤的表示方法。例3.6 數組元素自變量的縮寫方法。array y10 y1-y10; /*定義數組y10 */x=sum (of y*);z=sum (of y1-y10);例中,兩個SUM函數的表示法是等價的。

4、函數結果通常函數的結果由其自變量的屬性決定: 自變量是字符時結果變量為字符; 自變量是數值時結果變量為數值。PUT函數是一個例外,它不管自變量是什么類型,其結果總是字符值。根據缺省規(guī)則,對大多數函數來說,數值目標變量的長度是8,字符目標變量的長度沒有缺省規(guī)則 。目標變量長度不用缺省規(guī)則的函數見課本表3.1。用PUT語句在LOG窗口顯示函數值例3.7 顯示概率值和分位數。data;Y=probnorm(1.96); /* 標準正態(tài)分布小于1.96的概率 */put Y;q1=tinv(.95, 2); /*自由度為2的t分布的0.95分位數*/q2=tinv(.95, 2, 3); /*自由為2

5、,非中心參數為3的t分布的0.95分位數*/put q1= q2=;run;0.9750021049q1=2.9199855804 q2=13.894376071日期時間函數 SAS日期和時間存貯標準是以1960年1月1日0時0分0秒為起點,然后以相應的間隔記時。如1960年1月1日9時0分,按日記的數值就是0,按小時記的數值就是9。1960年1月2日0時0分,按日記的數值就是1,按小時記就是24等。 由于日期函數是一類非常重要的函數,特別是對金融數據處理和金融計算,借助日期函數可以極大提高效率。應用舉例 例3.8 計算兩個日期之間的天數。data _null_;sdate=01jan2002

6、d;edate=01jan2003d;actual=datdif(sdate, edate, act/act); /*按每個月的實際天數算 */days360=datdif(sdate, edate, 30/360); /*按每個月30天計算 */put actual= days360=;run;data _null_;actual=datdif(01jan2002d, 01jan2003d, act/act);days360=datdif(01jan2002d, 01jan2003d, 30/360);put actual= days360=;run;例中,兩段程序的結果一樣。actual=

7、365, days360=360.例3.10 以日為單位計算當前日期的天數。data;x=date (); y=today();put x= y=;run;例中,DATE()和TODAY()結果一樣,都是返回當天的天數。當然,也可以用一定的日期格式表示它們。data;x=date (); y=today();format x y yymmdd10.;put x= y=;run;結果顯示:x=17232 y=17232結果顯示:x=2007-03-07 y=2007-03-07例3.12 計算日期值所在的年季月以及處于某月的第幾天。data a;set ResDat.stk000001 (obs

8、=10);keep date year qtr month day;year=year (date);qtr=qtr (date);month=month (date);day=day (date);proc print noobs;run; Date year qtr month day1991-01-02 1991 1 1 21991-01-03 1991 1 1 3 1991-01-04 1991 1 1 4 1991-01-05 1991 1 1 5 1991-01-07 1991 1 1 7 1991-01-08 1991 1 1 8 1991-01-09 1991 1 1 9 19

9、91-01-10 1991 1 1 10 1991-01-11 1991 1 1 11 1991-01-12 1991 1 1 12例3.14 將日期時間值換算為以秒計數的計算方法。data;mdy=mdy (08,18,2001); put mdy=;format mdy yymmdd10.;hms=hms (21,50,51); put hms=;x=21*60*60+50*60+51; put x=;dhms=dhms (date (), 21,50,51); put dhms=;dhms=dhms (15263,21,50,51); put dhms=;y=15263*24*3600+

10、x; put y=;run;結果顯示:mdy=2001-08-18hms=78651x=78651dhms=1347832251dhms=1318801851y=1318801851 概率分布函數標準正態(tài)分布 PROBNORM(X)計算標準正態(tài)分布隨機變量小于X的概率。 例3.15 計算三個特殊的正態(tài)概率值。data;P1=probnorm(0);P2=probnorm(1.96);P3=probnorm(2.5758293);put P1= P2= P3=;run;結果顯示:P1=0.5P2=0.9750021049P3=0.9949999999樣本統(tǒng)計函數 樣本統(tǒng)計函數在實際中的用處不是很

11、大,因為應用這些函數時,一定要把樣本的觀測數據放在同一行才可以,現實中樣本的觀測數據卻往往是按一列一列排的。一般情況下,求變量X的樣本統(tǒng)計函數值時要用別的方法。樣本統(tǒng)計量函數共有15個。 均值 MEAN(of xl-xn) 或 MEAN(x,y,z, )計算非缺失自變量的算術平均。自變量中至少有一個非缺失值。 求和 SUM(of xl-xn) 或 SUM (x1,x2, )計算自變量的和。要求有兩個以上自變量。 方差 VAR(of xl-xn) 或 VAR (x1,x2, )計算自變量中非缺失值的方差。要求至少有兩個自變量。 隨機數函數 SAS系統(tǒng)提供11種隨機數函數。由于隨機數函數是進行隨機

12、模擬的基礎,這里我們通過例子,給出每種隨機數發(fā)生程序,供讀者參考。 正態(tài)分布 例3.27 用函數RANNOR產生正態(tài)分布隨機數。data RV;retain _seed_ 0; /*retain 賦初值0給_seed_*/mu=0;sigma=1; do _i_ = 1 to 1000;Normal1 = mu + sigma * rannor(_seed_); /*均值為mu,標準差為sigma*/output;end;drop _seed_ _i_ mu sigma;run;Normal1-0.9721-0.70001-2.34007-0.10939-0.01883-0.641540.81

13、87660.221107例3.28 用函數NORMAL產生正態(tài)分布隨機數。data RV;retain _seed_ 0;mu=0;sigma=1;do _i_ = 1 to 1000;normal1 = 0 + 1 * normal(_seed_);/*均值為mu,標準差為sigma*/output;end;drop _seed_ _i_;run;均勻分布 例3.29 用函數RANUNI產生均勻分布隨機數。data RV1; retain _seed_ 0; a=-1; b=2; do _i_ = 1 to 1000;uniform1 = a + (b-a) * ranuni(_seed_)

14、; /*區(qū)間a, b上的均勻分布*/output;end;drop _seed_ _i_;run;例3.30 用函數UNIFORM產生均勻分布隨機數。data RV1; retain _seed_ 0; a=-1; b=2; do _i_ = 1 to 1000;uniform1 = a + (b - a) * uniform(_seed_); /*區(qū)間a, b上的均勻分布*/output; end; drop _seed_ _i_;run; 隨機數函數自變量SEED 隨機數函數使用一個自變量SEED來選擇產生隨機數的初始種子值,由這個值開始產生隨機數流。自變量SEED的取值和初始化類型如下表

15、列出。 表3.4 SEED取值與初始化類型 產生隨機數的過程中,自變量SEED的值保持不變,種子則不斷變化。所以,用隨機函數產生隨機數時,不能控制種子的值,因此也不可能控制初始化之后的隨機數。如果要控制隨機數流,就要用隨機數函數的CALL子程序。 SAS CALL 子程序 SAS系統(tǒng)提供一系列CALL子程序,用于產生隨機數或執(zhí)行其它的系統(tǒng)功能,詳見表3.5,3.6。 隨機數子程序 用隨機數子程序可以更好地控制種子流和隨機數流。除NORMAL和UNIFORM這兩個函數之外,所有隨機數函數都有一個相應的子程序。CALL語句激活隨機數子程序的格式為:CALL routine (seed, varia

16、te);選項說明: 使用CALL子程序時,首先要對SEED變量賦初值。同時產生幾個隨機數流時,用CALL子程序比用隨機函數的效果更好。因為,用隨機數函數同時創(chuàng)建的多個隨機數變量都屬于同一個隨機數流。 例3.38 使用隨機函數產生兩個隨機數變量屬于同一個隨機數流。data RV;retain seed1 seed2 161321804;do I=1 to 5;x1= ranuni(seed1);x2= ranuni(seed2);output;end;options nocenter;proc print;run;例中,SEED1和SEED2的初值相同,但X1和X2的第一個觀測值卻不相同。因為,

17、SEED2的值在這里不起作用,X2的第一個值并不是由SEED2產生的,而是產生第一個X1后一個新種子的結果。所以,這里產生的兩個隨機數變量屬于同一個隨機數流。 結果顯示:Obs seed1 seed2 I x1 x2 1 161321804 161321804 1 0.43617 0.64888 2 161321804 161321804 2 0.34138 0.42729 3 161321804 161321804 3 0.43237 0.63834 4 161321804 161321804 4 0.74690 0.89710 5 161321804 161321804 5 0.13630

18、 0.19031例3.39 使用CALL子程序產生兩個獨立的種子流和隨機數流。data RV;retain seed3 seed4 135279821;do I=1 to 5;call ranuni(seed3, X3);call ranuni(seed4, X4);output;end;proc print;run;例中,產生兩個獨立的種子流和隨機數流。因為SEED3=SEED1,所以X3表示的隨機數流就是X1和X2組成的隨機數流。使用CALL語句時隨時可以看到當前的種子值,用隨機數函數則看不到。 結果顯示:Obs seed3 seed4 I X3 X41 936674311 7241963

19、33 1 0.43617 0.337232 1393460745 1733883844 2 0.64888 0.807403 733112270 1200908019 3 0.34138 0.559224 917607517 674688435 4 0.42729 0.314185 928513130 1646762308 5 0.43237 0.76683第4章 訪問外部數據文件清華大學經管學院 朱世武ZhushwResdat樣本數據:SAS論壇: 本章內容通過IMPORT過程導入外部數據文件;通過LIBNAME語句和庫引擎連接外部數據文件;通過SAS/ACCESS軟件訪問外部數據文件;通過

20、ODBC或遠程軟件平臺訪問外部數據文件;創(chuàng)建SAS數據集方法總結。 注意:本章的一些例子需要較為復雜的軟硬件環(huán)境,可能無法在單個PC機上實現操作。 訪問兩類外部文件 SAS系統(tǒng)訪問的外部文件可以分為兩類: PC格式的數據文件; 流行數據庫(DBMS)文件。 訪問外部數據文件方法 除了前面兩章介紹的讀入外部數據文件的方法外,SAS系統(tǒng)訪問外部文件,特別是流行數據庫文件的方法還有以下幾種。 通過IMPORT過程; 通過LIBNAME語句和庫引擎; 通過ACCESS過程; 通過ODBC或遠程軟件平臺。通過IMPORT過程 IMPORT過程可以導入的外部數據文件: PC格式的數據文件; 以固定字符為字

21、段分隔符的文本文件。 句法與選項說明 PROC IMPORT DATAFILE=filename“ | TABLE=tablename OUT=SAS-data-set ; 選項說明: 應用舉例 例4.1 導入EXELL數據表。proc import out=tb31datafile= D:ResDattable.xlsdbms=excel2000 replace;range=3#1$; /*導入表3.1 */getnames=yes;run;例4.2 從文本文件的第二行導入數據。proc import out=b_share_1datafile= D:ResDatb_shares_1.txt

22、dbms=dlm replace;getnames=no;datarow=2;run;通過LIBNAME語句和庫引擎 通過LIBNAME語句和庫引擎連接的外部文件有兩類: 其它SAS版本或分析軟件的數據集; 流行數據庫(DBMS)。語句格式: LIBNAME libref SAS/ACCESS-engine-name ; SAS8.2系統(tǒng)支持的庫引擎 讀入其它版本或分析軟件數據集 可以通過菜單建立新邏輯庫和利用LIBNAME語句連接其它SAS版本或分析軟件的數據集。例4.5 連接SAS6版本數據集。libname datav6 V6 d:ResDat;run;例4.6 連接SPSS數據集。li

23、bname spss spss d: ResDat ;run;讀入流行數據庫(DBMS) 讀入流行數據庫時需要知道這些數據庫的簡單操作。同樣可以通過菜單建立新邏輯庫和利用LIBNAME來實現。例4.7 用LIBNAME建立與ORACLE DBMS的連接。libname oralib oracle user=ZSW password=ZSW321path=ora7db dbindex=y;例4.8 取消邏輯庫指定。libname oradb clear;例4.9 與DB2的連接。libname db2lib db2 authid=ZSW ssid=ZSW321;通過ACCESS過程 通過ACCE

24、SS過程可以實現對外部數據文件的透明訪問和讀寫。SAS/ACCESS可以訪問的主要外部數據文件: ACCESS過程訪問外部數據須分兩步完成: 創(chuàng)建訪問描述器(Access Descriptor); 創(chuàng)建基于外部數據文件的數據視窗(View)。ACCESS過程訪問外部數據流程圖 其它平臺數據庫文件訪問描述器Access數據視圖SAS程序Access數據視圖Access數據視圖 SAS系統(tǒng)通過不同的方法建立不同的數據視窗,除了這里用ACCESS過程建立ACCESS視窗外,還有用數據步和SQL過程建立的視窗。它們都能透明訪問不同平臺上的數據對象。 創(chuàng)建訪問描述器 語句格式:PROC ACCESS D

25、BMS=DBF|DIF|WKn|XLS|; CREATE libref.member-name.ACCESS; required database-description statements; optional editing statements; RUN;創(chuàng)建訪問描述器的SAS程序對于不同的外部文件有不同的形式。下面給出幾種外部文件訪問描述器的創(chuàng)建方法。 由DBF文件創(chuàng)建訪問描述器的一般格式:PROC ACCESS DBMS=DBF; CREATE 邏輯庫名.訪問描述器名.ACCESS; PATH=DBF文件的地址和全名;Run;由EXELL表創(chuàng)建訪問描述器的一般格式:PROC ACCE

26、SS DBMS=XLS; CREATE 邏輯庫名.訪問描述器名.ACCESS; PATH=XLS文件的地址和全名; /*規(guī)定運行時在LOG窗口顯示列的信息 */RUN;由ORACLE數據庫創(chuàng)建訪問描述器的一般格式:PROC ACCESS DBMS=Oracle; CREATE 邏輯庫名.訪問描述器名.ACCESS; USER=Oracle用戶ID;ORAPW=Oracle服務器上的用戶密碼;TABLE=Oracle表名;PATH=Oracle驅動器、結點和表的別名或庫名;RUN;例4.10 由XLS表創(chuàng)建訪問描述器RESDAT.S000001.ACCESS。 proc access dbms=

27、xls; create work.s000001.access; path=D:ResDatstk000001.xls; getnames yes; scantype=yes; list all; run;例4.11 由DBF文件創(chuàng)建訪問描述器RESDAT.A600002.ACCESS。 proc access dbms=dbf; create resdat.stk000002.access; path=D:resdatstk000002.dbf; list all; run; 創(chuàng)建數據視窗 通?;谝粋€訪問描述器可以創(chuàng)建多個數據視窗。SAS數據視窗(View)和SAS數據集(Data)都是數

28、據文件,均可以作為數據對象被引用。雖然類型不同,但在同一邏輯庫中名稱不能重復。 創(chuàng)建基于訪問描述器數據視窗的語句格式PROC ACCESS DBMS=DBF|DIF|WKn|XLS| ACCDESC=libref.access-descriptor; CREATE libref.member-name.VIEW; SELECT column-list; optional editing statements; RUN;創(chuàng)建基于訪問描述器的數據視窗的一般格式PROC ACCESS DBMS=數據庫類型ACCDESC=訪問描述器名; CREATE 邏輯庫.視窗名.VIEW; SELECT ALL|DBMS表的列名; RUN;當然,對于不同的DBMS還有許多不同的控制語句。 同時創(chuàng)建訪問描述器和數據視窗的語句格式PROC ACCESS DBMS=DBF|DIF|WKn|XLS|;CREATE libref.me

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論