2010年11月11日 星期四
2010年4月9日 星期五
建立外部資料庫連線-以MS資料庫為例
此例簡單敘述如何將外部或遠端資料庫如MS SQL 等的資料與SAS做連線
在此不多詳述MS SQL的資料建立
此例以MS SQL SERVER為例
若要與SAS做連線則要先有ODBC 或 OLAP 等設定
首先需建立ODBC連線設定
設定方式
>控制台>系統管理工具>資料來源(ODBC)
如下圖
選擇使用者資料來源名稱
新增SQL Server
如下圖
之後會有建立SQL SERVER 來源
視窗名稱就是你自己命名
連線伺服器就是要連線的ip位址或網路芳鄰
若是在本機上則打local或localhost即可
接著就會有連線帳號的設定與授權(需要在SQL SERVER先設定連線帳號)
上述即為MS SQL SERVER連線的設定前驅作業
此ODBC設定完成即可以在其他程式都能連線例如ACCESS、SPSS、SAS EG、SAS、ArcGIS.....等
只要能支援外部資料庫連線均能使用
接下來則是要使用SAS主程式
連線此MS SQL SERVER資料庫
首先先開啟SAS主程式
開啟左側Libraries資料夾
對著Explorer窗格按滑鼠右鍵或上方新增一個新的libraries
選擇Engine=>ODBC
Name則是你要新建立Libraries的名稱
若開啟ODBC則會有其他選項
如DataSource則是問你MS SQL SERVER允許你連線的資料庫有哪幾樣
你要選哪一個
如果成功就能開啟連線狀態
再來要怎麼使用因該就不用我多說了吧,暫存檔work和永久檔的使用。
上述SAS的設定可以利用libname語法去設定
只是用點選會比較快且只是一次性的設定
若資料庫較隱密時帳號密碼也比較不會曝光
在此不多詳述MS SQL的資料建立
此例以MS SQL SERVER為例
若要與SAS做連線則要先有ODBC 或 OLAP 等設定
首先需建立ODBC連線設定
設定方式
>控制台>系統管理工具>資料來源(ODBC)
如下圖
選擇使用者資料來源名稱
新增SQL Server
如下圖
之後會有建立SQL SERVER 來源
視窗名稱就是你自己命名
連線伺服器就是要連線的ip位址或網路芳鄰
若是在本機上則打local或localhost即可
接著就會有連線帳號的設定與授權(需要在SQL SERVER先設定連線帳號)
上述即為MS SQL SERVER連線的設定前驅作業
此ODBC設定完成即可以在其他程式都能連線例如ACCESS、SPSS、SAS EG、SAS、ArcGIS.....等
只要能支援外部資料庫連線均能使用
接下來則是要使用SAS主程式
連線此MS SQL SERVER資料庫
首先先開啟SAS主程式
開啟左側Libraries資料夾
對著Explorer窗格按滑鼠右鍵或上方新增一個新的libraries
選擇Engine=>ODBC
Name則是你要新建立Libraries的名稱
若開啟ODBC則會有其他選項
如DataSource則是問你MS SQL SERVER允許你連線的資料庫有哪幾樣
你要選哪一個
如果成功就能開啟連線狀態
再來要怎麼使用因該就不用我多說了吧,暫存檔work和永久檔的使用。
上述SAS的設定可以利用libname語法去設定
只是用點選會比較快且只是一次性的設定
若資料庫較隱密時帳號密碼也比較不會曝光
2010年2月1日 星期一
NxN列聯表計算卡方檢定
繼之前簡易2X2列聯表計算卡方檢定只能計算2X2之列聯表
windows都升級為Win7了
當然列聯表也得升級一下
所以我改寫了新版wondow視窗
擴充為NxN列聯表
程式如下
直接在SAS內執行即可
不過最大值好像18*18 就很緊繃了
因為會超出視窗..............
windows都升級為Win7了
當然列聯表也得升級一下
所以我改寫了新版wondow視窗
擴充為NxN列聯表
程式如下
直接在SAS內執行即可
Data Welcom;
Window Welcom Color=white Columns=100 Rows=100
#5 @50 "--------------Welcom To Use this SAS Program--------------" color=red
#7 @50 "------------This Program Test For Independence------------" color=red
#9 @50 "----------------Contingency Table Analysis----------------" color=blue
#14 @50 "請按Enter進入欄位設定及檢定視窗"
;
Display Welcom ;
stop ;
run;
Data SelectTable;
retain x 2 y 2;
Window Select Color=white Columns=100 Rows=100
#1 @58 '--------------Contingency Table Analysis--------------' color=red
#3 @58 '請輸入為X乘Y列聯表' color=red
#5 @52 'X*Y=' color=blue
#5 @63 '*' color=red
#5 @58 x 5. color=red a=underline auto=yes required=yes
#5 @64 y 5. color=red a=underline auto=yes required=yes
#14 @50 "各欄位數值鍵入完請按Enter以方便跳位"
#15 @50 "鍵入完成後請至上方Command===>處鍵入 : end"
;
Display Select;
run;
proc sql ;
select x , y into :x ,:y
from SelectTable (obs=1);
run;
quit;
%macro Tabletrans;
Data Tablewindow;
retain
%do ssy= 1 %to &y;
%do ssx = 1 %to &x ;
x&ssx.y&ssy 0
%end;
%end;
;
Window Table Color=white Columns=100 Rows=100
#3 @58 '變相X' color=red
%do xn=1 %to &x;
%let xsit=%eval(43+10*&xn);
#4 @&xsit "X=&xn" color=blue
%end;
#7 @43 '變' color=red
#8 @43 '項' color=red
#9 @43 'Y' color=red
%do yn=1 %to &y;
%let ysit=%eval(4+3*&yn);
#&ysit @46 "Y=&yn" color=blue
%end;
%let vlbar=%eval(5+3*&y);
%let xbar="----------" ;
#5 @50
%do b=1 %to &x ;
&xbar
%end;
%let xbar="----------" ;
#&vlbar @50
%do b=1 %to &x ;
&xbar
%end;
%do vb=1 %to &y;
%let vspec=%eval(5+3*(&vb-1));
%Let xcbar='|---------' ;
#&vspec @50
%do b=1 %to &x ;
&xcbar
%end;
%end;
%do a= 1 %to &y ;
%let vca1=%eval(6+3*(&a-1));
%let vca2=%eval(7+3*(&a-1));
%let vca3=%eval(8+3*(&a-1));
%let h=%eval(&x+1);
%do hbarn= 1 %to &h ;
%let hbar=%eval(40+10*&hbarn) ;
#&vca1 @&hbar '|'
#&vca2 @&hbar '|'
%end;
#&vca3 @&hbar '|'
%end;
%do yyy= 1 %to &y;
%let varys=%eval(3+3*&yyy);
%do xxx = 1 %to &x ;
%let varxspe=%eval(41+10*&xxx);
#&varys @&varxspe x&xxx.y&yyy 5. color=red a=underline auto=yes required=yes
%end;
%end;
%let footnote1=%eval(&vlbar+5);
%let footnote2=%eval(&vlbar+6);
#&footnote1 @50 "各欄位數值鍵入完請按Enter以方便跳位"
#&footnote2 @50 "鍵入完成後請至上方Command===>處鍵入 : end"
;
Display Table;
run;
%mend;
%Tabletrans;
proc transpose data=Tablewindow prefix=weight name=local out=weightnum;
run;
data tablecut;
set weightnum;
xx=scan(local,1 , 'y');
xxx=scan(xx,1,'x');
yyy=scan(local,2 , 'y');
label xxx='變項X' yyy='變項Y';
run;
proc freq data= tablecut;
table yyy*xxx /chisq norow nocol nopercent;
weight weight1;
run;
不過最大值好像18*18 就很緊繃了
因為會超出視窗..............
2010年1月22日 星期五
實驗組與對照組一對一或一對多簡單配對
以下只是簡單介紹如何使用SAS語法做出實驗組與對照組在配對樣本時的簡單方法
一對一配對資料
先準備實驗組與對照組資料
若想要做到配對,其配對條件為性別配對
則每一筆皆有可能被對應到的結果如下
若為年齡或其他條件配對,其結果也是相似的。
case組每一筆觀察值皆對應到control組符合條件的觀察值
而要從中隨機抽出control組其中一筆作為case組配對結果,即作為一對一簡單配對的動作
其方法則要借用到SQL的模糊比對
在SAS中有類似TSQL語法的 PROC SQL程序
其步驟如下
上述語法中先給Control組每個觀察值一個隨機號碼即亂數randseed,其值0~1。
亂數子的用法uniform(seed)
其實是執行一組符合均值分布的亂數產生器(the Uniform Random Number Generator)
seed則是亂數用到的亂數子可以隨意給定,其值為0到2^31-1之間
另有其他分布的亂數產生器可以用,如Ranbin(seed,n,p)、Rancau(seed)等
可參考如下
本次所要做的則是給定每個觀察值機會均等,所以使用uniform(0),seed則給0。
在給予亂數後
每個觀察值就有亂數之變項randseed可以取用,接下來則是透過配對結果如先前說到,每個Case組有不止一筆Control資料,取每一組Case組配對的Control組其亂數最小作為Case組配對一次的對象。
在給予每筆觀察值後
首先先利用SQL語法達到配對效果
語法如下
上述SQL語法模糊配對的方式在於where case.sex = control.sex;
其實只是告知電腦你要找Case組與Control組條件在於性別相等時成立的結果
即口語上的哪裡是(where)Case組sex等於Control組sex的結果。
若有其他配對條件時也是在這裡執行,如要配對性別及年齡時,可以改為
where case.sex = control.sex and case.age = control.age
SQL檢索完成後之資料轉存到WORK資料夾的MATCH檔。
其結果如下圖(與前述提到每一筆Case組對應到Control組時的狀態)
完成條件檢索後需要進一步篩選每筆Case組只要一筆Control組,達到一對一配對,
其簡單方式則是把Case組取為原觀察數並且選擇Case組亂數最小或最大的保留
即一比一簡單配對方式
方式如下
上述語法則是利用系統內設值first last,
若要了解SAS內設語法請自行查詢SAS的Help檔。
其用法是將Case組每一筆觀察值在SQL檢索後產生的重複資料整理為原來的筆數,並且保留了Control組亂數最小的那一筆。
若要一對二配對 另有比較偷懶的方式,就是重複資料取第一筆與最後一筆。
整體結果就是一對一的簡單配對
若要做其他配對方式只要照幾個原則便容易很多
1.觀察值先建立亂數
2.利用SQL語法中where的條件指令做模糊比對
3.根據需求如何取回現有的觀察值及觀察值的配對數目
上述除了能做群體配對與個體配對外
若只想從對照組隨機抽取
可以嘗試使用 PROC SURVEYSELECT 語法
一對一配對資料
先準備實驗組與對照組資料
data case;
input id name$ sex age BMI;
cards;
1 a 1 20 20
2 b 1 21 20
3 c 1 22 21
4 d 1 23 21
5 e 1 24 22
6 f 2 25 22
7 g 2 26 23
8 h 2 27 23
9 i 2 28 24
10 j 2 29 24
;
run;
data control;
input id name$ sex age BMI;
cards;
1 c1 2 29 24
2 c2 2 28 24
3 c3 2 27 20
4 c4 2 26 20
5 c5 2 25 21
6 c6 1 20 22
7 c7 1 21 21
8 c8 1 22 22
9 c9 1 23 23
10 c10 1 24 23
;
run;
若想要做到配對,其配對條件為性別配對
則每一筆皆有可能被對應到的結果如下
若為年齡或其他條件配對,其結果也是相似的。
case組每一筆觀察值皆對應到control組符合條件的觀察值
而要從中隨機抽出control組其中一筆作為case組配對結果,即作為一對一簡單配對的動作
其方法則要借用到SQL的模糊比對
在SAS中有類似TSQL語法的 PROC SQL程序
其步驟如下
data case;
input id name$ sex age BMI;
cards;
1 a 1 20 20
2 b 1 21 20
3 c 1 22 21
4 d 1 23 21
5 e 1 24 22
6 f 2 25 22
7 g 2 26 23
8 h 2 27 23
9 i 2 28 24
10 j 2 29 24
;
run;
data control;
input id name$ sex age BMI;
randseed=uniform(0);
cards;
1 c1 2 29 24
2 c2 2 28 24
3 c3 2 27 20
4 c4 2 26 20
5 c5 2 25 21
6 c6 1 20 22
7 c7 1 21 21
8 c8 1 22 22
9 c9 1 23 23
10 c10 1 24 23
;
run;
上述語法中先給Control組每個觀察值一個隨機號碼即亂數randseed,其值0~1。
亂數子的用法uniform(seed)
其實是執行一組符合均值分布的亂數產生器(the Uniform Random Number Generator)
seed則是亂數用到的亂數子可以隨意給定,其值為0到2^31-1之間
另有其他分布的亂數產生器可以用,如Ranbin(seed,n,p)、Rancau(seed)等
可參考如下
本次所要做的則是給定每個觀察值機會均等,所以使用uniform(0),seed則給0。
在給予亂數後
每個觀察值就有亂數之變項randseed可以取用,接下來則是透過配對結果如先前說到,每個Case組有不止一筆Control資料,取每一組Case組配對的Control組其亂數最小作為Case組配對一次的對象。
在給予每筆觀察值後
首先先利用SQL語法達到配對效果
語法如下
data case;
input id name$ sex age BMI;
randseed=uniform(0);
cards;
1 a 1 20 20
2 b 1 21 20
3 c 1 22 21
4 d 1 23 21
5 e 1 24 22
6 f 2 25 22
7 g 2 26 23
8 h 2 27 23
9 i 2 28 24
10 j 2 29 24
;
run;
data control;
input id name$ sex age BMI;
randseed=uniform(0);
cards;
1 c1 2 29 24
2 c2 2 28 24
3 c3 2 27 20
4 c4 2 26 20
5 c5 2 25 21
6 c6 1 20 22
7 c7 1 21 21
8 c8 1 22 22
9 c9 1 23 23
10 c10 1 24 23
;
run;
proc sql;
create table match as
select
case.id as case_id ,
case.name as case_name ,
case.sex as case_sex ,
case.age as case_age ,
case.BMI as case_BMI ,
case.randseed as case_randseed ,
control.id as control_id ,
control.name as control_name ,
control.sex as control_sex ,
control.age as control_age ,
control.BMI as control_BMI ,
control.randseed as control_randseed
from case , control
where case.sex = control.sex;
run;
quit;
上述SQL語法模糊配對的方式在於where case.sex = control.sex;
其實只是告知電腦你要找Case組與Control組條件在於性別相等時成立的結果
即口語上的哪裡是(where)Case組sex等於Control組sex的結果。
若有其他配對條件時也是在這裡執行,如要配對性別及年齡時,可以改為
where case.sex = control.sex and case.age = control.age
SQL檢索完成後之資料轉存到WORK資料夾的MATCH檔。
其結果如下圖(與前述提到每一筆Case組對應到Control組時的狀態)
完成條件檢索後需要進一步篩選每筆Case組只要一筆Control組,達到一對一配對,
其簡單方式則是把Case組取為原觀察數並且選擇Case組亂數最小或最大的保留
即一比一簡單配對方式
方式如下
proc sort data=match; by case_id control_randseed;
data One_TO_One;
set match ; by case_id ;
firstid=first.case_id;
lastid=last.case_id;
if firstid=1 and (lastid=0 or lastid=1) ;
run;
上述語法則是利用系統內設值first last,
若要了解SAS內設語法請自行查詢SAS的Help檔。
其用法是將Case組每一筆觀察值在SQL檢索後產生的重複資料整理為原來的筆數,並且保留了Control組亂數最小的那一筆。
若要一對二配對 另有比較偷懶的方式,就是重複資料取第一筆與最後一筆。
整體結果就是一對一的簡單配對
若要做其他配對方式只要照幾個原則便容易很多
1.觀察值先建立亂數
2.利用SQL語法中where的條件指令做模糊比對
3.根據需求如何取回現有的觀察值及觀察值的配對數目
上述除了能做群體配對與個體配對外
若只想從對照組隨機抽取
可以嘗試使用 PROC SURVEYSELECT 語法
訂閱:
文章 (Atom)