中國醫藥大學生物統計中心 2013/April 提升 SAS 效率的小技巧 ( 一 ) 統計分析師嚴友君在使用 SAS 的時候, 效率的考量除了程式運行的時間, 還包括資料佔用的空間 暫存記憶體的使用量 程式的長度與易讀性等等 本主題將介紹一些初學者容易應用, 且在討論使用 SAS 處理 分析資料時

Similar documents
技 巧 5: 避 免 除 以 0 的 運 算 在 做 除 的 運 算 時, 先 檢 查 除 數 的 數 值, 避 免 有 除 以 0 的 情 況 若 運 算 中 除 數 為 0,SAS 會 在 LOG 中 註 記 提 醒 並 將 運 算 結 果 設 定 為 遺 漏 值, 減 慢 程 式 的 執 行


プリント

投影片 1

Microsoft PowerPoint - 07b1 Max and Sum.ppt [相容模式]

e yx = ( y / y) /( x / x) e yx

第一章.FIT)

大 綱 最 有 利 標 目 的 及 類 型 最 有 利 標 之 辦 理 方 式 準 用 最 有 利 標 取 最 有 利 標 精 神 最 有 利 標 之 類 型 及 其 相 關 規 定 適 用 最 有 利 標 準 用 最 有 利 標 及 取 最 有 利 標 精 神 作 業 程 序 及 實 務 分 析


第 一 节 认 识 自 我 的 意 义 一 个 人 只 有 认 识 自 我, 才 能 够 正 确 地 认 识 到 自 己 的 优 劣 势, 找 出 自 己 的 职 业 亮 点, 为 自 己 的 顺 利 求 职 推 波 助 澜 ; 一 个 人 只 有 认 识 自 我, 才 能 在 求 职 中 保 持

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1

tech_atmn_h1h4_E

ACI pdf

1406.indd

上图专刊2006-3AAA.doc

衡山靈學創始人 超越時代的靈學明師 許衡山 老師 許衡山老師 出生於西元 1942 年 於 1980 年代啟發先天眼竅 自證其道 了悟真理 許 老師首先發現 人人皆可開發出第三眼能力與靈性能量 並藉由系統化的研究 將種種 生命現象與宇宙真理做深入淺出的剖析 並為生命的最終意義指出一條明路 現代文明昌

第53期内页.cdr

슬로시티번역,더빙 등 보고서(중문)_두현.hwp

untitled


?



EP.pdf

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

ASP.NET MVC Visual Studio MVC MVC 範例 1-1 建立第一個 MVC 專案 Visual Studio MVC step 01 Visual Studio Web ASP.NET Web (.NET Framework) step 02 C:\M

Spyder Anaconda Spyder Python Spyder Python Spyder Spyder Spyder 開始 \ 所有程式 \ Anaconda3 (64-bit) \ Spyder Spyder IPython Python IPython Sp

勞動條件檢查執行重點(雲林)_ [相容模式]

醋 水 法 在 水 盆 內 放 入 約 七 分 滿 的 水 與 1/2 到 1 小 杯 的 醋 量, 將 髒 襪 子 浸 泡 一 晚, 隔 天 再 丟 入 洗 衣 機, 就 能 洗 得 相 當 乾 淨 醋 有 殺 菌 除 臭 和 漂 白 功 效, 使 用 過 的 醋 水, 還 可 清 理 地 板,

穨 PDF

Microsoft Word - 完全手冊-課程.doc

第一冊 第四章 分裂與再統一 班級 座號 姓吊

untitled

上海浦~1

汇集全球21位医生的经验和智慧,总结出最实用的专业建议,这些都是最值得你牢记的健康提醒

1 行 业 发 展 不 平 衡 我 国 房 地 产 中 介 服 务 业 起 步 较 晚, 专 业 分 工 程 度 和 国 外 发 达 国 家 相 比 还 有 很 大 差 距 房 地 产 中 介 服 务 行 业 的 发 展 水 平 与 房 地 产 开 发 行 业 的 市 场 化 水 平 密 切 相 关

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

SAS系統簡介

Microsoft Word - p11.doc

