跳到主要內容

[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 姓名標示-非商業性-相同方式分享授權條款釋出

留言

熱門文章

[分享] 台北市長候選人政見懶人包─柯文哲篇

這篇文章在我心中其實已經醞釀很久了,雖然目前台北市的三位主要市長候選人都有在各自的官方網站上公布政見,但以我自己瀏覽的經驗來講,這些官網都沒辦法讓民眾很輕易地就找到其所重視的政見,在 連勝文的明日台北 還有 馮光遠的夯台北 網站上,甚至沒有提供站內搜尋的功能,在設計上非常社群網站。而候選人的政見也未必能透過新聞媒體很好的傳達給民眾,或者經由對手在新聞上的操作而受到曲解。 有感於此,為了讓台北市的選民能夠更方便的瀏覽三位主要市長候選人的各項政見,我開始著手製作各個候選人的政見懶人包,而首先完成的就是這篇柯文哲篇,而當柯文哲、連勝文與馮光遠三人的政見懶人包都完成之後,如果有額外的時間我會對這三位候選人共通的政見(譬如:居住問題方面的政策)進行比較。總之,由於我的目標是希望能夠傳遞正確的資訊,如果在政見整理時有所疏漏,煩請在底下留言,我會盡我所能地盡速更新。 最後,在你開始看這篇文章之前,我想引用 《談論價值的重要性》 這篇文章的其中一段話:「當以後別人告訴你,要當個理性的選民,要回歸政策去討論的時候,也許你可以告訴他,你很樂意討論政策,但在討論政策之前,也許我們應該先討論一下,這個候選人,他相信的價值,到底是什麼,他又為自己的理念,付出了哪些努力,因此讓你可以檢視,他的政策,全盤看下來,是否和他的理念相符。也讓你可以相信,他真的會按照這樣的理念,去推動他的政策。」。 本懶人包的所有內容皆出自於 柯文哲官網 以及柯文哲醫師的幕僚 潘建志醫師所建置的Tumblr 與 柯P新政推廣影片 。 政見目錄 衛生福利政策 02 安心外食 10 緊急照護 11 家醫制度 12 銀髮照顧 18 食安・10安 25 貼心的醫療 29 公益企業 教育政策 09 課後及寒暑假照護班 13 優質高中職 26 創新實驗教育 動保政策 22 打造友善動物城市 政府運作 01 i-Voting 03 參與式預算 交通政策 04 道路統一挖補 15 解救血汗計程車 16 公車路線大調整 23 發展完整自行車網絡 文化政策 17 文化自治 20 打造台北文化夢工場 21 讓流行音樂迎向下一個日出 觀光政策 19 觀光, 讓世界愛上台北 能源政策 14 先進節能城市 居住政策

[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] 關閉Windows 10檔案總管「最近使用過的檔案」功能

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

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

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

[How To] 利用線上RSS閱讀器服務 打造專屬的新聞閱讀環境

在智慧型手機如此普及的現代,新聞App多如牛毛,但對我來說,其實有些問題存在。首先是現有的新聞APP多半是由單一新聞媒體業者自行建構,自由時報的新聞APP,裡面只提供自由時報的新聞,紐約時報的APP,理所當然的只有來自紐約時報的新聞,但如果你想要閱讀到不同媒體的報導,就必須同時安裝有不同媒體業者的新聞APP。 不然就是使用Google新聞或Yahoo! 口袋新聞這類的新聞彙整平台所提供的App,但這類App多半缺乏自訂性,無法讓使用者自行選擇新聞來源。除此之外還有Flipboard( 相關介紹 )這類社交新聞雜誌工具,但我個人並不喜歡由演算法決定我該看什麼,長期下來接受到的資訊同質性會變得相當高,讓人有種生無可戀的厭世感(笑)。 也因為如此,相較於Facebook和Twitte這類靠演算法運作的社群網站,個人更喜歡 Plurk 這種不替使用者篩選資訊的社群網站。

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

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

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

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

[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)」這項超重要的功能。

[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] 影音播放器 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更新)