gen與egen,傻傻分不清楚?

      網友投稿 5808 2025-04-01

      gen與egen,傻傻分不清楚?


      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數據集:

      (1)生成一個新變量sex:使其等于gender并以“1 `男’ 0 `女’”的值標簽顯示。

      label define sexlb 1 “男” 0 “女”gen sex:sexlb = gender

      運行結果如下圖所示,表明gen命令能夠在創建新變量的同時賦予已定義的值標簽,但egen沒有該功能。

      (2)生成個人id變量:為每個家庭成員編碼,比如第一個家庭中父親的編碼為11,第二個家庭中祖父的編碼為21。

      *嘗試用gen生成:

      bysort hid: gen idg = hid*10+_n

      運行結果如下,各成員編碼正確。

      *嘗試用egen生成:

      bysort hid: egen ide = hid*10+_n

      運行出現錯誤。顯然,egen無法使用運算符,只能使用其專屬的函數來計算生成變量值。

      (3)生成AgeRank變量:以家庭為單位,對家庭成員按年齡升序排序;生成hsize變量:計算每個家庭的人口數。

      *使用gen生成:

      bysort hid (age): gen AgeRankg = _n //使用bysort對hid分組并排序,(age)表示age不參與分組,僅參與家庭內部的排序。bysort hid: gen hsizeg = _N

      運行結果如下圖所示,第一個家庭為3人,第二個家庭為6人。

      *使用egen生成:

      bysort hid (age): egen AgeRanke = _nbysort hid :egen hsizee = _N

      運行出錯,表明egen無法使用_n和_N。

      (4)生成mean變量:計算每個家庭的平均年齡。

      *使用gen創建新變量:

      bysort hid: gen meang = mean(age)

      運行出錯,表示gen無法使用egen專屬函數。

      *使用egen創建新變量:

      bysort hid: egen meane = mean(age)

      運行結果如圖所示,這表明egen的一些函數可以搭配by前綴使用。

      (5)生成IncomeSum變量:計算兩個家庭的總收入。

      gen IncomeSumg = sum(income)egen IncomeSume = sum(income)

      運行結果如下圖所示。

      特別地,目前僅發現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命令啦。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:表格內填寫日期為何出來的是字母數字
      下一篇:Index,match函數數組應用基礎教程
      相關文章
      国产AV无码专区亚洲Av| 亚洲AV无码专区日韩| 在线观看亚洲成人| 亚洲国产人成精品| 亚洲阿v天堂在线2017免费| 亚洲avav天堂av在线网毛片| 亚洲中文无码av永久| 亚洲人成伊人成综合网久久| 亚洲三级中文字幕| 亚洲毛片基地4455ww| 亚洲中文无码线在线观看| 国产成人精品日本亚洲专一区| 亚洲免费视频观看| 亚洲一区二区三区播放在线| 国产成人精品日本亚洲18图| 在线aⅴ亚洲中文字幕| 亚洲精品无码久久久久牙蜜区| 亚洲夂夂婷婷色拍WW47| 亚洲爆乳无码精品AAA片蜜桃| 亚洲gay片在线gv网站| 久久精品国产亚洲AV| 亚洲高清无码在线观看| 中文字幕专区在线亚洲| 亚洲精品国产精品乱码不卡√| 亚洲av无码专区在线播放| 久久精品亚洲精品国产色婷| 亚洲手机中文字幕| 亚洲精品第一综合99久久| 亚洲欧美日韩自偷自拍| 亚洲国产V高清在线观看| 久久久久国产成人精品亚洲午夜 | 亚洲ⅴ国产v天堂a无码二区| 亚洲国产一区国产亚洲| 亚洲国产精品成人精品软件| 亚洲国产熟亚洲女视频| 国产成人精品日本亚洲语音| 亚洲伊人成无码综合网 | 亚洲另类无码一区二区三区| 午夜亚洲乱码伦小说区69堂| 久久亚洲国产精品123区| 亚洲Av永久无码精品三区在线|