2008年4月13日星期日

我常用到的stata命令之四

(续)
egen也是生成变量的一个命令,特点是函数功能强大。gen可以支持一些简单的函数,像四则运算。egen支持更复杂的函数,比如求某变量的平均值,

egen ave = mean((变量名))

还有很多函数,可以从help里面查到,不一一列举。到现在为止我用到的有取平均、加和等函数。

讲了这么多,举个例子。某个原始数据中用变量date记录了一些日期,格式是:1980年12月11日被记为19801211。如果要提取其中的年份和月份,并生成虚拟变量,该怎么办?下面是我的做法:

gen yr=int(date/10000)
gen mo=int((data-yr*10000)/100)
ta yr, gen( yd)
ta mo, gen( md)

这里函数int()是取整函数,即把一个数字的小数部分去掉。

所需变量做好后,就可以保存为新数据库了。命令是save空格(文件名),replace。前面说过,replace选项将更新对数据库的修改,所以一定要小心使用。所以应另存为一个新库,如果把原始数据改了又变不回去,就叫天不应叫地不灵了。

除了对单个数据库的简单操作外,有时需要改变数据的结构,或者抽取来自不同数据库的信息合并。这一类命令中我用过的有:改变数据的纵横结构的命令reshape,生成退化数据库的命令collapse,合并数据库的命令append和merge。

reshape用于改变纵列(longitudinal)数据的结构。纵列数据就是通常说的面板(panel)数据,它记录下同一个主体(agent)同一个变量在不同时刻的观察值。记录纵列数据有宽表和长表两种格式。所谓宽表是以每个主体为纪录的单位,不同时期的相同变量都记录在同一观察下。例如,主体是某厂商,时期有2000、2001年,变量是雇佣人数和所在城市,假设雇佣人数在不同时期不同,所在城市则不变。宽表记录的格式是每个厂商是一个观察,没有时期变量,雇佣人数有两个变量,分别记录2000年和2001年的人数,所在城市只有一个变量。所谓长表是主体和时间共同定义观察,在上面的例子中,每个厂商有两个观察,由不同的年份变量区分,雇佣人数和所在城市在不同观察下都只有一个,记录在不同年份该变量的取值。reshape就是把数据库把宽表变成长表,把长表变成宽表。

在上面的例子下,把宽表变成长表的命令格式如下:

reshape long (雇佣人数的变量名), i((标记厂商的变量名)) j((标记时期的变量名))

因为所在城市不随时期变化,所以在转换格式时不用放在reshape long后面,转换前后也不改变什么。相反,把长表变成宽表只需把long换成了wide。

collapse的用处是计算某个数据库的一些统计量,再把这些统计量另存为新数据库。我用到它也较无奈,因为我找不到直接报告中位数和从1%到99%百分位数的命令。哪位大侠知道麻烦告诉我一下,在下先谢过了。计算中位数的命令如下。

collapse (median) ((变量名)), by((变量名))

生成的新数据库中记录了第一个括号中的变量(可以是多个变量)的中位数。右面的by选项是根据某个变量分组计算中位数,没有这个选项则计算全部样本的中位数。
(待续)

1 条评论:

Unknown 说...

sum varname, detail
在用了上面的命令后,默认的r(p1)指 1 percentile, r(p99)默认指99 percentile.

暂时没有想到更好的方法。

看你的关于stata的blog获益甚多。谢谢!