剛使用SAS或SPSS等統計軟體時,除了操作介面外,還要適應統計軟體處理資料的方式,以及資料整理的格式。
在唸統計課本的時候,資料常常長的像這個樣子
A B
60 75
70 66
80 83
90 82
95 90
但是假使這樣的資料直接輸入至SAS,那SAS絕對無法處理成績。
SAS的資料格式,是以"變項"和"case"組成的。變項代表case一種特性,是一種分類。而變項中有不同的"值",分別代表個體在該變項中的實際性質。例如身高是一種變項,163cm、178cm是實際上的值。一般統計分析,是在處理變項之間的關係,而無法處理case之間的關係。因此在輸入資料的時候,要先確認我要以什麼東西為case,然後把同樣的特性歸為同一變項。
以這個例子來說,不論a班和b班,成績都是同一種特性,是依附在學生身上的特性,也就是說我們要將每個學生視為一個case,將其成績要放在同一變項,班級也是一個變項。
因此我們要將上述的資料形式,轉換為:
ods 班級 成績
1 A
2 A
3 A
4 A
5 A
6 B
7 B
8 B
9 B
10 B
成績我就不打了,要轉換成這樣才能執行檢定。
SAS中的獨立樣本T檢定,是將同一變數,依照另外一個變數分成兩組,互相比較,所以我們要把原本ab兩個變數,轉換成同一變數,分為AB兩組互相比較。因此我們就先把資料分成兩個,再分組合就好了
假設原始檔案叫做O_file
/*把變項A抓出來*/
data a ;
set O_file;
keep a;
class_=A_;/*設定組別名稱為A_*/
c=a; /*要把AB轉換成同一變項才能合併*/
run;
/*把變項B抓出來*/
data b;
set O_file;
keep b;
class_=B_; /*設定組別名稱為B_*/
c=b /*要把AB轉換為同一變項才能合併*/
run;
/*垂直合併*/
data c;
set a b;
keep c class_;
run;
/*執行檢定*/
proc ttest;
var c; /*對C變項做檢定 以AB分組*/
class class_;
run;
這樣就可以囉~
2008年10月31日 星期五
2008年10月28日 星期二
自己學SAS Learning SAS by self (三) 開啟檔案 Open the File
上一篇提到DATA,但是要成為SAS能讀取的資料,還要經過一番轉換。
一般來說,SAS能讀取的檔案有三種形式:
(1) 副檔名為sas7bdat的SAS資料檔
(2) ASCll碼,也就是純文字的檔案,算是外部檔案
(3) 其他外部檔案
SAS可以利用libname設定SAS資料夾,再用SET讀取檔案,詳細的libname用法可以參考這篇 http://kenshinsasstory.blogspot.com/2008/10/libname.html
ASCll純文字檔案要用infile或是filename讀取,其他外部檔案可以使用export功能匯入。
SAS在讀取檔案時也不能像spss或是其他軟體一樣使用滑鼠點選,而是要在program視窗的地方輸入指令。
(1) 讀取SAS資料檔
data test ; /*建立SAS DATA檔*/
set Libname_.SAS_Filename; /*匯入SAS資料檔*/
run;
(2) 讀取ASCll純文字碼
data test;
infile Filename; /*或是直接輸入檔案路徑和名稱)*/
input VarName 1-2 ; /*因為純文字檔沒有包含變項名稱,所以要用input來建立變項,格式有很多種,其中一種是先建立變項名稱,再標示變項在文字檔中的位置*/
run;
純文字檔可以說是通用的data儲存格式,只要以input輸入變項,不用特定轉換檔案格式,使用上也SAS資料檔來得要用彈性。例如在分析次級資料的時候,原始data有一百多個變項,而我只需要觀察性別、年齡兩個變項,我可以用inpu讀取特定變項,減少系統處理時間和記憶體空間。
其中,input的方式會依需求改變,而且指令也相當的多,留待專題文章再做說明。
一般來說,SAS能讀取的檔案有三種形式:
(1) 副檔名為sas7bdat的SAS資料檔
(2) ASCll碼,也就是純文字的檔案,算是外部檔案
(3) 其他外部檔案
SAS可以利用libname設定SAS資料夾,再用SET讀取檔案,詳細的libname用法可以參考這篇 http://kenshinsasstory.blogspot.com/2008/10/libname.html
ASCll純文字檔案要用infile或是filename讀取,其他外部檔案可以使用export功能匯入。
SAS在讀取檔案時也不能像spss或是其他軟體一樣使用滑鼠點選,而是要在program視窗的地方輸入指令。
(1) 讀取SAS資料檔
data test ; /*建立SAS DATA檔*/
set Libname_.SAS_Filename; /*匯入SAS資料檔*/
run;
(2) 讀取ASCll純文字碼
data test;
infile Filename; /*或是直接輸入檔案路徑和名稱)*/
input VarName 1-2 ; /*因為純文字檔沒有包含變項名稱,所以要用input來建立變項,格式有很多種,其中一種是先建立變項名稱,再標示變項在文字檔中的位置*/
run;
純文字檔可以說是通用的data儲存格式,只要以input輸入變項,不用特定轉換檔案格式,使用上也SAS資料檔來得要用彈性。例如在分析次級資料的時候,原始data有一百多個變項,而我只需要觀察性別、年齡兩個變項,我可以用inpu讀取特定變項,減少系統處理時間和記憶體空間。
其中,input的方式會依需求改變,而且指令也相當的多,留待專題文章再做說明。
2008年10月20日 星期一
合併多個檔案 Merge many files
要如何合併多個檔案我想是很多人在資料處理時很容易遇到的問題。
以人力資源調查資料庫為例,這是一個長達二十幾年,每個月都調查的資料,也就是說一年有十二個檔案,總共有二十幾年,為了怕弄混,每一個月份的檔案都存在不同資料,然後每十二個月的檔案又放在一個資料夾中。若要一個一個打開,複製貼上一定會浪份不少時間。
先不考慮每年的coding是否相同,我先以合併同一年份的檔案為例。
%macro LB95;
%let m = 01 02 03 04 05 06 07 08 09 10 11 12;
%do i = 1 %to 12;
%let moon=%scan(&m,&i);
data temp ;
infile "C:\data\manpower\mp95\mp95&moon\LB95&moon..dat";
input#1 Towncode 4-10 a2 21 a3 22-24 a4 25 ;
run;
這是程式的前半段。
想法很簡單,因為我每個月的資料都放在不同資料夾,比如說一月的資料我就放在LB9501,二月我就放在LB9502,那我是不是只要設計一個程式,能夠按照01、02的順序替換掉資料夾的名稱,就能順利讀取檔案?
其中的關鍵是%let和%scan的用法。
%let是一前導指令,可以指定多個字串作為前導變項。%scan則是用來讀取%let中的字串,可以依序讀取,第一次讀取01、第二次讀取02。設定好巨集指令後,我再以&moon來呼叫前導指令中設定的變數。sas中前導變項的功能非常強大,幾乎可以出現在程式中的任何地方。
看起來神奇,說起來簡單,前導指令和前導變項的關係其實就是複製貼上。當程式讀到&開頭的前導變項時,會代換以%為開頭的前導指令。假使前導變項後面還要加上其他文字,就得加個"."將他們隔開,不然sas程式會以為&後面到空白處都是同一個前導變項。
我在infile的地方用&moon前導變項替換檔案路徑,和檔案名稱,讓程式可以讀取不同資料夾中的檔案,只要你在歸檔的時候有順序的排列,在使用巨集的時候也會變得比較輕鬆。
%if &i=1 %then
%do;
data LB95;
set temp;
run;
%end;
%else
%do ;
data lb95;
set lb95 temp;
run;
%end;
%end;
%mend LB95;
%LB95;
最後面這邊就只是很單純在合併不同年的檔案。sas中有很多指令都是一組一組的。像是do對應end,data對應run,寫的時候要注意有沒有對好,沒有對好可就執行不暸。
以人力資源調查資料庫為例,這是一個長達二十幾年,每個月都調查的資料,也就是說一年有十二個檔案,總共有二十幾年,為了怕弄混,每一個月份的檔案都存在不同資料,然後每十二個月的檔案又放在一個資料夾中。若要一個一個打開,複製貼上一定會浪份不少時間。
先不考慮每年的coding是否相同,我先以合併同一年份的檔案為例。
%macro LB95;
%let m = 01 02 03 04 05 06 07 08 09 10 11 12;
%do i = 1 %to 12;
%let moon=%scan(&m,&i);
data temp ;
infile "C:\data\manpower\mp95\mp95&moon\LB95&moon..dat";
input#1 Towncode 4-10 a2 21 a3 22-24 a4 25 ;
run;
這是程式的前半段。
想法很簡單,因為我每個月的資料都放在不同資料夾,比如說一月的資料我就放在LB9501,二月我就放在LB9502,那我是不是只要設計一個程式,能夠按照01、02的順序替換掉資料夾的名稱,就能順利讀取檔案?
其中的關鍵是%let和%scan的用法。
%let是一前導指令,可以指定多個字串作為前導變項。%scan則是用來讀取%let中的字串,可以依序讀取,第一次讀取01、第二次讀取02。設定好巨集指令後,我再以&moon來呼叫前導指令中設定的變數。sas中前導變項的功能非常強大,幾乎可以出現在程式中的任何地方。
看起來神奇,說起來簡單,前導指令和前導變項的關係其實就是複製貼上。當程式讀到&開頭的前導變項時,會代換以%為開頭的前導指令。假使前導變項後面還要加上其他文字,就得加個"."將他們隔開,不然sas程式會以為&後面到空白處都是同一個前導變項。
我在infile的地方用&moon前導變項替換檔案路徑,和檔案名稱,讓程式可以讀取不同資料夾中的檔案,只要你在歸檔的時候有順序的排列,在使用巨集的時候也會變得比較輕鬆。
%if &i=1 %then
%do;
data LB95;
set temp;
run;
%end;
%else
%do ;
data lb95;
set lb95 temp;
run;
%end;
%end;
%mend LB95;
%LB95;
最後面這邊就只是很單純在合併不同年的檔案。sas中有很多指令都是一組一組的。像是do對應end,data對應run,寫的時候要注意有沒有對好,沒有對好可就執行不暸。
2008年10月19日 星期日
自己學SAS Learning SAS by self (二) Data!Data!Data!
沒有DATA來談SAS是沒有意義的。 SAS作為處理資料的軟體,目的就是要分析資料,從中找出有意義的關係。
資料是原料、材料,透過SAS和使用者的想法,才能煮成一盤好菜。沒有原料要來學SAS其實沒有什麼太大用途。SAS的用途很多,但是不同的材料有不同的應用方法。就像大同電鍋可以煎煮炒炸,但是也要看你今天有什麼材料,想吃什麼菜才能決定用法。我們在學習使用電鍋的時候,也要先準備好材料,才有辦法使用電鍋來料理。才能看出自己的手法好不好?能不能煮成一盤好菜?
那DATA怎麼來呢?
小則個人支出帳簿、或是班上同學的成績;大到人口普查、社會變遷調查;甚至跨國、國際性的經濟數據資料,都可以當作DATA。端看您的用途來去找相應的資料。有時候找得到,有時後找不到,有的如探囊取物,有得難如登天。
因為資料的形式很多,有點難做一個統合的描述。但是因為要用SAS來處理資料,所以原始資料一定都要用數字表示。大致上來說,一份完整的資料要包括三個東西:
1. 問卷--是讓人填答問題,或者可以延伸為資料的實質意涵。
2. CodeBook--連結問卷和DATA。
3. Data--以數字為主要形式。
1. 問卷,廣義的來說就是問題。任何數字都不是憑空出現,一定會對應於一種特定的問題。
例如:帳簿上的40,他背後的問題可能是我今天吃飯花多少錢?
成績單上的65,背後的問題就是這個學生其中考考多少分
2. CodeBook,有時後數字可能代表比較複雜的東西,很難從數字來解釋,這時候就需要codebook來記錄每個數字代表的意思。
例如:你家住哪裡? 因為sas只能分析數字,我們必須設定台灣各縣市的代號,然後才能輸入sas或成為一筆data。
3. data,用以紀錄問卷結果,以及成為sas資料分析的來源。
在解讀資料的時候,就是來回查詢問題、codebook、以及data,連結三者之間的關係,才能了解data的涵義、以及這個問題在整體中的分配狀況。
本Blog使用說明(會不定期新增內容)
sas使用說明和指令內容一般仿間的書或是網站或是sas說明手冊都說得很詳細了。我再怎樣說都不會有這些專業說明書籍或手冊來得詳盡,使用上也沒那麼方便。(總不能把blog整個抓下來印出來吧)
我想提供的是「解決問題的方法」和「解決問題的想法。」
舉例來說,學sas就像學英文一樣吧,要練好英文,雖然不能沒有字典,但也需要完整的對話情境和脈絡,才懂得如何使用英文,而且學習英文最終的目的也是要放在情境脈絡中使用。
SAS Story就是提拱學習以及使用sas的脈絡,而不只是本sas使用手冊。語法很多,查手冊很快,但是要找出能夠解決問題的語法,並且將他們組織起來,就不是那麼容易。
不管是「實戰分析」還是「指令」篇,我一定會先帶一段使用情境,或是我遇到的問題,然後才會開始談到指令和語法。希望能讓讀者了解到,這些指令和語法是在什麼時候使用的,或是我遇到什麼問題,要用什麼方法分析解構,再來找適當的語法來處理。
在排版上,脈絡或是解釋的部份字型比較大,語法部份字型比較小,語法通常可以讓各位複製在sas中執行,語法中的說明我己經用/* */標示,並不會影響到程式執行。希望各位能走了解故事背景,也能順利走到故事中:)
我想提供的是「解決問題的方法」和「解決問題的想法。」
舉例來說,學sas就像學英文一樣吧,要練好英文,雖然不能沒有字典,但也需要完整的對話情境和脈絡,才懂得如何使用英文,而且學習英文最終的目的也是要放在情境脈絡中使用。
SAS Story就是提拱學習以及使用sas的脈絡,而不只是本sas使用手冊。語法很多,查手冊很快,但是要找出能夠解決問題的語法,並且將他們組織起來,就不是那麼容易。
不管是「實戰分析」還是「指令」篇,我一定會先帶一段使用情境,或是我遇到的問題,然後才會開始談到指令和語法。希望能讓讀者了解到,這些指令和語法是在什麼時候使用的,或是我遇到什麼問題,要用什麼方法分析解構,再來找適當的語法來處理。
在排版上,脈絡或是解釋的部份字型比較大,語法部份字型比較小,語法通常可以讓各位複製在sas中執行,語法中的說明我己經用/* */標示,並不會影響到程式執行。希望各位能走了解故事背景,也能順利走到故事中:)
2008年10月17日 星期五
自己學SAS (一) 去哪問問題?
SAS不一定要問人,但是一定要懂得去哪找資料。
首先推薦幾本書:
1. SAS 1-2-3 作者彭昭英 儒林出版社
很有調理的說明如何讀取檔案、排序、到分析等等,東西不會太多,也不會太難,還滿好上手的入門書籍
2. SAS與資料處理 作者翁淑源 儒林出版社
對於SAS DATA SET的指令介紹的非常詳細,著重在處理和整理資料,沒有介紹統計分析,可以當成字典工具書使用。
3. SAS內建的HELP指令
東西應有盡有,非常詳盡,只是一些編排的方式和專有名詞需要花時間熟析一下,在SAS中按F1就能叫出來。
另外,網路資源也相當多,基本上使用GOOGLE就能找到很多資料。只要將關鍵字SAS,和自己遇到的問題打進去,通常就能找到不錯的回覆。但是比較複雜的問題可能還是需要自己想一下。
首先推薦幾本書:
1. SAS 1-2-3 作者彭昭英 儒林出版社
很有調理的說明如何讀取檔案、排序、到分析等等,東西不會太多,也不會太難,還滿好上手的入門書籍
2. SAS與資料處理 作者翁淑源 儒林出版社
對於SAS DATA SET的指令介紹的非常詳細,著重在處理和整理資料,沒有介紹統計分析,可以當成字典工具書使用。
3. SAS內建的HELP指令
東西應有盡有,非常詳盡,只是一些編排的方式和專有名詞需要花時間熟析一下,在SAS中按F1就能叫出來。
另外,網路資源也相當多,基本上使用GOOGLE就能找到很多資料。只要將關鍵字SAS,和自己遇到的問題打進去,通常就能找到不錯的回覆。但是比較複雜的問題可能還是需要自己想一下。
台灣家庭收支暨所得分配訪問(二) 分析策略
分析資料也是講求策略的。考量的原因無他,就看這筆資料的結構以及問題為何。資料結構在上一篇文章提過,這裡就不加贅述。那我要處理的問題為:挑出特定變數。這些變數包括了:
1.挑出家戶長配偶
2.挑出該家戶的收入支出變項
3.計算各家庭人口數,以及老人數目
在思考這個問題的時候,要注意
1. 資料結構為家戶資料,假使照著主計處提供的SAS檔案,我們得到的是一筆一筆的家戶資料。家裡不同人口特質的變項,問卷提供近五十組的位置可以填寫,所以也不確定家戶長和其配偶在哪個變項。
2. 同時由於這筆資料在收入支出的部份是分為400組變項,每組變項都包括(收入支出代號)和(收入支出金額)這兩部份,所以我們也不確定每筆資料的收入支出會在同一個位置。
3. 沒有變項說家裡有幾個人。
當然,案主給我問題的時候,並不會特別幫我將問題依照期性質分類。是因為這三個問題在其資料結構上有其實質上的差異,所以我才會分為這三個問題。
1. 第一個問題主要是要整理家戶長及其配偶的人口資料,本質上是以人為單位的資料。
2. 收入和支出都是以家庭為單位。
3. 家裡人口數基本上可以用家庭為單位計算,或是轉換成個人資料來計算。
所以我的策略就是:
1. 加以家戶為單位的資料轉換為以個人為資料。
2. 以個人資料來處理家戶長和配偶的人口資料,同時來計算家裡人口。
3. 用家戶資料來找家庭的收入和支出。
由於案主要的是家戶資料,所以最後在將個人資料轉換成家戶資料,再將三者合併整理就好。
1.挑出家戶長配偶
2.挑出該家戶的收入支出變項
3.計算各家庭人口數,以及老人數目
在思考這個問題的時候,要注意
1. 資料結構為家戶資料,假使照著主計處提供的SAS檔案,我們得到的是一筆一筆的家戶資料。家裡不同人口特質的變項,問卷提供近五十組的位置可以填寫,所以也不確定家戶長和其配偶在哪個變項。
2. 同時由於這筆資料在收入支出的部份是分為400組變項,每組變項都包括(收入支出代號)和(收入支出金額)這兩部份,所以我們也不確定每筆資料的收入支出會在同一個位置。
3. 沒有變項說家裡有幾個人。
當然,案主給我問題的時候,並不會特別幫我將問題依照期性質分類。是因為這三個問題在其資料結構上有其實質上的差異,所以我才會分為這三個問題。
1. 第一個問題主要是要整理家戶長及其配偶的人口資料,本質上是以人為單位的資料。
2. 收入和支出都是以家庭為單位。
3. 家裡人口數基本上可以用家庭為單位計算,或是轉換成個人資料來計算。
所以我的策略就是:
1. 加以家戶為單位的資料轉換為以個人為資料。
2. 以個人資料來處理家戶長和配偶的人口資料,同時來計算家裡人口。
3. 用家戶資料來找家庭的收入和支出。
由於案主要的是家戶資料,所以最後在將個人資料轉換成家戶資料,再將三者合併整理就好。
訂閱:
文章 (Atom)