第5講LIBAMNE語句建立一個SAS臨時邏輯庫和外部庫間的聯_第1頁
第5講LIBAMNE語句建立一個SAS臨時邏輯庫和外部庫間的聯_第2頁
第5講LIBAMNE語句建立一個SAS臨時邏輯庫和外部庫間的聯_第3頁
第5講LIBAMNE語句建立一個SAS臨時邏輯庫和外部庫間的聯_第4頁
第5講LIBAMNE語句建立一個SAS臨時邏輯庫和外部庫間的聯_第5頁
已閱讀5頁,還剩8頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

1、第 5 講LIBAMNE 語句建立一個 SAS 臨時邏輯庫和外部邏輯庫間的聯系。LIBAMNE 語句的一般內容是:LIBNAME ,“邏輯庫名”, 數據引擎名 和被導入邏輯庫地址,“;號”。當讀入SAS 的“已定變量數據體”文件時可以不寫數據引擎,這時默認數據引擎 V9。“邏輯庫名”就是所形成SAS 邏輯庫名。例如想把d:winu 中SAS “已定變量數據體”文件examp1 導入 SAS,可用語句 libname ww v9 d:winu;該語句含義是建立 SAS 邏輯庫 ww,它和 D 驅文件 winu 庫聯系,所通過數據引擎是V9。這時如果想把 D:winu 的文件 examp1 導入,

2、SAS 自動通過數據引擎把d:winu 的文件 examp1 聯系所謂 SAS 文件 ww.examp1(ww.examp1 是SAS 文件,該文件實體不在SAS 系統,但是通過數據引擎可以在 SAS 內使用),為了 d:winu examp1 不被改變,用SAS 語句 set ww.examp1;就能把 d:winu 文件 examp1 拷為臨時文件。例 3.10D 驅上文件wu 中SAS 數據集文件 pdv2,將之存于臨時文件 test1。解 可以使用程序libname lib v9 d:wu; /*建立 SAS 邏輯庫 lib,數據引擎是 SAS 的 v9,v9 可以省略,被聯系的數據庫

3、是d:wu */daest1; /*建立臨時 SAS 數據集 test1*/set lib.pdv2;/*將“已定變量數據體”文件 d:wu pdv2 拷入 SAS 臨時數據集test1 這是名義拷*/proc prrun;daest1;/*數據集 test1 的值打印在輸出窗口*/練習題 3 將d:wu 中SAS 的“已定變量數據體”文件 d:wu sastest 導入SAS 形成臨時文件test3 并且打印.有時通過數據引擎聯系的外部文件太大,變量很多,只想拷出少量變量。但又不能確定數據集中變量的名稱和順序,可以用 CONTENTS 過程的的 VARNUM 選項來查看。下面的代碼列出了or

4、acle(甲骨文)數據庫中文件 sale 的變量名libname oralib oracle user=myusw=mypwpath=ora_dbms preserve_tab_names=yesconnection=sharedread schema=myschema;/*建立 SAS 與 oracle 數據庫聯系,SAS 邏輯庫名是 oralib,數據引擎是 oracle*/proc contents data=oralib.sale varnum;/*打印 oracle 數據庫中文件 sale 的變量名*/ run;練習題 2 用contens 過程求出“已定變量數據體”文件 d:wu

5、sastest 的變量名。3.6 時間變量的輸入格式SAS 的一個特點是能夠把時間(年月日,時分秒)化為數值。時分秒也可以化為數,常用的是按日化為整數。1960 年 1 月 1 日為 0,也就是說 1959 年 12 月 31 日為-1,之前負的月 2 日為 1。為了讓 SAS 知道當你應當按照規定“替換格式”將時間輸入:, 1960 年 1表 3-10 常用日期的替換格式輸入字符串替換格式日期函數值例 3.11 若兒子和父親的出生日期是變量 date 的兩次觀測值,另有兩個變量 high,weight 表示出生時身高(厘米)和體重(克),數據如表 3-11。編程算出這兩個日子之間有多少天,父

