跳到主要內容

[SAS] 如何建立虛擬變項 (Dummy variable)???

 進行統計分析遇到資料中含有類別變項的時候,不能像連續變項一樣直接放入迴歸模型之中。舉例來說,假設現在我們的資料中有種族這個類別變項${x}_{1}$,而其中包含白人、黑人、黃種人。在不設虛擬變項的狀況之下,分別令黑人=1,黃種人=2,白人=3,代入下列回歸方程式$ y={ \beta }_{ 1 }{ x }_{ 1 }+\alpha $中,則結果如下:

$ {x}_{1}$=1,$ {y}_{1}={1}{ \beta }_{ 1 }+\alpha $

$ {x}_{1}$=2,$ {y}_{2}={2}{ \beta }_{ 1 }+\alpha $

$ {x}_{1}$=3,$ {y}_{3}={3}{ \beta }_{ 1 }+\alpha $

如果是連續變項,所求得的${\beta}_{1}$值來自於${y}_{n}-{y}_{n-1}={\beta}_{1}$,換句話說是${x}_{1}$每增加1個單位,則${y}$就會增加${\beta}$。試問在這個例子中又該如何解釋呢?這些數值代表的是該類別的"特質",而不是已經實際的量,因此我們無法解釋這樣的結果,這種情況下就得用到虛擬變項來解決這個困境。

類別變項該如何編碼成虛擬變項呢?虛擬變項由0或1組成,如果類別變項具有A個類別,則需要A-1個虛擬變項。假設第一個類別作為參考組,則所有的虛擬變項數值皆為0,若虛擬變項${A}_{1}$代表第二個類別,則虛擬變項${A}_{1}$的數值為1,其餘虛擬變項數值為0。假設一個簡單回歸方程式的類別變項有三個類別,則我們可以將方程式簡單寫成如下:

${y}={\alpha}+{\beta}_{1}{x}_{1}+{\beta}_{2}{x}_{2}$

以第一個類別作為參考組,方程式可寫成:

${y}_{1}={\alpha}+{\beta}_{1}(0)+{\beta}_{2}(0)={\alpha}$(式一)

第二個類別方程式寫成:

${y}_{2}={\alpha}+{\beta}_{1}(1)+{\beta}_{2}(0)={\alpha}+{\beta}_{1}$(式二)

第三個類別方程式則寫成:

${y}_{3}={\alpha}+{\beta}_{1}(0)+{\beta}_{2}(1)={\alpha}+{\beta}_{2}$(式三)

將式二與式一相減可得${\beta}_{1}$,式三與式一相減可得${\beta}_{2}$,換言之,當第二類別與第一類別相比之下的差異量為${\beta}_{1}$,第三類別與第一類別相比之下的差異量則為${\beta}_{2}$,這下子知道該如何去解釋迴歸模型中虛擬變項所代表的迴歸係數了吧?

方法一
/*此部分為母資料集,下列範例皆須使用此資料集*/
DATA AUTO ;
LENGTH MAKE $ 20 ;
INPUT MAKE $ 1-17 PRICE MPG REP78 ;
CARDS;
AMC CONCORD 4099 22 3
AMC PACER 4749 17 3
AUDI 5000 9690 17 5
AUDI FOX 6295 23 3
BMW 320I 9735 25 4
BUICK CENTURY 4816 20 3
BUICK ELECTRA 7827 15 4
BUICK LESABRE 5788 18 3
CAD. ELDORADO 14500 14 2
OLDS STARFIRE 4195 24 1
OLDS TORONADO 10371 16 3
PLYM. VOLARE 4060 18 2
PONT. CATALINA 5798 18 4
PONT. FIREBIRD 4934 18 1
PONT. GRAND PRIX 5222 19 3
PONT. LE MANS 4723 19 3
;
RUN;
/*方法一由此開始*/ DATA AUTO2;
SET AUTO;
IF REP78=1 THEN REP78_1=1;ELSE REP78_1=0;
IF REP78=2 THEN REP78_2=1;ELSE REP78_2=0;
IF REP78=3 THEN REP78_3=1;ELSE REP78_3=0;
IF REP78=4 THEN REP78_4=1;ELSE REP78_4=0;
RUN;
/*此部分為檢驗編碼正確與否*/ PROC FREQ DATA=AUTO2;
TABLE REP78*REP78_1*REP78_2*REP78_3*REP78_4 /LIST;
RUN;

程式說明:此例中,rep78共有五個類別,需要產生四個虛擬變項,REP78=5作為參考組。

