搜索
人大经济论坛 附件下载

附件下载

所在主题:
文件名:  example.rar
资料下载链接地址: https://bbs.pinggu.org/a-1259625.html
本附件包括:
  • example.dta
附件大小:
现有如下面板数据
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)





    熟悉论坛请点击新手指南
下载说明
1、论坛支持迅雷和网际快车等p2p多线程软件下载,请在上面选择下载通道单击右健下载即可。
2、论坛会定期自动批量更新下载地址,所以请不要浪费时间盗链论坛资源,盗链地址会很快失效。
3、本站为非盈利性质的学术交流网站,鼓励和保护原创作品,拒绝未经版权人许可的上传行为。本站如接到版权人发出的合格侵权通知,将积极的采取必要措施;同时,本站也将在技术手段和能力范围内,履行版权保护的注意义务。
(如有侵权,欢迎举报)
二维码

扫码加我 拉你入群

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

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

GMT+8, 2025-12-30 19:44