你是不是和基因混淆了,傻瓜?
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没有这个功能。
(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):genageranKG = _ n//使用by sort对hid进行分组和排序。(年龄)是指年龄不参与分组,只参与家庭内部的排序。bysort hid: gen hsizeg = _N
操作结果如下图所示。第一个家庭有3个人,第二个家庭有6个人。
*使用egen生成:
伊根·阿朗克
错误,表示egen不能使用_n和_ n。
(4)生成均值变量:计算每个家庭的平均年龄。
*使用gen创建一个新变量:
bysort hid: gen meang = mean(年龄)
运行时出错,表明gen不能使用egen特定的函数。
*使用egen创建一个新变量:
bysort hid: egen meane = mean(年龄)
运行结果如图所示,表明egen的一些函数可以和by前缀一起使用。
(5)生成IncomeSum变量:计算两个家庭的总收入。
gen IncomeSumg = sum(收入)
操作结果如下图所示。
特别是,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命令。