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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

SAS函數(shù)與CALL子程序第一頁,共57頁。SAS函數(shù)定義

SAS函數(shù)是一個子程序,對自變量返回一個結(jié)果值。SAS函數(shù)的形式:函數(shù)名(X1,X2,…)第一頁第二頁,共57頁。函數(shù)用于組合表達(dá)式可以簡化編程和統(tǒng)計(jì)計(jì)算例3.1表達(dá)式中用函數(shù)。dataa(keep=dateydmin);/*保留date,y,d,min四個變量*/setResDat.idx000001;y=year(date);/*函數(shù)year給出變量date年份*/d=weekday(date);/*函數(shù)weekday給出變量date在一周內(nèi)的哪一天*/min=min(sum(oppr,hipr,lopr,clpr),1000);run;例3.2條件語句中使用函數(shù)。dataa;setResDat.idx000001;whereyear(date)>1996;/*Where語句中使用Year函數(shù)*run;第二頁第三頁,共57頁。用函數(shù)處理多變量可以簡化程序例3.3用與不用SAS函數(shù)時的程序。不用SAS函數(shù)。totx=xl+x2+x3+x4+x5+x6+x7+x8+x9+x10;

iftotx<ythenleast=totx;elseleast=y;使用SAS函數(shù)。least=min(sum(ofx1-x10),y);例中,兩段程序的結(jié)果相同,第二段只有一個語句,非常簡單。第三頁第四頁,共57頁。函數(shù)自變量自變量類型:?變量名;?常數(shù);?函數(shù);?表達(dá)式。例3.4函數(shù)及其自變量類型舉例。

第四頁第五頁,共57頁。自變量個數(shù):有些函數(shù)不需要自變量,有些只需要一個自變量,有些函數(shù)有多個自變量。SAS9.1中,自變量個數(shù)不能超過32767。如果函數(shù)的自變量是表達(dá)式,在函數(shù)被調(diào)用之前,所有表達(dá)式自變量首先計(jì)算。自變量表示法:當(dāng)函數(shù)有多個自變量時,必須用逗號分隔開。自變量名縮寫方法:函數(shù)名(OF變量名1…變量名n)

第五頁第六頁,共57頁。例3.5正確與錯誤的表示方法。例3.6數(shù)組元素自變量的縮寫方法。arrayy{10}y1-y10;/*定義數(shù)組y{10}*/x=sum(ofy{*});z=sum(ofy1-y10);例中,兩個SUM函數(shù)的表示法是等價的。

第六頁第七頁,共57頁。函數(shù)結(jié)果通常函數(shù)的結(jié)果由其自變量的屬性決定:自變量是字符時結(jié)果變量為字符;自變量是數(shù)值時結(jié)果變量為數(shù)值。PUT函數(shù)是一個例外,它不管自變量是什么類型,其結(jié)果總是字符值。根據(jù)缺省規(guī)則,對大多數(shù)函數(shù)來說,數(shù)值目標(biāo)變量的長度是8,字符目標(biāo)變量的長度沒有缺省規(guī)則。目標(biāo)變量長度不用缺省規(guī)則的函數(shù)見課本表3.1。第七頁第八頁,共57頁。用PUT語句在LOG窗口顯示函數(shù)值例3.7顯示概率值和分位數(shù)。data;Y=probnorm(1.96);/*標(biāo)準(zhǔn)正態(tài)分布小于1.96的概率*/putY;q1=tinv(.95,2);/*自由度為2的t分布的0.95分位數(shù)*/q2=tinv(.95,2,3);/*自由為2,非中心參數(shù)為3的t分布的0.95分位數(shù)*/putq1=q2=;run;0.9750021049q1=2.9199855804q2=13.894376071第八頁第九頁,共57頁。日期時間函數(shù)SAS日期和時間存貯標(biāo)準(zhǔn)是以1960年1月1日0時0分0秒為起點(diǎn),然后以相應(yīng)的間隔記時。如1960年1月1日9時0分,按日記的數(shù)值就是0,按小時記的數(shù)值就是9。1960年1月2日0時0分,按日記的數(shù)值就是1,按小時記就是24等。由于日期函數(shù)是一類非常重要的函數(shù),特別是對金融數(shù)據(jù)處理和金融計(jì)算,借助日期函數(shù)可以極大提高效率。第九頁第十頁,共57頁。應(yīng)用舉例例3.8計(jì)算兩個日期之間的天數(shù)。data

_null_;sdate='01jan2002'd;edate='01jan2003'd;actual=datdif(sdate,edate,'act/act');/*按每個月的實(shí)際天數(shù)算*/days360=datdif(sdate,edate,'30/360');/*按每個月30天計(jì)算*/putactual=days360=;run;data

