personage与年龄
本文作者:陈志玲
文字编辑:张馨月
导读
在stata中经常会遇到计算年龄的数据处理,而我们最常用的就是用date()将数据变为指定数据格式,然后当前日期和出生日期相减,得到最终的年龄。当然所有计算年龄的方式,都逃不过减法。今天我们来介绍一个专门为计算年龄开发的命令——personage。当然personage不仅可以得到人们的年龄还能得到日期之差(天数)。
因为personage是一个外部命令,需要我们先进行安装:
ssc install personage
在stata的说明文档中,personage有两种语法,即personage有两种用法。
一、基本语法
personage bdatevar cdatevar [ifexp] [in range] , generate(yearsvar [daysvar[loyvar]])
其中bdatevar是出生日期,cdatevar是当前日期,中括号里面是可选项,其中if exp表示条件选择表达式,in range表示选择范围。另外generate()选项会生成年龄,即前两个日期的年份之差,其中的可选项daysvar是距离上次生日的天数,loyvar是从上一个生日到下一年该生日日期需要的天数(可能取值为365、366或缺失)。在此处,generate()是必选项。
personage bdatevar [if exp] [in range] , currdate(current_date) generate(yearsvar [daysvar [loyvar]])
同上述一样,bdatevar是出生日期,但是此处没有直接给当前日期,而是经过currdate()获得的。generate()与上述一致。区别在于,currdate()是此处的必选项,而第一种语法是不允许有currdate()的。
二、personage的运用
下面,我们一起来看运用personage的一个例子:目前,我们有一个日期矩阵M,M含有六个人的出生日期,当前时间是2020年5月12日,为了得到这六个人的年龄和距离上一次生日的天数,下面用两种语法实现。
第一步,我们先创建矩阵M:
clear
mat values = (28, 19, 28, 29, 28, 29\3, 11, 2, 2, 2, 2\1970, 1980, 1990, 2000, 2010, 2020)
之后需要新生成变量,所以先设置变量个数:
set obs `=colsof(values)'
这里是把矩阵values的列数作为了变量数量,通过colsof()函数获得values的列数,然后将列数定义为宏,再赋值给变量个数。
接下来,将矩阵values的第二行所有数值当做month,第一行所有数值当做day,第三行所有数值当做year,生成出生日期变量bdatevar,并设置当前日期为2020年5月12日,即:
gen bdate = mdy(values[2, _n], values[1, _n], values[3, _n])
gen cdate = mdy(5,12,2020)
运行程序后,stata的数据集中就有了数据:
此时数据是一串数值,可以看到数据集中还有负数,这是因为,此时的数据是按以1960年1月1日为第0天开始计算的天数,在此之前的时间,则以负数表示。接下来,就可以直接使用personage命令了。
personage bdate cdate, gen(age1 days1)
运行之后,结果如下:
可以看见,此时虽然没有报错,但是stata给了警示信息:bdate和cdate没有格式化为每日日期的日期格式。这是使用personage命令中一个需要注意的地方,bdate和cdate 需要先格式化为日期,然后再使用personage命令,即:
format bdate cdate %td
运行结果如下:
最后用第二种语法来实现上述例子:
personage bdate, currdate(mdy(5,12,2020)) gen(age2days2)
运行结果为:
最终我们可以看到,两种语法获得的结果是一样的。
当然,我们还可以获得每个人上一个生日到下一个生日所需的天数,即:
personage bdate cdate, gen(age1 days1 loy1)
从下面的结果可以看出,产生了两个缺失值,因为第四个和第六个人的生日为2月29日,而2020年是闰年,2021年不是闰年,所以2021年的2月29是不存在的,故为缺失值。
看完本篇介绍,有没有了解personage命令呢!以后遇到计算年龄的数据时,可以试一试哦!
程序:
clear
mat values = (28, 19, 28, 29, 28, 29\3, 11, 2, 2, 2, 2\1959, 1980, 1990, 2000, 2010, 2020)
set obs `=colsof(values)'
gen bdate = mdy(values[2, _n], values[1, _n], values[3, _n])
gen cdate = mdy(5,12,2020)
format bdate cdate %td
personage bdate cdate, gen(age1 days1)
personage bdate, currdate(mdy(5,12,2020)) gen(age2 days2)
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。