方法二
DATA AUTO3;
SET AUTO;
REP78_1=(REP78=1);
REP78_2=(REP78=2);
REP78_3=(REP78=3);
REP78_4=(REP78=4);
RUN;
PROC FREQ DATA=AUTO3;
TABLE REP78*REP78_1*REP78_2*REP78_3*REP78_4 /LIST;
RUN;

這個程式算是方法一的改良版,省略了繁複的if then else,是我很喜愛的做法。

方法三
DATA AUTO4;
SET AUTO;
ARRAY DUMMYS {*} 3. REP78_1 - REP78_5;
DO I=1 TO 5;
DUMMYS(I) = 0;
END;
DUMMYS( REP78 ) = 1;
RUN;
PROC FREQ DATA=AUTO4;
TABLES REP78*REP78_1*REP78_2*REP78_3*REP78_4*REP78_5 / LIST ;
RUN;

這個方法是用ARRAY敘述句來進行虛擬變項的編碼,一個類別需要搭配一個虛擬變項,該陣列的名稱為DUMMYS,內涵五個新的變項REP78_1 - REP78_5,接下來使用"DO...TO...END" LOOP,先令所有變項預設值為0,最後再用DUMMYS(REP78)=1給定適當的值,譬如說當REP78=4時,則DUMMYS(4)、也就是陣列中的第四個元素REP78_4=1

跑完這個程式可能有些人會有一個疑問,哪一個虛擬變項是這個程式中的參考組?以PROC REG為例,系統預設最後一個虛擬變項作為參考組,迴歸分析的報表出來時最後一個虛擬變項的${\beta}$值會顯示為0,且在報表中會出現下列字串:

Note: The following parameters have been set to 0, since the variables are a linear combination of other variables as shown.

如果還是不放心的人,可以用下列的程式驗證這樣的編碼是否會影響統計分析的結果:

PROC REG DATA=AUTO3;
MODEL PRICE=REP78_1-REP78_4;
RUN;
PROC REG DATA=AUTO4;
MODEL PRICE=REP78_1-REP78_5;
RUN;

※迴歸分析前要記得先編譯好虛擬變項阿!!

方法四
/* A MACRO FOR DUMMING CODING */
%MACRO NOMINAL_TO_BINARY(
SM_DATASET=/* DATA SET */,
SM_VAR= /* CATEGORICAL VARIABLE */,
SM_PREFIX= /* PREFIX FOR DUMMY VARIABLES */);
/* FIND THE UNIQUE LEVELS OF THE CATEGORICAL VARIABLE */
PROC SORT DATA=&SM_DATASET(KEEP=&SM_VAR) OUT=&SM_DATASET._UNIQUE NODUPKEY;
BY &SM_VAR;
RUN;
DATA _NULL_;
SET &SM_DATASET._UNIQUE END=END;
/* USE CALL EXECUTE TO DYNAMICALLY CREATE A MACRO THAT EXECUTES */
/* AFTER THIS DATA STEP FINISHES. THE METAPROGRAMMED MACRO */
/* MODIFIES THE ORIGINAL DATA SET. */
IF _N_ EQ 1 THEN DO;
CALL EXECUTE("DATA &SM_DATASET;");
CALL EXECUTE("SET &SM_DATASET;");
END;
CALL EXECUTE(CAT("LENGTH &SM_PREFIX", &SM_VAR," 3;")); /* USE MINIMUM STORAGE */
CALL EXECUTE(CATS("&SM_PREFIX", &SM_VAR," = &SM_VAR = '", &SM_VAR,"';"));
IF END THEN CALL EXECUTE('RUN;');
RUN;
PROC SQL;
/* CLEAN UP */
DROP TABLE &SM_DATASET._UNIQUE;
QUIT;
%MEND;
/* GENERATE A SAMPLE DATA SET */
DATA AUTO6;
SET AUTO;
RUN;
/* EXAMPLE INVOCATION */
%NOMINAL_TO_BINARY(SM_DATASET=AUTO6, SM_VAR=REP78, SM_PREFIX=REP78_);
PROC FREQ DATA=AUTO6;
TABLES REP78*REP78_1*REP78_2*REP78_3*REP78_4*REP78_5 / LIST ;
RUN;

這個方法出自於Heuristic Andrew,有興趣的人可以研究作者所寫的Comment,我在這部分沒有進行更動。這個方法是將資料內重新排序,並且利用資料內容來判斷需要多少虛擬變項。要特別注意的一點是,如果你要建立虛擬變項的類別變項是連續變項再分組而來的話,不建議使用這個方法,假使你其中一個組數目為0,那他就不會將該組納入虛擬變項中。