_null_;actual=datdif(‘01jan2002’d,‘01jan2003’d,‘a(chǎn)ct/act’);days360=datdif(‘01jan2002’d,‘01jan2003’d,‘30/360’);putactual=days360=;run;例中,兩段程序的結(jié)果一樣。actual=365,days360=360.第十頁第十一頁,共57頁。例3.10以日為單位計(jì)算當(dāng)前日期的天數(shù)。data;x=date();y=today();putx=y=;run;例中,DATE()和TODAY()結(jié)果一樣,都是返回當(dāng)天的天數(shù)。當(dāng)然,也可以用一定的日期格式表示它們。data;x=date();y=today();formatxyyymmdd10.;putx=y=;run;結(jié)果顯示:x=17232y=17232結(jié)果顯示:x=2007-03-07y=2007-03-07第十一頁第十二頁,共57頁。例3.12計(jì)算日期值所在的年季月以及處于某月的第幾天。dataa;setResDat.stk000001(obs=10);keepdateyearqtrmonthday;year=year(date);qtr=qtr(date);month=month(date);day=day(date);procprintnoobs;run;

Dateyearqtrmonthday1991-01-0219911121991-01-0319911131991-01-0419911141991-01-0519911151991-01-0719911171991-01-0819911181991-01-0919911191991-01-10199111101991-01-11199111111991-01-1219911112第十二頁第十三頁,共57頁。例3.14將日期時間值換算為以秒計(jì)數(shù)的計(jì)算方法。data;mdy=mdy(08,18,2001);putmdy=;formatmdyyymmdd10.;hms=hms(21,50,51);puthms=;x=21*60*60+50*60+51;putx=;dhms=dhms(date(),21,50,51);putdhms=;dhms=dhms(15263,21,50,51);putdhms=;y=15263*24*3600+x;puty=;run;結(jié)果顯示:mdy=2001-08-18hms=78651x=78651dhms=1347832251dhms=1318801851y=1318801851第十三頁第十四頁,共57頁。概率分布函數(shù)第十四頁第十五頁,共57頁。標(biāo)準(zhǔn)正態(tài)分布PROBNORM(X)計(jì)算標(biāo)準(zhǔn)正態(tài)分布隨機(jī)變量小于X的概率。例3.15計(jì)算三個特殊的正態(tài)概率值。data;P1=probnorm(0);P2=probnorm(1.96);P3=probnorm(2.5758293);putP1=P2=P3=;run;結(jié)果顯示:P1=0.5P2=0.9750021049P3=0.9949999999第十五頁第十六頁,共57頁。樣本統(tǒng)計(jì)函數(shù)樣本統(tǒng)計(jì)函數(shù)在實(shí)際中的用處不是很大,因?yàn)閼?yīng)用這些函數(shù)時,一定要把樣本的觀測數(shù)據(jù)放在同一行才可以,現(xiàn)實(shí)中樣本的觀測數(shù)據(jù)卻往往是按一列一列排的。一般情況下,求變量X的樣本統(tǒng)計(jì)函數(shù)值時要用別的方法。樣本統(tǒng)計(jì)量函數(shù)共有15個。

第十六頁第十七頁,共57頁。均值MEAN(ofxl-xn)或MEAN(x,y,z,…)計(jì)算非缺失自變量的算術(shù)平均。自變量中至少有一個非缺失值。

第十七頁第十八頁,共57頁。求和SUM(ofxl-xn)或SUM(x1,x2,…)計(jì)算自變量的和。要求有兩個以上自變量。

第十八頁第十九頁,共57頁。方差VAR(ofxl-xn)或VAR(x1,x2,…)計(jì)算自變量中非缺失值的方差。要求至少有兩個自變量。

第十九頁第二十頁,共57頁。隨機(jī)數(shù)函數(shù)SAS系統(tǒng)提供11種隨機(jī)數(shù)函數(shù)。由于隨機(jī)數(shù)函數(shù)是進(jìn)行隨機(jī)模擬的基礎(chǔ),這里我們通過例子,給出每種隨機(jī)數(shù)發(fā)生程序,供讀者參考。第二十頁第二十一頁,共57頁。正態(tài)分布例3.27用函數(shù)RANNOR產(chǎn)生正態(tài)分布隨機(jī)數(shù)。dataRV;retain_seed_0;/*retain賦初值0給_seed_*/mu=0;sigma=1;do_i_=1

to

