你是不是和基因混淆了,傻瓜?

1.介绍

众所周知,gen是Stata中经常使用的变量生成命令之一。呃,还有其他变量生成命令吗?是的,egen(generate的扩展)作为gen的扩展,补充了gen命令,帮助我们更好地利用变量生成功能。2.Gen与egen的比较

我们将从语法的角度比较gen和egen的异同,看看egen是如何扩展gen的。

Gen的语法是:

产生

(1)生成一个新的变量性别:使其等于性别,用“1 `男' 0 `女”的值标签显示。

标签sexlb1“男性”0“女性”gensex: sexlb1 =性别

运行结果如下图所示,说明gen命令可以创建新的变量,同时给定义的值加标签,但是e gen没有这个功能。

gen与egen,傻傻分不清楚?-大盘站插图

(2)生成个人id变量:对每个家庭成员进行编码。例如,第一个家庭中父亲的代码是11,第二个家庭中祖父的代码是21。

*尝试用gen生成:

bysort hid: gen idg = hid*10+_n

运行结果如下,成员代码正确。

gen与egen,傻傻分不清楚?-大盘站插图1

*尝试用egen生成:

bysort hid: egen ide = hid*10+_n

存在运行错误。显然,egen不能使用运算符,只能使用自己的函数来计算生成的变量值。

gen与egen,傻傻分不清楚?-大盘站插图2

(3)生成一个AgeRank变量:以家庭为单位,按年龄升序对家庭成员进行排序;生成hsize变量:计算每个家庭的人口。

*使用gen生成:

Bysort hid(age):genageranKG = _ n//使用by sort对hid进行分组和排序。(年龄)是指年龄不参与分组,只参与家庭内部的排序。bysort hid: gen hsizeg = _N

操作结果如下图所示。第一个家庭有3个人,第二个家庭有6个人。

gen与egen,傻傻分不清楚?-大盘站插图3

*使用egen生成:

伊根·阿朗克

错误,表示egen不能使用_n和_ n。

gen与egen,傻傻分不清楚?-大盘站插图4

(4)生成均值变量:计算每个家庭的平均年龄。

*使用gen创建一个新变量:

bysort hid: gen meang = mean(年龄)

运行时出错,表明gen不能使用egen特定的函数。

gen与egen,傻傻分不清楚?-大盘站插图5

*使用egen创建一个新变量:

bysort hid: egen meane = mean(年龄)

运行结果如图所示,表明egen的一些函数可以和by前缀一起使用。

gen与egen,傻傻分不清楚?-大盘站插图6

(5)生成IncomeSum变量:计算两个家庭的总收入。

gen IncomeSumg = sum(收入)

操作结果如下图所示。

gen与egen,傻傻分不清楚?-大盘站插图7

特别是,gen和egen只能同时使用sum()函数。使用gen命令,sum()函数生成的IncomeSumg是各列的累计和,如income sumg[2]= income[1]+income[2],这是一个运行值,而e gen命令返回的sum()是各列的总和。IncomeSume的每个变量值等于收入变量值之和(即44000 = 5000+8000+9000+0+4000+8000+6000+2000+2000),是一个常数。

其实sum()作为一个常规的数学函数,并不属于egen的独占函数,而egen的独占函数中total()的作用和sum()完全一样——返回列的总和。这个矛盾我们目前没有答案。如果读者朋友有合理的想法,请在评论区告诉我们~4。结论。

基于以上分析,我们可以得到启示:使用gen命令创建一个新变量是一种“相对”创建。例如,现在需要生成一个新变量,即年度个人收入incomey:

性别收入=收入*1

该命令的本质是创建一个新的变量incomey,以便:

incomey[1]= incomey[1]* 12 incomey[2]= imcome[2]* 12…incomey[_ N]= income[_ N]* 12

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

egen meani = mean(收入)

其中收入计算为总收入(即4.4万),与gen command有明显区别。

当然,egen还有很多其他的独占函数,比如anycount()、anymatch()等使用“相对”创建方法的独占函数,以及rowfirst()、rowmax()等匹配判断每一行的函数...简而言之,当你想创建一个结果或者根据整行或整列的特征判断和匹配条件时,可以考虑使用egen命令。