6、子身高和體重的差異。表 3-11 父子出生數據05/13/2015 78 4.2806/22/1980 69 3.88解 考慮到時間是按照月日年順序排列,可用程序data w;input date:mmddyy10. high weight;/*變量 date 的數據是月,日,年,共占 10 列*/ cards;05/13/2015 78 4.2806/22/198069 3.88;proc pr run;提交后得到Obsdatehighweight1220221747878694.283.88可見 06/22/1980 是 1960 年 1 月 1 日后的 7478 天;05/13/2015

7、 是年 月 日后的天,所以父親比兒子早出生 12743 天,出生時矮 9 公分,輕 0.4 公斤。另外一種常用的年月輸入格式是:月的 3 個字母簡寫(mon),年(yy)的組合后跟字符寬“7.”,這時沒有指名具體時間,SAS 不是以月為 ,而是 SAS 自動以該月的第 1 天作為計算日期。data w;input date:monyy7. x; cards;jun1990 1.5 may2010 2.3;proc prrun;提交程序后得到Obsdatex19jul1984Date9.896619-07-1984ddmmyy10.896607/19/1984mmddyy10.896607-19

8、-1984mmddyy10.89661211109183831.52.3練習題 計算在SAS 系統中公元 1919 年 5 月 4 日對應的數是多少。第 4 章 預處理 SAS 數據集為了更好地分析原始數據,往往需要對原始數據作出預處理,即對原始數據初步加工和整理。例如逐日降雨數據僅需要把某個氣象站資料挑出,也可能把某幾個站的降雨量加起來,或平均。增加和減少變量(以及相應觀測值)都屬于數據集的預處理。2 月也有 31 天,要把多余 3 天數據刪去。減少觀測值也屬于數據集的預處理。賦值語句是最常用的增加變量的語句4.1.1 一般賦值語句例 2.2 的 SAS 程序data salary;/* 建

9、立名為 salary 的 SAS 數據集,其內容由以下的SAS 代碼補充*/input mingzi$ gonghao jiben gangtie jiangjin ;/*建立變量 mingzi,gonghao,jiben, gangtie,jiangjin;分別表示名字,工號,基本工資,崗位津貼,獎金,mingzi 后跟符號 “$”表示該變量的值是字符串,讀入數據時按照 mingzi,gonghao,jiben,gangtie,jiangjin的順序*/heji=jiben+gangtie+jiangjin;/*賦值語句,建立變量 heji(毛收入),變量 heji =基本工資+崗位津貼+獎

10、金*/if heji1600 then koushui=(heji-1600)*0.2; /*賦值語句,若毛收入大于 1600,建立變量koushui(扣稅),變量 koushui 值=heji*0.2*/else koushui=0; /*賦值語句,若毛收入不大于 1600,變量 koushui 值=0*/ shifa=heji-koushui;/*賦值語句,建立變量 shifa(實發),變量 shifa=毛收入-扣稅*/datalines;/*以下是數據行*/217 500300 300335 800 400 500442 1000500 800;其中包含以下 4 條賦值語句heji=ji

11、ben+gangtie+jiangjin;/*功能是:建立變量 heji(毛收入),變量 heji =基本工資+崗位津貼+獎金*/if heji1600 then koushui=(heji-1600)*0.2; /*功能是:若毛收入大于 1600,建立變量 koushui(扣稅),變量 koushui=heji*0.2*/else koushui=0; /*功能是:若毛收入不大于 1600,建立變量 koushui(扣稅),變量 koushui=0*/shifa=heji-koushui;/*功能是:建立變量 shifa(實發),變量 shifa=毛收入-扣稅*/第 1 條賦值語句建立變量

12、heli,它表示公司所發各項錢款數;第 2,3 條賦值語句用 if-else 語句建立變量 koushui,它表示每位員工所得稅數額,第 4 條賦值語句建立變量 shifa,它表示扣除所得稅后實發給職員薪金。這 4 條語句使數據集比原始數據(表 2-1)增加 3 個變量。賦值語句是最常用的 DATA 步語句,使用賦值語句能在 SAS 數據集中增加新的變量,該變量的值一般由原變量的值計算得到,也可以另外賦值(見補充練習題)。賦值語句由變量+等號+表達式組成,如 y=x1+2.5*x2+x3+2.5。這條賦值語句的作用是產生新的變量 y,其每次觀察值由相應 x1,x2,x3 觀察值計算。直觀的說,