1000;Normal1=mu+sigma*rannor(_seed_);/*均值為mu,標(biāo)準(zhǔn)差為sigma*/output;end;drop_seed__i_musigma;run;Normal1-0.9721-0.70001-2.34007-0.10939-0.01883-0.641540.8187660.221107……第二十一頁第二十二頁,共57頁。例3.28用函數(shù)NORMAL產(chǎn)生正態(tài)分布隨機(jī)數(shù)。dataRV;retain_seed_0;mu=0;sigma=1;do_i_=1

to

1000;normal1=0+1*normal(_seed_);/*均值為mu,標(biāo)準(zhǔn)差為sigma*/output;end;drop_seed__i_;run;第二十二頁第二十三頁,共57頁。均勻分布例3.29用函數(shù)RANUNI產(chǎn)生均勻分布隨機(jī)數(shù)。dataRV1;

retain_seed_0;a=-1;b=2;

do_i_=1

to

1000;uniform1=a+(b-a)*ranuni(_seed_);

/*區(qū)間[a,b]上的均勻分布*/output;end;drop_seed__i_;run;第二十三頁第二十四頁,共57頁。例3.30用函數(shù)UNIFORM產(chǎn)生均勻分布隨機(jī)數(shù)。dataRV1;

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;第二十四頁第二十五頁,共57頁。隨機(jī)數(shù)函數(shù)自變量SEED隨機(jī)數(shù)函數(shù)使用一個自變量SEED來選擇產(chǎn)生隨機(jī)數(shù)的初始種子值,由這個值開始產(chǎn)生隨機(jī)數(shù)流。自變量SEED的取值和初始化類型如下表列出。

表3.4SEED取值與初始化類型

產(chǎn)生隨機(jī)數(shù)的過程中,自變量SEED的值保持不變,種子則不斷變化。所以,用隨機(jī)函數(shù)產(chǎn)生隨機(jī)數(shù)時,不能控制種子的值,因此也不可能控制初始化之后的隨機(jī)數(shù)。如果要控制隨機(jī)數(shù)流,就要用隨機(jī)數(shù)函數(shù)的CALL子程序。

第二十五頁第二十六頁,共57頁。SASCALL子程序SAS系統(tǒng)提供一系列CALL子程序,用于產(chǎn)生隨機(jī)數(shù)或執(zhí)行其它的系統(tǒng)功能,詳見表3.5,3.6。

第二十六頁第二十七頁,共57頁。隨機(jī)數(shù)子程序用隨機(jī)數(shù)子程序可以更好地控制種子流和隨機(jī)數(shù)流。除NORMAL和UNIFORM這兩個函數(shù)之外,所有隨機(jī)數(shù)函數(shù)都有一個相應(yīng)的子程序。CALL語句激活隨機(jī)數(shù)子程序的格式為:CALL

routine(seed,<argument,>variate);選項(xiàng)說明:

使用CALL子程序時,首先要對SEED變量賦初值。同時產(chǎn)生幾個隨機(jī)數(shù)流時,用CALL子程序比用隨機(jī)函數(shù)的效果更好。因?yàn)?,用隨機(jī)數(shù)函數(shù)同時創(chuàng)建的多個隨機(jī)數(shù)變量都屬于同一個隨機(jī)數(shù)流。

第二十七頁第二十八頁,共57頁。例3.38使用隨機(jī)函數(shù)產(chǎn)生兩個隨機(jī)數(shù)變量屬于同一個隨機(jī)數(shù)流。dataRV;retainseed1seed2161321804;doI=1

to

5;x1=ranuni(seed1);x2=ranuni(seed2);output;end;optionsnocenter;proc

print;run;例中,SEED1和SEED2的初值相同,但X1和X2的第一個觀測值卻不相同。因?yàn)椋琒EED2的值在這里不起作用,X2的第一個值并不是由SEED2產(chǎn)生的,而是產(chǎn)生第一個X1后一個新種子的結(jié)果。所以,這里產(chǎn)生的兩個隨機(jī)數(shù)變量屬于同一個隨機(jī)數(shù)流。

結(jié)果顯示:Obsseed1seed2Ix1x2116132180416132180410.436170.64888216132180416132180420.341380.42729316132180416132180430.432370.63834416132180416132180440.746900.89710516132180416132180450.136300.19031第二十八頁第二十九頁,共57頁。例3.39使用CALL子程序產(chǎn)生兩個獨(dú)立的種子流和隨機(jī)數(shù)流。dataRV;retainseed3seed4135279821;doI=1

to

5;callranuni(seed3,X3);callranuni(seed4,X4);output;end;proc

