全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 Stata专版
22614 41
2013-01-25
悬赏 1000 个论坛币 已解决
现有如下面板数据
ID     Year          Var1              Var2      Var3

A       2000        123897         1.2

A       2001        897650         3.5
A       2002        345687         2.2
...
A       2010        65789           3.3
B       2000        90876           2.5
...  
B       2010        54321           6.2
...
ZZ     2010        66880           9.9

现需要每年按照Var1数值大小排序分为10等分组,并在每十分之一组中按照Var2数值大小排列分为5等分组,需要在Var3中生成对应ID相应年份的组别。

其实有一个函数cut可以进行分组,egen size_decile=cut(Var1), group(10)
但是这个函数stata显示不能与by搭配使用,也就是说它不能按每一年分组



谢谢!!!

sungmoo已提供答案
但是取整函数int会造成第一分组观察值少一些,最后分组观察值多一些,受sungmoo的启发我改写程序如下:
gen MV_Deciles=1
forvalues i=1/10{
bys Year (MV): replace MV_Decile=`i' if 10*_n/_N<=`i'&10*_n/_N>`i'-1
}
gen MB_Quintiles=1
forvalues i=1/5{
bys Year MV_Deciles (MB): replace MB_Quintiles=`i' if 5*_n/_N<=`i'&5*_n/_N>`i'-1
}


sungmoo提供的改进答案:
bys Year (MV MB): g p=ceil(10*_n/_N)
bys Year p (MB MV): g q=ceil(5*_n/_N)
效果和我写的循环一样,执行效率却高很多。还是要熟悉各种函数啊。





liangsky提出如果样本中重复值较多,可能出现相同值分在不同组的情况,并提供如下代码。
gen n1=.
forv i=2000/2010 {
xtile n`i'=var1 if year==`i',n(10)
replace n1=n`i' if year==`i'
drop n`i'
}
gen n2=.
forv i=2000/2010 {
forv j=1/10 {
xtile n`i'`j'=var2 if year==`i' & n1==`j',n(5)
replace n2=n`i'`j' if year==`i' & n1==`j'
drop n`i'`j'
}
}
此方法分组准确稳妥,但是循环的执行效率不如直接使用函数快。


sungmoo提出cumul函数可以结合by使用解决以上所有问题,
最后我改写程序如下:bys year: cumul(MV), gen (cumMV) equal
gen MV_Deciles=ceil(10*cumMV)
bys year MV_Deciles: cumul(MB), gen (cumMB) equal
gen M2B_Quintiles=ceil(5*cumMB)



最佳答案

sungmoo 查看完整内容

*把缺失值去除,且年份仍然是最高分组 use example,clear drop if MV==.|MB==. bys Year (MV MB): g p=ceil(10*_n/_N) bys Year p (MB MV): g q=ceil(5*_n/_N)
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2013-1-25 12:08:26
*把缺失值去除,且年份仍然是最高分组
use example,clear
drop if MV==.|MB==.
bys Year (MV MB): g p=ceil(10*_n/_N)
bys Year p (MB MV): g q=ceil(5*_n/_N)
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-1-25 12:51:14
可否传部分数据上来?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-1-26 05:36:26
dxystata 发表于 2013-1-25 12:51
可否传部分数据上来?
这是一个示例文件,需要每年按照MV大小将ticker分为10组,在分好的每一组中,按照MB大小分为5组。
您看看有什么好方法么?
我目前有一个笨办法可以做,就是用cut函数,对每一年数据分组。
example.rar
大小:(2.07 MB)

 马上下载

本附件包括:

  • example.dta


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-1-26 07:49:40
当MV或MB有缺失值时,处理规则是什么?
把缺失值drop掉就可以
*drop的规则是?

drop if MV==.|MB==.
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-1-26 08:19:27
sungmoo 发表于 2013-1-26 07:49
当MV或MB有缺失值时,处理规则是什么?
把缺失值drop掉就可以
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群