13、原有數據體是一個長方形,賦值語句加寬數據體。賦值語句也可以采用替換語句形式,例如某地降雨數據中缺失的數據全用 3 萬多的數表示,在計算時應當標明為英文句點??梢杂肐f rainfall30000 then rainfall=.;補充例 3.1 將 rainfall.txt 中大于 30000 的書改為“缺失”。data rain1;input no year month ; do t=1 to 31;input rainfall ;if rainfall30000 then rainfall=.; output;end;datalines;00 327000009 5669191 327002

14、1 3270000 327000 30733413932553 327004 32700157 920003877000 56739 19511018957533235372 156410126 32004137 3200115 3200200045194 3200200 3200300 56748 195110140492323184454700 3270000039000222000000 567511516011230 327004100010032700280348821940 3270011190 3200102000000 3200101000 327000056793 19511

15、024311458001000000001120 005314520003 32700317 327002800000240000 32700 00 32700000000 56985104870286517656651 195110212287752802 3270000 3270000000000 57016 1951100003105500007961200 3270000 327000 57036 195110000 3270042 327000 3200100 57073 1951100000 327007000000000005700000000 57083 1951100000

16、3270070000000000035686100000000005709132700000000000001012115000000000005712771 1334000 320020 32001710 3200100501100000000057206000095 32700000457800 327000 320010070 ; proc pr; run;Data 步賦值語句中不僅可以使用加減乘除,還可以使用多種數學函數,金融函數,隨機函數,還可使用時間序列函數。這些函數表在朱世武SAS 編程技術的附錄中可以找到。這兒首先介紹時間序列的 1 種函數 dif,時間序列函數 dif(x)是

17、變量 x 每個觀測值減去前一觀測值的差,它可以在朱世武書的表 A.10 中查到。SAS 介紹多種函數,包括數學函數,金融函數,概率函數(密度和分布函數),隨機數函數等。從朱世武書中表 A.4-8 中能很方便地查找,細節可以從“幫助(help)SAS 幫助與文 檔 (SAShelpands)SASProductsBaseSASSASLanguagiDictiongaryDictionary of Language ElementaryFunction and Call Routines”中尋找。僅介紹 2 個1 數學函數大小寫不分補充例 3.2 畫出函數求y=sin(x*2+2)從 0 到 2

18、的值,間隔 0.05;放在臨時數據集 w 中,圖形,曲線采用青色。解 畫圖要求出圖上點的解 可以采用程序Data w;坐標,就要求出 x 和 y=sin(x*2+2)從 0 到 2 的值04 3270000000000240057006120000003740000131136945 320020Do x=0 to 2 by 0.05;/*x從0到2,步長0.05取值*/ y=sin(2*x*2+2); /*對每一x求出相應y的值*/ output; /*將xy的每一對值輸入數據集w*/end;proc pr;run;得到用它可以畫圖Proc gplot data=w; /*用數據集w的數據體

19、畫圖*/ Symbol i=join c=cyan; /*點之間直接連接,圖形青色*/ plot y*x; /*以y的值為縱坐標,x的值為橫坐標*/Run;data w; pi=arcos(-1);do x=0 to 2 by 0.1; y=tan(pi*x); output;end;proc gplot;symbol i=join c=green; plot y*x;run;出現問題:為什么:缺失數據被拋棄,剩下的連接。*/2 隨機數是Monte Carlo(隨機模擬)的基本工具,(例如模擬黑子,交通)SAS產生的隨機數質量特別好,特別是得到隨機數序列一般都不循環,即使序列很長;例如容易用

20、SAS 產生長為 1 千萬的隨機數序列,它不出現循環。SAS 的隨機數函數見朱世武表 A.8。例 4.3 給出產生正態隨機數的步驟。例 4.3 Monte Carlo 方法需要一個正態分布隨機數列,它由 100 個數組成,均值為 3,標準差為 2。用 SAS 產生它。解 產生隨機數必須有 1 個“SEED)”,可以是任選的一個 6 位整數。無妨設為 123456。由朱世武表A.8 或 SAS 幫助查到:正態隨機函數符號是 NORMAL(seed),它產生標準正態分布 N(0,1),為了使均值為 3,標準差為 2,需要把標準正態隨機數乘 2+3.于是可以采用程序如下:data random;/*

21、建立數據集random*/do t=1 to 100; /*作100次循環*/r=normal(123456); /*r是以123456為產生的標準正態隨機數*/x=2*r+3; /*x是均值為3,標準差為2的標準正態隨機數*/ output; /*將所得t,r,x存入數據集random*/end; /*結束循環*/proc prrun;noobs; /*打印數據集random,不要觀測值*/提交程序后得到trx123. 9899100-0.10948-0.348781.120252.781032.302435.240510.35705-1.033881.248123.714110.93223