print;run;例中,產(chǎn)生兩個獨(dú)立的種子流和隨機(jī)數(shù)流。因?yàn)镾EED3=SEED1,所以X3表示的隨機(jī)數(shù)流就是X1和X2組成的隨機(jī)數(shù)流。使用CALL語句時隨時可以看到當(dāng)前的種子值,用隨機(jī)數(shù)函數(shù)則看不到。結(jié)果顯示:Obsseed3seed4IX3X4193667431172419633310.436170.3372321393460745173388384420.648880.807403733112270120090801930.341380.55922491760751767468843540.427290.314185928513130164676230850.432370.76683第二十九頁第三十頁,共57頁。第4章訪問外部數(shù)據(jù)文件清華大學(xué)經(jīng)管學(xué)院朱世武Resdat樣本數(shù)據(jù):SAS論壇:第三十頁第三十一頁,共57頁。本章內(nèi)容通過IMPORT過程導(dǎo)入外部數(shù)據(jù)文件;通過LIBNAME語句和庫引擎連接外部數(shù)據(jù)文件;通過SAS/ACCESS軟件訪問外部數(shù)據(jù)文件;通過ODBC或遠(yuǎn)程軟件平臺訪問外部數(shù)據(jù)文件;創(chuàng)建SAS數(shù)據(jù)集方法總結(jié)。注意:本章的一些例子需要較為復(fù)雜的軟硬件環(huán)境,可能無法在單個PC機(jī)上實(shí)現(xiàn)操作。

第三十一頁第三十二頁,共57頁。訪問兩類外部文件SAS系統(tǒng)訪問的外部文件可以分為兩類:PC格式的數(shù)據(jù)文件;流行數(shù)據(jù)庫(DBMS)文件。

第三十二頁第三十三頁,共57頁。訪問外部數(shù)據(jù)文件方法除了前面兩章介紹的讀入外部數(shù)據(jù)文件的方法外,SAS系統(tǒng)訪問外部文件,特別是流行數(shù)據(jù)庫文件的方法還有以下幾種。通過IMPORT過程;通過LIBNAME語句和庫引擎;通過ACCESS過程;

通過ODBC或遠(yuǎn)程軟件平臺。第三十三頁第三十四頁,共57頁。通過IMPORT過程IMPORT過程可以導(dǎo)入的外部數(shù)據(jù)文件:PC格式的數(shù)據(jù)文件;以固定字符為字段分隔符的文本文件。第三十四頁第三十五頁,共57頁。句法與選項(xiàng)說明PROCIMPORTDATAFILE="“|TABLE="tablename"

OUT=SAS-data-set<DBMS=identifier><REPLACE>;選項(xiàng)說明:

第三十五頁第三十六頁,共57頁。應(yīng)用舉例

例4.1導(dǎo)入EXELL數(shù)據(jù)表。procimportout=tb31datafile="D:\ResDat\table.xls"dbms=excel2000replace;range="'3#1$'";/*導(dǎo)入表3.1*/getnames=yes;run;例4.2從文本文件的第二行導(dǎo)入數(shù)據(jù)。procimportout=b_share_1datafile="D:\ResDat\b_shares_1.txt"dbms=dlmreplace;getnames=no;datarow=2;run;第三十六頁第三十七頁,共57頁。通過LIBNAME語句和庫引擎通過LIBNAME語句和庫引擎連接的外部文件有兩類:其它SAS版本或分析軟件的數(shù)據(jù)集;流行數(shù)據(jù)庫(DBMS)。語句格式:

LIBNAMElibrefSAS/ACCESS-engine-name<SAS/ACCESS-engine-connection-options><SAS/ACCESS-engine-LIBNAME-options>;SAS8.2系統(tǒng)支持的庫引擎

第三十七頁第三十八頁,共57頁。讀入其它版本或分析軟件數(shù)據(jù)集可以通過菜單建立新邏輯庫和利用LIBNAME語句連接其它SAS版本或分析軟件的數(shù)據(jù)集。例4.5連接SAS6版本數(shù)據(jù)集。libnamedatav6V6

'd:\ResDat';run;例4.6連接SPSS數(shù)據(jù)集。libname

spss

spss