使用這個程式的方法很簡單。將Marco貼上之後讀入資料集,最後唯一要修改地方在最後一行:

%NOMINAL_TO_BINARY(SM_DATASET=(1), SM_VAR=(2), SM_PREFIX=(3));
  1. 要建立虛擬變項的資料集
  2. 類別變項的名稱
  3. 通常是類別變項加上"_"符號

這個做法在只有一個類別變項需要建立虛擬變項的時候效果並不明顯,但如果遇到的狀況是許多類別變項的時候就會非常好用。

延伸閱讀

Is there a quick way to create dummy variables?
How to Create Dummy Variables in SAS

本著作依據Creative Commons 姓名標示-非商業性-相同方式分享授權條款釋出

留言

熱門文章

[How To] 關閉Windows 10檔案總管「最近使用過的檔案」功能

剛開始使用Windows 10的使用者,應該會發現檔案總管跟過去有點不同,一打開就會顯示「最近使用過的檔案」。如果電腦只有使用者自己在使用,那的確是挺不錯的功能,但如果是和家人共用的情況下,也等於是直接把最近開對於啟檔案的紀錄暴露出來,對於我這種害羞內向的人來說與公開處刑無異,是個絕對NG的功能。 因此這次就是要告訴各位要怎樣把「最近使用過的檔案」這個NG的功能給關閉,並且將檔案總管的初始畫面調整成過去使用者所熟悉的「我的電腦」。 ▲在未關閉「最近使用過的檔案」的情況下,檔案總管的初始畫面會如上圖這般。

[How To] VPN Gate:由日本筑波大學所營運的免費VPN服務

一般使用者會接觸到VPN,最常見的情況就是想訪問被封鎖的網站、匿名上網、又或者想使用某些限定國家或區域的線上服務、遊戲等等。如果使用者不想付費購買VPN服務,這時候可以利用筑波大學以學術研究為目的而營運的 VPN Gate 來達成,VPN Gate這項計畫的目的在於推廣「全球分散式公共VPN中繼伺服器」的相關知識,為此VPN Gate的中繼伺服器由世界各地的志願者所提供的,用戶無須註冊就能使用,並且支援Windows、Mac、iPhone、iPad、Android等不同的作業系統,連線方式除支援SSL-VPN協議(必須使用Softether VPN)外,各伺服器的維護者也能選擇是否支援L2TP/IPsec、OpenVPN、Microsoft SSTP等不同的網路協議,這次我要介紹的是透過Softether VPN Client搭配VPN Gate Client Plugin來進行連線的方法。

[How To] 如何將Windows10的數位授權連結(綁定)Microsoft帳號?

前一篇網誌是我在2016年6月那時所寫的,轉眼間現在已經到了2017年年底,雖然中間也不是沒有興起想寫網誌的念頭,但那段期間的生活上也不像過去那般有餘裕,直到最近社畜的生活比較上軌道後,才有機會來想想要寫些什麼。 這次要介紹的是Windows10的數位授權連結,換句話說就是將使用者的微軟帳號( 申請新帳號 )與Windows10的授權綁定。這樣做對使用者會有什麼好處?在你未來要將安裝Windows10的電腦淘汰時,Windows10授權不再是綁定電腦的主機板,而是綁定微軟帳號,所以只要在將擁有Windows10授權的微軟帳號做為新電腦的系統管理員帳號,就可以在新的電腦上使用前一台電腦上的Windows10授權,當然前一台電腦將不再有Windows10的授權。有關 硬體變更(包括更換主機板)之後重新啟用Windows10 的相關說明可以參考微軟的這篇: 硬體變更之後重新啟用 Windows 10 。

[How To] 還不知道怎樣低調還原的鄉民看這裡

本文絕對沒有叫鄉民去領便當的意圖(?)。在批踢踢上的某些專版,會因為某些特別的需要,所以必須使用低調碼來傳遞訊息。有沒有效果當然是見人見智,但板規這麼寫,也只好這麼做。

[How To] VLC Media Player影片錄製及截圖功能介紹

前陣子才剛寫過網誌 介紹VLC Media Player 這套影音播放程式,它是我目前在 MPC-HC專案終結 以後的替代方案,VLC Media Player跨多種平台(Windows, Mac OSX, Linux, Android, iOS )、並且廣泛支援各種影音格式,並且無須經過太複雜的設定即可上手。這次我就來說一下,VLC Media Player錄製影片片段以及製作影片截圖的功能該如何使用。

