1. astile : 一个简明介绍
astile
可根据已有变量创建一个按 1 到 n 的等级排列的分级变量。
例如,我们可能有兴趣创建 10 个以公司大小为基础区分的公司分级组合。也就是将包含最小 10% 数值的公司设定为第 1 组,接下来的 10% 设定为第 2 组,依次类推, astile
新建了一个新变量数值在 1,2,3... 直到 n 之间变化,其中 n 是分组数的最大值,在 nq()
选项中予以指定。例如,如果我们想创建 10 个分组,新的变量的数值会在 1 到 10 之间。
astile
比 state 官方提供的 xtile
命令处理速度更快。 它的高效性在数据集较大或者当分组类别被多次创建时更加明显,比如说,我们可能需要根据每个年份或者月份分别创建分组。与 state 官方命令 xtile
不同,astile
是 byable 的,意即可以通过 bys
命令分组进行多维变量的分组生成。astile
处理分组运算时超级有效率。比如说,在在使用 bys
和不使用 bys
的情况下去处理有一百万观测值和 1000 个组别的数据时,通常只有几秒钟的时间差异。
ssc install astile,replace
案例1:根据公司的市场价值创建10个分组
size10
的新变量,其取值从 1 到 10 。数值的排序是基于现有变量 mvalue
生成。 在逗号之后,我们设定选项 nq(10)
,让 astile
生成 10 个分组。如果我们想要生成 20 个组,那么选项将是 nq(20)
。webuse grunfeld
astile size10 = mvalue, nq(10)
案例2:各年重复分级
若想要根据公司的市场价值按年份分别生成 5 个组别,可以使用 bysort
或者 bys
选项完成这个任务。这次我们把新变量命名为 size5
webuse grunfeld bys year : astile size5 = mvalue, nq(5) . * 或者使用如下命令,效果相同 astile size5_2 = mvalue, nq(5) by(year)
案例3:在数据子集上创建分位数断点
如果分位数断点需要以数据的子集为基础的话,我们可以用选项 qc()
,然后整个数据集中的观察值被分配给这些断点。这样的计算在检验资产定价模型中是很常见的。股票的分组在金融分析中通常是一个标准程序。研究者们经常使用诸如公司规模、账面市值比、投资额等变量进行股票的分组。也有少数研究者用工资的子样本去计算数据的十分位数断点,然后将公司分配给不同的分位组别。比如说:一个人可能会根据约证券交易所上市股票的市值排名确定各不同十分位数组段的断点值,然后将将纽约证券交易所、美国证券交易所和纳斯达克的所有公开交易股票分别分配到其中的一个分组中。使用 astile
实现上述操作将非常容易。
MarkCap
)。clear set obs 500 gen company=_n expand 100 bys company: gen year=_n+1950 bys company: gen xc=mod(company, 3)+1 gen exchange = cond(xc==1, "NYSE", cond(xc==2, "AMEX", "NASDAQ")) gen MarkCap=uniform()*10000
MarkCap
变量设定断点值,然后并将所有股票对应的公司分配到不同的分位数组别中去。bys year: astile size = MarkCap, qc(exchange =="NYSE") nq(10)
此时,我们可以根据变量分组进行一些结果展示。
tab size tab size if exchange =="NYSE"
4. 示例代码汇总
. clear . set obs 500 . gen company=_n . expand 100 . bys company: gen year=_n+1950 . bys company: gen xc=mod(company, 3)+1 . gen exchange = cond(xc==1, "NYSE", cond(xc==2, "AMEX", "NASDAQ")) . gen MarkCap=uniform()*10000 . replace MarkCap = MarkCap+2000 if exchange =="NYSE" . astile size01 = MarkCap, nq(10) . bys year: astile size02 = MarkCap, nq(10) . astile size02_2 = MarkCap, nq(10) by(year) . bys year: astile size03 = MarkCap, nq(10) qc(exchange =="NYSE") . astile size03_2 = MarkCap, nq(10) qc(exchange =="NYSE") by(year) . tab2 size01 size02 size03 . tab size03 . tab size03 if exchange =="NYSE"