'd:\ResDat';run;第三十八頁第三十九頁,共57頁。讀入流行數(shù)據(jù)庫(DBMS)讀入流行數(shù)據(jù)庫時需要知道這些數(shù)據(jù)庫的簡單操作。同樣可以通過菜單建立新邏輯庫和利用LIBNAME來實(shí)現(xiàn)。例4.7用LIBNAME建立與ORACLEDBMS的連接。libnameoraliboracleuser=ZSWpassword=ZSW321path=ora7dbdbindex=y;例4.8取消邏輯庫指定。libnameoradbclear;例4.9與DB2的連接。libnamedb2libdb2authid=ZSWssid=ZSW321;第三十九頁第四十頁,共57頁。通過ACCESS過程通過ACCESS過程可以實(shí)現(xiàn)對外部數(shù)據(jù)文件的透明訪問和讀寫。SAS/ACCESS可以訪問的主要外部數(shù)據(jù)文件:

ACCESS過程訪問外部數(shù)據(jù)須分兩步完成:創(chuàng)建訪問描述器(AccessDescriptor);

創(chuàng)建基于外部數(shù)據(jù)文件的數(shù)據(jù)視窗(View)。第四十頁第四十一頁,共57頁。ACCESS過程訪問外部數(shù)據(jù)流程圖其它平臺數(shù)據(jù)庫文件訪問描述器Access數(shù)據(jù)視圖SAS程序Access數(shù)據(jù)視圖Access數(shù)據(jù)視圖SAS系統(tǒng)通過不同的方法建立不同的數(shù)據(jù)視窗,除了這里用ACCESS過程建立ACCESS視窗外,還有用數(shù)據(jù)步和SQL過程建立的視窗。它們都能透明訪問不同平臺上的數(shù)據(jù)對象。

第四十一頁第四十二頁,共57頁。創(chuàng)建訪問描述器語句格式:PROCACCESSDBMS=DBF|DIF|WKn|XLS|…;CREATElibref.member-name.ACCESS;requireddatabase-descriptionstatements;

optionaleditingstatements;RUN;創(chuàng)建訪問描述器的SAS程序?qū)τ诓煌耐獠课募胁煌男问健O旅娼o出幾種外部文件訪問描述器的創(chuàng)建方法。

第四十二頁第四十三頁,共57頁。由DBF文件創(chuàng)建訪問描述器的一般格式:PROCACCESSDBMS=DBF;CREATE邏輯庫名.訪問描述器名.ACCESS;PATH=’DBF文件的地址和全名’;Run;第四十三頁第四十四頁,共57頁。由EXELL表創(chuàng)建訪問描述器的一般格式:PROCACCESSDBMS=XLS;CREATE邏輯庫名.訪問描述器名.ACCESS;PATH=’XLS文件的地址和全名’;<GETNAME=Y|N>;<SKIPROWS=跳過開始的行數(shù)>;<RENAME=”列名”=SAS變量名>;<DROP列1列2…>;<LISTALL>;/*規(guī)定運(yùn)行時在LOG窗口顯示列的信息*/RUN;第四十四頁第四十五頁,共57頁。由ORACLE數(shù)據(jù)庫創(chuàng)建訪問描述器的一般格式:PROCACCESSDBMS=Oracle;CREATE邏輯庫名.訪問描述器名.ACCESS;USER=Oracle用戶ID;ORAPW=Oracle服務(wù)器上的用戶密碼;TABLE=Oracle表名;PATH=Oracle驅(qū)動器、結(jié)點(diǎn)和表的別名或庫名;<RENAME=”列名”=SAS變量名>;<DROP列1列2…>;<LISTALL>;RUN;第四十五頁第四十六頁,共57頁。例4.10由XLS表創(chuàng)建訪問描述器RESDAT.S000001.ACCESS。proc

access

dbms=xls;creatework.s000001.access;path='D:\ResDat\stk000001.xls';getnamesyes;scantype=yes;list

all;run;例4.11由DBF文件創(chuàng)建訪問描述器RESDAT.A600002.ACCESS。

proc

access

dbms=dbf;createresdat.stk000002.access;path='D:\resdat\stk000002.dbf';list

all;run;第四十六頁第四十七頁,共57頁。創(chuàng)建數(shù)據(jù)視窗通常基于一個訪問描述器可以創(chuàng)建多個數(shù)據(jù)視窗。SAS數(shù)據(jù)視窗(View)和SAS數(shù)據(jù)集(Data)都是數(shù)據(jù)文件,均可以作為數(shù)據(jù)對象被引用。雖然類型不同,但在同一邏輯庫中名稱不能重復(fù)。

第四十七頁第四十八頁,共57頁。創(chuàng)建基于訪問描述器數(shù)據(jù)視窗的語句格式PROCACCESSDBMS=DBF|DIF|WKn|XLS|…

ACCDESC=libref.access-descriptor;CREATElibref.member-name.VIEW;SELECTcolumn-list;

optionaleditingstatements

溫馨提示

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

評論

0/150

提交評論