1.導讀
眾所周知,gen是Stata中使用頻率非常高的變量生成命令之一。誒,難道還有其他變量生成命令?是的,egen(extension of generate)作為gen的擴展,對gen命令進行了補充,幫助我們更好地使用變量生成功能。2.gen與egen的比較
我們將從語法出發,比較gen與egen的異同,看看egen是如何對gen進行擴展的。
gen的語法為:
generate [type] newvar[:lblname] =exp [if] [in] [,before(varname) |after(varname)]
egen的語法為:
egen [type] newvar = fcn(arguments) [if] [in] [, options]
相同點:
(1)gen和egen都是變量生成命令;
(2)變量類型[type]均為可選項,缺省時,gen和egen能夠根據新生成的變量值自動判斷并分配數據類型;
(3)兩者都能選用[if]和[in]進行條件判斷和范圍選擇;
(4)兩者都可以使用by前綴(在某些情況下egen無法使用by分組功能)。
不同點:
(1)[:lblname]選項使gen可以在生成新變量的同時賦予其已定義的值標簽,并且[, before(varname) |after(varname)]選項允許我們調整新變量的順序;
(2)敲重點:使用gen生成的新變量,其變量值是由給定的表達式(exp)計算所得,表達式中可以使用Stata中的任意運算符(如,代數運算符”+” “-“ “*” “\”,邏輯運算符”>” “<” “|” “&” “!”等)和九大類函數;
(3)敲重點:egen只能使用專屬的egen函數來為新變量計算變量值,如mean()、rank()等。值得注意的是,egen函數只能在egen命令下使用,不能用在gen的表達式中,egen命令也無法使用任何運算符或九大類函數來計算生成變量值;
(4)在使用gen命令時,_n和_N是我們常用的下標變量,用于表示行號和總觀測值非常方便,但egen卻無法使用。這是為什么呢?因為egen專屬函數往往以某個變量或某一觀測目標為參數,計算某個變量(一列)或觀測目標(一行)的某種特征(比如均值,使用mean()),因此無需使用_n和_N。這也提示了egen生成的新變量值往往是一個常數(constant),當然也有egen專屬函數的返回值不是常數,而gen生成的變量值則是一個變動值(running value)。
3.案例分析
下面,我們通過一個簡單的例子來驗證上述異同點。
現有兩個家庭:第一個家庭是一個三口之家,父親、母親、女兒的年齡分別是44、41、20歲;第二個家庭三代同堂,祖父祖母為83、85歲,父親母親為45、44歲,兒子24歲,孫女3歲。
插入input命令,把兩個家庭的把相關數據寫入stata數據集:
input hid age gender income1 44 1 90001 41 0 80001 20 0 50002 83 1 20002 85 0 20002 45 1 60002 44 0 80002 24 1 40002 3 0 0end
查看Stata數據集:
特別地,目前僅發現sum()函數能夠同時被gen和egen使用。利用gen命令,使用sum()函數生成的IncomeSumg是列累積和,比如IncomeSumg[2]=income[1]+ income[2] ,是一個變動值(running value),而在egen命令下sum()返回的則是列總和,IncomeSume的每一個變量值都等于income變量值的總和(即44000=5000+8000+9000+0+4000+8000+6000+2000+2000),是一個常數(constant)。
實際上,sum()作為一個常規數學函數,并不屬于egen專屬函數,并且egen專屬函數中的total()函數功能與sum()完全一致——返回列總和。這個矛盾我們目前尚無答案,讀者朋友們如有合理的想法請在評論區告訴我們唷~4.結論
綜合上述分析,我們能夠得到啟示:使用gen命令創建新變量是一種“相對”創建,比如,現要求生成一個新變量,個人年收入incomey:
gen incomey = income*1
這個命令的實質是,創建一個新變量incomey,使得:
incomey[1] = income[1]*12incomey[2] = imcome[2]*12…incomey[_N] = income[_N]*12
而egen的某些專屬函數的參數往往是某一整行或某一整列,比如計算兩個家庭的月收入均值,月收入的下四分位數:
egen meani = mean(income)egen pctile4 = pctile(income),p(25)
其中,income是作為收入總和(即44000)參與計算的,這與gen命令有顯著的不同。
當然,egen還有許多其他專屬函數,比如anycount()、anymatch()等使用“相對”創建方法的專屬函數,也有rowfirst()、rowmax()等對每行進行匹配和判斷的函數……總之,當你想創建一個以整行或整列的特征為結果或判斷、匹配條件時就可以考慮使用egen命令啦。