22、5.49623這 100 個隨機數的頭是 2.78103,尾巴是 5.49623。用 means 過程可以看出它的均值和方差。Proc means data=random;/*調用 means 過程求均值*/ Var x; /*對變量 x 求均值*/Run;提交給中文SAS9.0 后得到分析變量:xN均值標準偏差最小值最大值1003 07645472 0233739-2 02753147 4784643可見這 100 個數的樣本均值是 3.0764547,樣本標準差是 2.0233739。取不同值,得到不同隨機數系列。練習題 2 生成 Poisson 隨機數,長度為 80,均值=6。提示 Po

23、isson 隨機數的 Poisson 隨機函數為 ranpoi(a,b),其中 a 是seed;b 是Poisson 分布的均值(參數)。可用如下程序。3 SAS/ETS 中可以查到時間系列函數.最常用的是 dif(x),它的值是每次觀測減去前一次的值。例 4.1 表 2-2 已給出連續 10 個交易日 3 種價較前一交易日漲跌數。x、y、z 價格。試計算每個交易日股解 計算每個交易日股價較前一交易日漲跌數可以使用函數 DIF(x),它的值等于每個觀測值序列中,觀測值減去前一觀測值的差。建立以下程序data stock;input date$ x y z;/*讀入變量 date xyz*/xd

24、if=dif(x);/* xdif 是ydif=dif(y); /* ydif 是zdif=dif(z); /* zdif 是x 比上一工作日上漲的價格*/y 比上一工作日上漲的價格*/ z 比上一工作日上漲的價格*/datalines; /*以下是數據體*/05/705/805/905/1005/1105/1405/1505/1605/1705/18;proc pr run;18.7319.8319.9918.9918.9817.9617.4418.6618.5819.2119.2419.3819.5219.4819.2718.9819.3119.4519.2620.2522.5323.55

25、22.8921.7822.2121.6521.4321.5221.8523.78;則 SAS 數據集 stock 存有 7 個變量的 10 次觀測,除了已有的 4 個變量外,又增加變量xdif,ydif,zdif;它們分別是語句打印出 SAS 數據集 stock 如下x,y,z 與上一工作日的差。提交程序,用 proc prObsdatexyzxdif ydif zdif105/718.7319.2422.53.205/819.8319.3823.551.100.141.02905/1718.5819.2621.85-0.08-0.190.331005/1819.2120.2523.780.6

26、30.991.93注意:這兒變量 date 未采用時間變量值的輸入格式,因而沒有變成整數,而保留字符串形式。xdif,ydif,zdif 就是 3 支的日漲幅。5 月 7 日的股價無法減去前一日的股價,因而該日 xdif,ydif,zdif 的值是空缺的。練習題發現自己兒子身高體重的一些增加多少。使用SAS 代碼計算之。如表 4-1,希望知道在相應時間段身高體重平均每天表 4-1兒子身高體重時間身高(cm)體重(kg)1980/01/2554.84.34.2 用 drop 或 keep 語句剔除變量有的時候感到某個 SAS 數據集變量太多,有些變量對于進一步分析和計算沒有用處,過多變量會造成麻

27、煩,特別在打印 SAS 時很不方便(SAS 在 output 窗口打印數據時每行最多能打印 256 個字符,每個空格也算 1 個字符,當字符超過 256 時,SAS 就會把一行數據化為多行輸出)。為此可以用 drop 或 keep 語句去除那些沒有用處的變量(自然也同時刪除它們的觀測值),僅保留關心的變量。drop 或keep 語句都放在 DATA 步程序前面,但是只在 SAS數據集全部形成后,才最后去除變量。直觀的說這兩個語句能剪裁 SAS 數據體。DROP 語句的一般形式是“DROP 變量名”。功能是去除DROP 后面所跟隨的變量。例如drop x y;功能是從數據集中去除變量 x 和y。