[SAS] 利用PROC IMPORT匯入外部資料

因為資料來源的不同,所以拿到的資料格式往往各式各樣,可能是Excel的xls,xlsx檔,SPSS的sav檔,STATA的dta檔,txt純文字檔,csv檔,dat原始資料檔等等。SAS雖然能使用Import Wizard匯入其他統計套裝軟體和Excel資料,但以我過去的經驗來講,套裝軟體之間的發行時間差太多,或是作業系統因素(參考 【SAS 9.3小技巧】SAS 9.3 64位元版匯入Excel?! ),常常會讓這個功能折騰使用者老半天,所以建議在原生軟體先把資料存成純文字檔讓SAS來讀取(建議存成CSV檔,以逗號來區隔資料的純文字格式),今天將介紹如何用SAS內的PROC IMPORT敘述句來匯入純文字格式的外部資料。(.dat原始資料還是要使用FILENAME+INFLIE敘述句來匯入)

[How To] 在Windows10 家用版啟用本機群組原則編輯器功能(GPedit.msc)

一直以來Windows 10 家用版因為無法啟用「本機群組原則編輯器(GPedit.msc)」,使得不少要有GPedit.msc功能才能調整的設定。譬如Windows更新政策,就會受限於沒有GPedit.msc而無法調整,所以我都將Windows 10 家用視為閹割版,並不建議朋友購買,寧可多花一點錢買專業版。 小秘訣: 如何檢測Windows10的版本?以快捷「 WinKey+R 」叫出「執行」功能,並以「 winver 」關鍵字執行,就會出現「關於Windows」視窗,上面就有記載Windows10的版本。 最近因為 Windows 10 1809版更新的災情 鬧得沸沸揚揚,和朋友聊天的時候又聊到Windows10以來的這一連串災難,這時候我才知道原來我的資訊已經落伍了,Windows 10的家用版其實也可以啟用GPedit.msc,只是需要下指令來執行。今天我就來說明Windows 10家用版的使用者,該如何正確啟用「本機群組原則編輯器(GPedit.msc)」這項超重要的功能。

[How To] 影音播放器 MPC-HC 1.7.1 初學者設定教學

注意: 目前MPC-HC 開源專案已於v1.7.13結束( 資訊來源 ),建議使用者改用另一款開源影音播放器: VLC Media Player ( 相關介紹 )。 這幾年如果談到Windows上的影音播放器,許多人想到的不是KMPlayer就是PotPlayer。但其實除了這兩款之外,還有以Media Player Classic為基礎繼續開發的MPC-HC可以選擇。MPC-HC由於預設功能的關係,所以給人一種沒有前兩款影音播放軟體來得好用的印象,其實只要經過幾個簡單的步驟,MPC-HC就能夠符合大多數人的需求。 軟體資訊 軟體名稱:MPC-HC 作業系統:Windows® XP SP3, Vista, 7, 8 both 32-bit and 64-bit 語言介面:支援正體中文 最新版本:1.7.1 官方網站: http://mpc-hc.org/ 下載頁面: http://mpc-hc.org/downloads/ 重大事項:由於MPC-HC v1.6.8有緩衝區溢位的漏洞,因此官方強烈建議更新至v1.7.0之後的版本。(2013/10/06更新)

[How To] 簡單易上手的影音播放器 ─ VLC Media Player 3.0.0

以前我曾經在這個網誌上寫過一篇 MPC-HC的相關介紹 , MPC-HC 是我近幾年認為在Widnows平台上最好用的影音播放器,那篇後來沒有隨著版本更新的另一個原因,是一位MPC-HC的設定越來越懶人,當時寫的教學後來看都顯得多餘XD。 但在去年七月中旬的時候, MPC-HC 官網發佈了v1.7.13版,同時 宣布這版將可能是MPC-HC的最後一個版本 。隨著眾多志願開發者的逐漸離去,這個開源專案在第11年也終於走到了盡頭。雖然很遺憾,但在沒有其他開發者願意投入這個開源專案的情況下,使用者也只能尋覓替代方案。

[How To] 在Windows 10使用熟悉的「自黏便箋」

從Windows 7時代開始,「自黏便箋」這個小工具就頗受歡迎,雖然功能陽春,但用來記錄一些瑣碎的待辦事項相當好用,今天就來介紹Windows 10的自黏便箋要如何使用。