跳到主要內容

[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] 還不知道怎樣低調還原的鄉民看這裡

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

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

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

[How To] 將手機分享的網路設定為計量付費連線,避免Windows Update吃光你的網路流量。(Windows10)

原本我的規劃是先寫Windows系統重設教學,但昨天發生了一件令人悲痛的事情,讓我決定先寫這個主題。 這裡先講一下事情經過,昨天我帶著筆電去參加教育訓練,接著像其他人一樣用手機分享網路供筆電使用,但是當教育訓練經過兩小時之後,Windows10突然跳出已經準備好Windows Update,電腦需要重新啟動的提示訊息。看到的當下眼前一片黑暗!所以Windows 10在我用手機分享網路給筆電時,默默地下載了Windows Update所需的檔案?可是我的手機並不是網路吃到飽啊!當下立刻用中華客服檢查 了這個月未出帳的網路流量,結果我當天就噴了高達700MB的流量!(我並不常使用筆電,所以累積了不少更新未下載。)

[SAS] Enhanced Editor小技巧

 使用SAS的人應該多少都有過一樣的經驗,那就是內建的Enhanced Editor用起來感覺沒有什麼特殊的功能,但其實這個文字編輯器也有許多和市面上其他文字編輯器一樣方便的編輯功能,只是使用者需要花一點時間來學習,接下來我們會介紹一些小技巧

[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 家用版啟用本機群組原則編輯器功能(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] 關閉Windows 10檔案總管「最近使用過的檔案」功能

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

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

這篇文章在我心中其實已經醞釀很久了,雖然目前台北市的三位主要市長候選人都有在各自的官方網站上公布政見,但以我自己瀏覽的經驗來講,這些官網都沒辦法讓民眾很輕易地就找到其所重視的政見,在 連勝文的明日台北 還有 馮光遠的夯台北 網站上,甚至沒有提供站內搜尋的功能,在設計上非常社群網站。而候選人的政見也未必能透過新聞媒體很好的傳達給民眾,或者經由對手在新聞上的操作而受到曲解。 有感於此,為了讓台北市的選民能夠更方便的瀏覽三位主要市長候選人的各項政見,我開始著手製作各個候選人的政見懶人包,而首先完成的就是這篇柯文哲篇,而當柯文哲、連勝文與馮光遠三人的政見懶人包都完成之後,如果有額外的時間我會對這三位候選人共通的政見(譬如:居住問題方面的政策)進行比較。總之,由於我的目標是希望能夠傳遞正確的資訊,如果在政見整理時有所疏漏,煩請在底下留言,我會盡我所能地盡速更新。 最後,在你開始看這篇文章之前,我想引用 《談論價值的重要性》 這篇文章的其中一段話:「當以後別人告訴你,要當個理性的選民,要回歸政策去討論的時候,也許你可以告訴他,你很樂意討論政策,但在討論政策之前,也許我們應該先討論一下,這個候選人,他相信的價值,到底是什麼,他又為自己的理念,付出了哪些努力,因此讓你可以檢視,他的政策,全盤看下來,是否和他的理念相符。也讓你可以相信,他真的會按照這樣的理念,去推動他的政策。」。 本懶人包的所有內容皆出自於 柯文哲官網 以及柯文哲醫師的幕僚 潘建志醫師所建置的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] 認識Windows 10內建的重灌功能 ─ 「重設此電腦」。

2018/11/5新增: 無法登入Windows10,「重設此電腦」的操作方式。 在Windows 8開始,Microsoft在Windows的還原選項增加一個叫做「重設此電腦」的功能,跟過去依賴還原點的「系統還原」運作方式並不相同。這裡先說明一下Windows「系統還原」的運作方式,Windows會在安裝應用程式、驅動程式、以及系統更新的同時自動建立還原點。如果遭遇到應用程式、驅動程式或者系統更新產生的問題時,就可以用系統還原的方式回溯到系統變更之前的狀態。 但要注意的是,這種還原方式並不會影響到個人檔案,所以當問題是發生在個人檔案時,因為系統並不會針對個人檔案的變動產生還原點,所以還原並無法解決問題,這也是為什麼由惡意程式導致的系統錯誤,用系統還原可能無法解決問題。 咳,有點離題了。總之系統還原是針對新安裝的應用程式、驅動程式,還有系統更新建立還原點。那如果最近沒有安裝新的應用程式、驅動程式還有系統更新,但電腦還是出了問題,那很明顯就不是系統還原可以處理的範圍,這時候我們就需要依賴Windows 8以後新增的「重設此電腦」這項功能了,登登登。

[How To] Fate/Grand Order (F/GO)引繼教學(日文版)

當你下定決心要跳入Fate/Grand Order這個錢坑手遊之後,最重要的事情就是產生一組引繼碼。 倘若你手機遺失、手機損壞又或者是因為蘋果的惡意,要救回F/GO的進度時,輸入引繼碼就像是告訴伺服器,我就是某某某玩家,請把我過去的紀錄與這台手機連結這樣。如果沒有有效的引繼碼,就只能進行 帳號遺失申訴 ,這時就必須提供營運課金相關的紀錄(提供這個帳號曾經使用過已經無效的引繼碼也可),否則就無法證明帳號確實屬於你所有,救回帳號的機會當然也救大大地降低,所以當你確定你要好好的玩F/GO時,最重要的就是 建立一組引繼碼 。 不過千萬要記得 一組引繼碼只限使用一次的原則 ,引繼碼使用過後就必須重新產生一組引繼碼,接下來就說明取得引繼碼的相關步驟。