28、 DROP 語句在需要刪除的變量個數不多時常用。KEEP 語句的一般形式是“KEEP 變量名;”。功能是保留KEEP 后面所跟隨的變量,其它變量一概刪去。例如原有變量 X,Y,Z1-Z10,W;則 KEEP x y z2;功能是去除變量 Z1,z3-z10,W;僅保留變量 x,y 和 z2。KEEP 語句在保留的變量不太多,要刪去很多變量時常用。例 4.4 在例 4.1 中,SAS 數據集 stock 存有 7 個變量的 10 次觀測.如果只想看到每天股價的漲跌數。應當怎樣編程?解 可以用用DROP 語句 drop x y z;去掉變量 x y z。采用 keep 語句 keep date x

29、dif ydif zdif;保留變量 date xdif ydif zdif。這樣一來就能得到存有 4 個變量的 10 次觀測的同樣SAS 數據集。即用下列程序data stock;drop x y z;/*或 keep date xdif ydif zdif;*/ input date$ x y z;/*讀入變量 date xyz*/xdif=dif(x);/* xdif 是ydif=dif(y); /* ydif 是zdif=dif(z); /* zdif 是x 比上一工作日上漲的價格*/ y 比上一工作日上漲的價格*/z 比上一工作日上漲的價格*/datalines; /*以下是數據體*

30、/05/705/805/905/1005/1105/1405/1505/1605/1705/18;18.7319.8319.9918.9918.9817.9617.4418.6618.5819.2119.2419.3819.5219.4819.2718.9819.3119.4519.2620.2522.5323.5522.8921.7822.2121.6521.4321.5221.8523.78Proc pr;1980-04-0162.16.01981-04-1273.810.21982-03-2885.112.6Run;或data stock;keep date xdif ydif zdif

31、;input date$ x y z;/*讀入變量 date xyz*/xdif=dif(x);/* xdif 是ydif=dif(y); /* ydif 是zdif=dif(z); /* zdif 是x 比上一工作日上漲的價格*/ y 比上一工作日上漲的價格*/z 比上一工作日上漲的價格*/datalines; /*以下是數據體*/05/705/805/905/1005/1105/1405/1505/1605/1705/18;18.7319.8319.9918.9918.9817.9617.4418.6618.5819.2119.2419.3819.5219.4819.2718.9819.3

32、119.4519.2620.2522.5323.5522.8921.7822.2121.6521.4321.5221.8523.78Proc pr; Run;打印結果一樣4.3 用 SET 語句的obs 和 obs 選項,或 SET 語句配合 IF 語句刪減觀測行有時希望去除一些觀測值,例如 600 多站點降雨數據有 1300 萬次觀測,不便應用,如何從中找出需要的?就要刪去大量數據。通俗的說,刪減觀測行就是砍去一些數據行。這時可以用 SET 語句的obs=選項和 obs=選項剪切 SAS 數據集。也可用 SET 語句配合添加IF 語句砍去一些數據行。obs=選項和 obs=選項要放在在 SE

33、T 語句的括號內。obs=選項的一般形式是“obs=n”,含義是將所拷貝的 SAS 數據體前 n-1 行刪去。obs=選項的一般形式是“obs=m”,含義是將所拷貝的 SAS 數據集第m 行以后的數據行刪去。舉例說明這些選項的用法例 4.5 設已通過程序data w;input Nou$datalines;xyz;123a bc18.7319.8319.9919.2419.3819.5222.5323.5522.8945678910;d e f g a cd18.9918.9817.9617.4418.6618.5819.2119.4819.2718.9819.3119.4519.2620.2521.7822.2121.6521.4321.5221.8523.78得到 SAS 數據集 W 中有 5 個變量 no,u,x,y,z 的 10 次觀測。如果想得到數據集 w1,讓它只包含數據集w 的第 3 行以后部分,怎么用SAS 代碼實現?解 可用如下程序Data w1;Set w(Run;obs=3);提交程序后打印得到的 SAS 數據集 w1,就得到ObsNouxyz13c19.9919.52

溫馨提示

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

評論

0/150

提交評論