. Land Patterns for Reflow Soldering.Recommended Reflow Soldering Conditions (For Lead Free) TYPE PID0703 PID0704 PID1204 PID1205 PID1207 PID1209 L(mm

58 可 樂 雞 翼 土 匪 雞 翼 醉 香 雞 翼 變 化 料 理 PART 2 水 產 類 62 清 蒸 桂 花 魚 紅 辣 椒 蒜 蓉 蒸 䱽 魚 啤 酒 蒸 鱸 魚 64 煎 封 紅 衫 魚 糖 醋 煎 黃 魚 蒲 燒 秋 刀 魚 66 香 草 煎 三 文 魚 頭 日 式 汁 煮 油 甘 魚

停止喝過多的水 Q10

<CAAED4C2C6DFC6DA2E696E6464>

目 錄 1. 青 椒 炒 肉 絲 2 2. 茄 汁 燴 魚 片 3 3. 乾 煸 四 季 豆 4 4. 黑 胡 椒 豬 柳 5 5. 香 酥 花 枝 絲 6 6. 薑 絲 魚 片 湯 7 7. 醋 瓦 片 魚 8 8. 燜 燒 辣 味 茄 條 9 9. 炒 三 色 肉 丁 榨 菜 炒

碩命題橫式

ICD ICD ICD ICD ICD

1970 新技術的應用 X = 20 + B 13B δ13c X 1 X

2006..,1..,2.,.,2..,3..,3 22..,4..,4 :..,5..,5 :..,5..,6..,6..,8..,10 :..,12..,1..,6..,6.., ,5,:..,1 :..,1 :..,1 :..,2..,2..,3 :..,1 :..,1..,1.

封面-12

我 把 我 觉 得 书 中 有 用 的 技 巧 还 有 时 间 安 排 都 穿 插 在 这 篇 攻 略 里 了, 所 以 只 要 买 韩 国 人 编 的 模 拟 卷 就 行, 难 度 设 置 还 比 较 好 ( 就 是 上 面 列 的 第 三, 第 四 本 ) 7. 还 有 就 是 由 Lin Lo


中菲军事实力对比.中菲对峙起因诡异:中国在南海布局被菲律宾霸占的

Microsoft Word - ACL chapter02-5ed.docx

Microsoft PowerPoint - C_Structure.ppt

B 6 A A N A S A +V B B B +V 2

CU0594.pdf

TheSpriritAndTheLetter-Sept-2018_SCH.indd

IP Encoder 1 channel.book

第二章.FIT)

第5章修改稿

四川省普通高等学校

Microsoft Word - 100年業務專輯全文_定稿_

