查看原文
其他

gen与egen,傻傻分不清楚?

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:王玉婷

文字编辑:王玉婷

技术总编:余术玲

爬虫俱乐部云端课程来袭!

爬虫俱乐部将于2020年8月25日至28日在线上举行Stata数据分析法律与制度专题训练营,主要是为了让学员掌握Stata软件进阶操作,涉及内容包括基本字符串函数及其应用、正则表达式、法律与制度数据网络爬虫技巧、判案文书的文本分析等技术。详情请参考8月Stata数据分析法律与制度专场来啦!

    另外,爬虫俱乐部于2020年7月在线上举办的Stata与Python编程技术训练营已圆满结束。应广大学员需求,我们的课程现已在腾讯课堂双双上线,且继续提供答疑服务。现在关注公众号并在朋友圈转发推文《来腾讯课堂学Stata和Python啦!》,即可获得600元课程优惠券,集赞50个再领200元课程优惠劵!(截图发至本公众号后台领取)原价2400元的课程,现在只要1600元

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]*12incomey[_N] = income[_N]*12

而egen的某些专属函数的参数往往是某一整行或某一整列,比如计算两个家庭的月收入均值,月收入的下四分位数:

egen meani = mean(income)egen pctile4 = pctile(income),p(25)

其中,income是作为收入总和(即44000)参与计算的,这与gen命令有显著的不同。

当然,egen还有许多其他专属函数,比如anycount()、anymatch()等使用“相对”创建方法的专属函数,也有rowfirst()、rowmax()等对每行进行匹配和判断的函数……总之,当你想创建一个以整行或整列的特征为结果或判断、匹配条件时就可以考虑使用egen命令啦。







对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐

用WordStat看中国日报新闻(二)

一招轻松合并文件——openall命令介绍

爬虫俱乐部平安经
一个函数实现PDF文档合并与拆分
补全股票代码位数的一百种姿势

明星闪闪亮:各校高被引论文

高校经管类核心期刊发文排行榜|2010-2019

PDF图片提取
PDF文档转换成图片

split和nsplit助你轻松拆分

集成学习介绍之三——Stacking算法

PyMuPDF提取文本信息

Mylabels命令介绍  

用WordStat看中国日报新闻  

数据集的划分——交叉验证法

大数据视角下的大学录取分数排行
集成学习介绍之二——Boosting算
关于我们


微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存