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)]选项允许我们调整新变量的顺序;
【gen与egen,傻傻分不清楚?】(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无法使用运算符,只能使用其专属的函数来计算生成变量值 。
猜你喜欢
- 小红书体验星级什么意思?与服务分有什么关系?
- 快手极速版有什么亮点?与快手有什么区别?
- 筒叶花月怎么养?筒叶花月的栽培技术与繁殖方式
- 多肉植物雪莲怎么养?雪莲的栽培技术与繁殖方式介绍
- 蟹爪兰的生长习性与寓意和价值介绍
- 落花之舞怎么养?落花之舞的栽培技术与繁育方式
- 关于神态和动作的句子 关于神态与动作的句子
- 红糖水的功效与作用 不同红糖水不同功效
- 星球怎么养?星球栽培技术与繁殖方式介绍
- 金手指怎么养?金手指的栽培技术与繁殖方法