Microsoft Word - å�¦ä¹€å¿…å¾Šå’‹éłƒï¼‹å®ı稿;(.doc

Microsoft Word - ACI chapter00-1ed.docx

Oracle 4

CHAPTER VC#

學 過 程 技 能 中 是 重 要 的 一 環, 雖 然 控 制 變 因 的 課 程 要 進 入 小 學 階 段 才 會 接 觸, 但 我 們 嘗 試 讓 孩 子 在 科 學 遊 戲 中, 察 覺 到 不 同 的 條 件 會 影 響 比 賽 結 果, 進 而 讓 孩 子 把 這 些 條 件 一 一

1 1 Excel VBA 說明 ( ) (_) STEP4 Excel 2 STEP5 A1 1 B2 2 C3 3 STEP6 A1 STEP7 > > 1-11

Excel VBA Excel Visual Basic for Application

C/C++ - 字符输入输出和字符确认

( )... 5 ( ) ( )

Microsoft Word - template.doc

Microsoft Word - SDL600-zh-CN_V1.5.doc

(Microsoft Word - \245\274\244\300\246\250\301Z\260\252\247C13.doc)

歯WP02-12-부속물.PDF

Microsoft Word - _m30.doc

Viva! Soup Viva! Soup Viva! Soup Viva! Soup Viva! Soup Viva! Soup 前言 天天喝湯 天天幸福 每個人都有自己的療癒系 可能是聽音樂 看電影 讀小說 做保養 瘋狂購物 對於嗜吃如我者來說 食物就是最大的療 癒系 即使已經吃出一個圓滾滾的小

Microsoft PowerPoint - Class5.pptx

Microsoft Word - Delta Controller ASCII_RTU_TC

科学计算的语言-FORTRAN95

SA-DK2-U3Rユーザーズマニュアル

Microsoft Word - 生活禮儀柯友惠981

1-2 二元一次聯立方程式 21 例 1 代入法判斷二元一次聯立方程式的 { x3y5 2xy3 x1y2 x3y3 x2y1 xy 二元一次式 x y x+3y x-y x2y1 x2y1 { x3y5 2xy3 { 2x3y1 xy3 x2y1

<95BD90AC E E F1816A93648E718D CA48B868F8A8CA48B8694AD955C89EF8D A E706466>

extend

PK IBM Warren McCulloch Walter Pits MP 1949 Hebb Hebb Hebb 145

目 录 第 一 章 电 力 行 业 内 部 控 制 操 作 指 南 概 述... 1 第 二 章 内 部 控 制 规 范 体 系 建 设 与 运 行 第 三 章 内 部 环 境 建 设 第 一 节 组 织 架 构 第 二 节 发 展 战 略 第 三 节

上海市本科教学质量年度报告

File No. No. 2 No. 3 File No. CONFIDENTIAL 4 7 Chapter Chapter Chapter 3 3.

CONTENTS 訓 練 內 容 設 計 法 056 淡 季 期 的 訓 練 058 旺 季 期 的 訓 練 060 針 對 爬 坡 賽 的 訓 練 內 容 062 賽 後 的 資 料 分 析 PART4/ 鏑 木 毅 先 生 的 建 言 活 用 於 越 野 路 跑 的 心 跳 訓

穨2700使用手冊.doc

02 2 成立 Facebook 粉絲專頁 Facebook Facebook Facebook 1, Facebook Facebook 1 Facebook 2-21

Microsoft Word - 1- 封面

2/80 2

a b c d e f g C2 C1 2

穨control.PDF

LSC操作说明

3-2 連比例 連比的運算性質 a b c 0 a b c (a m) (b m) (c m

Progress Report of BESIII Slow Control Software Development

<4D F736F F F696E74202D20312EB9FEB6FBB1F5B9A4D2B5B4F3D1A7D5E7C1BCA3BAC3E6CFF2D1D0BEBFC9FAB8B4CAD4B5C4BDE1B9B9BBAFC3E6CAD4BFBCBACBCCBDCBF7D3EBCAB5BCF92E BBCE6C8DDC4A3CABD5D>

Transcription:

提升 SAS 效率的小技巧 ( 一 ) 統計分析師嚴友君在使用 SAS 的時候, 效率的考量除了程式運行的時間, 還包括資料佔用的空間 暫存記憶體的使用量 程式的長度與易讀性等等 本主題將介紹一些初學者容易應用, 且在討論使用 SAS 處理 分析資料時常被提到的幾個小技巧 我們可以經由 SAS 的 日誌 (LOG) 視窗知道程式執行的一些訊息, 來比較不同程式的執行結果 其中 是程式運算過程所花的時間, 而 是一個任務實際完成的時間, 此實際完成的時間則包含資料檔的讀寫及運算過程 因為以下提到的一些技巧不只探討程式運算, 也牽涉到資料存取的效率, 故本篇的比較將以 為主 本篇 ( 一 ) 主要是以 DATA step 時處理資料的技巧為主, 下篇 ( 二 ) 將針對 PROC step 的部 分介紹 1

技巧 1 : 控制變數的長度, 避免過多的空字元 在 SAS 中, 數字變數的長度預設為 8, 文字變數的長度預設為第一筆讀入資料的最適長 度 使用 SAS 默認預設的變數長度時, 常會因變數可能的最大長度並沒有默認預設長度 那麼長而增加了不必要的檔案空間 範例 1: 模擬一組數據共 2 千萬筆, 含 6 個變數 (I, x1 ~ x5), 存成資料檔 test / demo 其中已 知 x1 範圍為 0 ~ 99 的整數,x4 的範圍為 0 ~ 30 的整數,x5 為 0 或 1 程式 1: 效率較差 DATA test; DO i=1 TO 2*1E7; x1=floor(100*ranuni(0)); x2=25*rannor(0); x3=floor(50*rannor(0)); x4=ranbin(0, 30, 0.2); x5=rand("bern", 0.3); OUTPUT; END; PROC CONTENTS DATA=test; 程式 2: 效率較佳 DATA demo; DO i=1 TO 2*1E7; LENGTH x1 3; x1=floor(100*ranuni(0)); x2=25*rannor(0); x3=floor(50*rannor(0)); LENGTH x4 3; x4=ranbin(0, 30, 0.2); LENGTH x5 $1; x5=rand("bern", 0.3); OUTPUT; END; PROC CONTENTS DATA=demo; NOTE: The data set WORK.TEST has 20000000 observations and 6 NOTE: The data set WORK.DEMO has 20000000 observations and 6 2

24.86 1:34.68 27.06 23.00 資料檔大小 : 資料檔大小 : 由 SAS 自行設定變數的長度 本次執行, 完成此 Data step 實際花費 1 分 34.68 秒 令 x1, x4 為長度 3 的數字變數,x5 為長度 1 的文字變數 SAS 中數字變數最短長度為 3, 文字變數最短長度為 1 將 x5 視為 0 1 分類, 儲存為文字變數而非數字變數, 進而減少檔案大小 ( 數字變數因最短長度為 3 而需要較長的變數長度 ) 本次執行, 完成此 Data step 實際花費 27.06 秒 3

以下的範例將使用資料檔 demo, 資料型式如下 : 技巧 2 : 在 DATA step 中使用 WHERE 陳述式取代 IF 陳述式 在處理資料時, 若只需要保留部分符合所需條件的資料, 使用 WHERE 陳述式或 IF 陳述式都能達到此目的 WHERE 陳述式會先檢查資料是否符合 WHERE 陳述式, 若資料符合條件, 才會讀入 SAS 工作記憶體 (program data vector (PDV)) 並做接續的處理, 若不符合條件, 則不會讀入 SAS 工作記憶體 (PDV) IF 陳述式則是處理 SAS 工作記憶體 (PDV) 內的資料, 所以會先將所有資料讀入 SAS 工作記憶體 (PDV), 再做篩選 讀入 SAS 工作記憶體 (PDV) 內的資料若符合 IF 陳述式的條件則會被留下, 若不符合則丟棄 所以在大部分的一般情況下, 使用 WHERE 陳述式會較 IF 陳述式有效率 4

範例 2.a: 篩選資料庫 demo 中符合條件 x4>=10 的資料並存成 新資料庫 (slow / fast) 程式 1: 效率較差 DATA slow; IF x4 >= 10; 程式 2: 效率較佳 DATA fast; WHERE x4 >= 10 ; NOTE: There were 20000000 NOTE: There were 1221822 observations read NOTE: The data set WORK.SLOW has 1221822 observations and 6 10.65 2.74 讀取所有資料庫 demo 中的資料 (2 千萬筆 ) 進 入 SAS 工作記憶體 (PDV), 資料符合 x4>=10 才留下, 最後存入資料庫 slow 中 本次執行, 完成此 Data step 實際花費 10.65 秒 observations read WHERE x4>=10; NOTE: The data set WORK.FAST has 1221822 observations and 6 3.79 3.45 資料庫 demo 中的資料若符合 x4>=10 (1221822 筆 ) 才讀入 SAS 工作記憶體 (PDV), 再 存入資料庫 fast 中 本次執行, 完成此 Data step 實際花費 3.79 秒 需特別注意的是, 因為 WHERE 陳述式是在資料讀入前進行, 所以 WHERE 陳述式只能 處理已存在現有資料庫中的變數 若欲篩選的條件是跟據新變數, 則只能使用 IF 陳述式, 使用 WHERE 陳述式會造成錯誤 5

範例 2.b: 新變數 y2=x4 / 30, 篩選 y2 > 0.5 的資料, 再存入另一新資料庫中 錯誤程式 DATA error; y2 = x4 / 30; WHERE y2 > 0.5; 19 DATA error; 20 21 y2 = x4 / 30; 22 WHERE y2 > 0.5; ERROR: Variable y2 is not on file 23 NOTE: The SAS System stopped processing this step because of errors. WARNING: The data set WORK.ERROR may be incomplete. When this step was stopped 正確程式 DATA right; y2 = x4 / 30; IF y2 > 0.5; NOTE: The data set WORK.RIGHT has 1020 observations and 7 4.28 3.36 there were 0 observations and 7 資料庫 demo 中沒有變數 y2,where 陳述式找不到變數 y2 造成錯誤 此錯誤讓程序停止執行, 寫出的資料檔 error 觀查值個數為 0 資料庫 demo 讀入 SAS 工作記憶體 (PDV) 處理, 增加了變數 y2,if 陳述式進行 SAS 工作記憶體 (PDV) 中資料的篩選, 篩選出 1020 筆資料符合 y2>0.5 並寫出資料檔 right 6

技巧 3: 使用 KEEP= / DROP= 選項 在處理資料時, 將不會用到的變數刪除, 只留下需要的變數, 可減短資料讀取 / 寫入的時間並減少資料檔佔用的空間 使用 KEEP / DROP 陳述式或是 KEEP= / DROP= 選項都可以達到保留 / 刪除變數的目的, 在第 54 期的生統 e 報 SAS FAQ 007 : 如何有效率地使用 KEEP 與 DROP 已經有詳細的說明 其中以 在 SET 陳述式後加上 KEEP= / DROP= 選項 的做法最有效率, 可避免不需要的變數讀入 SAS 工作記憶體 (PDV), 並且只留下需要的變數在新的資料檔 範例 3: 建立一個新資料庫, 新資料庫中只需要 2 個變數, 變數 x4 變數 y3, 其中 新變數 y3=x4 / 30 程式 1: 效率較差 DATA big; y3 = x4 / 30; NOTE: The data set WORK.BIG has 20000000 程式 2: 效率 okay DATA okay_1; y3 = x4 / 30; keep x4 y3; NOTE: The data set WORK.OKAY_1 has 20000000 observations and 7 observations and 2 22.01 21.96 10.99 7.40 7

資料檔大小 : 資料檔大小 : 所有變數 (6 個 ) 由資料庫 demo 讀入 SAS 工作記憶體 (PDV), 處理完後新增一個變數, 共 7 個變數再全部寫入資料庫 big, 其中有 5 個變數不需要但依然留在資料庫 big 中 本次執行, 完成 Data step 實際花費 22.01 秒 所有變數 (6 個 ) 由資料庫 demo 讀入 SAS 工作記憶體 (PDV), 處理完後新增一個變數 KEEP 陳述式讓資料只留下變數 x4 及變數 y3, 再寫入資料庫 okay_1 雖然最後的 okay_1 資料庫正是我們需要的, 但是一開始時仍有 5 個不必要的變數被讀入 SAS 工作記憶體 (PDV) 本次執行, 完成 Data step 實際花費 21.96 秒 程式 3: 效率 okay DATA okay_2 (KEEP=x4 y3); y3 = x4 / 30; NOTE: The data set WORK.OKAY_2 has 20000000 程式 4: 效率最佳 DATA fast; SET demo (KEEP=x4); y3 = x4 / 30; NOTE: The data set WORK.FAST has 20000000 observations and 2 observations and 2 21.48 19.18 7.68 7.68 8

資料檔大小 : 資料檔大小 : 所有變數 (6 個 ) 由資料庫 demo 讀入 SAS 工作記憶體 (PDV), 處理完後新增一個變數 DATA 後的 KEEP= 選項讓資料只留下變數 x4 及變數 y3, 再寫入資料庫 okay_2 雖然最後的 okay_2 資料庫正是我們需要的, 但是一開始時仍有 5 個不必要的變數被讀入 SAS 工作記憶體 (PDV) 本次執行, 完成此 Data step 實際花費 21.48 秒 SET 陳述式後的 KEEP= 選項讓 1 個變數 x4 讀入 SAS 工作記憶體 (PDV), 處理完後新增一個變數 y3, 此時 SAS 工作記憶體 (PDV) 中有有 2 個變數, 變數 x4 變數 y3, 再全部寫入資料庫 fast 本次執行, 完成此 Data step 實際花費 19.18 秒 技巧 4: 使用 IF-THEN/ELSE 陳述式 如果一連串的條件式可以寫成 IF-THEN/ELSE 陳述式, 不要省略 ELSE 而只使用 IF-THEN SAS 在進行 IF-THEN/ELSE 的條件式判斷時, 對符合 ELSE 陳述式前 IF 條件的資料, 會停止接續的 ELSE 條件判斷, 所以在一連串 IF-THEN/ELSE 條件式中, 需要做條件判斷的資料會隨著逐項條件遞減 若省略 ELSE 而完全只用 IF-THEN 條件式, 則每項條件判斷都會處理所有的資料 所以在能建構 IF-THEN/ELSE 條件式時, 使用 ELSE 會較不使用 ELSE 有效率 範例 4: x1 為 0~99 的整數, 依以下的條件根據 x1 的值建立一個新變數 y4: 9

x1 1 ~ 30 31 ~ 55 56 ~ 75 76 ~ 90 91 ~ 95 96 ~ 98 99 y4 A B C D E F G ps. x1=0 時, y4 為 missing 程式 1: 效率較差 DATA slow; IF x1=0 THEN y4=' '; IF 1<= x1 <= 30 THEN y4 = 'A'; IF 30 < x1 <= 55 THEN y4 = 'B'; IF 55 < x1 <= 75 THEN y4 = 'C'; IF 75 < x1 <= 90 THEN y4 = 'D'; IF 90 < x1 <= 95 THEN y4 = 'E'; IF 95 < x1 <= 98 THEN y4 = 'F'; IF 98 < x1 THEN y4 ='G'; PROC MEANS DATA=slow MIN MAX NMISS MAXDEC=0; VAR x1; CLASS y4 /MISSING; 程式 2: 效率較佳 DATA fast; IF x1 = 0 THEN y4= ' '; ELSE IF x1 <= 30 THEN y4 = 'A'; ELSE IF x1 <= 55 THEN y4 = 'B'; ELSE IF x1 <= 75 THEN y4 = 'C'; ELSE IF x1 <= 90 THEN y4 = 'D'; ELSE IF x1 <= 95 THEN y4 = 'E'; ELSE IF x1 <= 98 THEN y4 = 'F'; ELSE y4 = 'G'; PROC MEANS DATA=fast MIN MAX NMISS MAXDEC=0; VAR x1; CLASS y4 / MISSING; NOTE: The data set WORK.SLOW has 20000000 observations and 7 NOTE: The data set WORK.FAST has 20000000 observations and 7 38.42 27.28 13.31 10.12 10

只使用 IF-THEN, 每個條件判斷句均要處理 2 千萬筆資料 本次執行, 完成此 Data step 實際花費 38.42 秒 使用 IF-THEN/ELSE, 需要做條件判斷的資料量會隨著逐項條件遞減, 加快運算效率 本次執行, 完成此 Data step 實際花費 27.28 秒 後記 以上的幾個 SAS 分析小技巧為理論上一般情況使用 SAS 處理 分析資料較有效率的方 法, 本篇提供的測試實例只是在特定軟硬體環境 資源下的某一次結果, 您在實際操作 本篇實例時的 和 不會和本篇相同 而且若為其他的特定實例情況或 環境, 較有效率的技巧可能並非一定那麼有效率 但是熟悉一些有效率的 SAS 程式寫 法, 可以在實際操作 SAS 時, 判斷有哪些不同的方法可以達成, 並適時的應用在自己 的分析上 本篇使用 SAS 9.3 版本進行 主要參考資料 : Bruce Gilsen (1999). SAS Program Efficiency for Beginners. In the SUGI 24, Beginning Tutorials Kirk Paul Lafler (2012). Top Ten SAS Performance Tuning Techniques. In the SAS Global Forum 2012, Systems Architecture and Administration 11