| 所在主题: | |
| 文件名: example.rar | |
| 资料下载链接地址: https://bbs.pinggu.org/a-1259625.html | |
本附件包括:
|
|
| 附件大小: | |
|
现有如下面板数据
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、本站为非盈利性质的学术交流网站,鼓励和保护原创作品,拒绝未经版权人许可的上传行为。本站如接到版权人发出的合格侵权通知,将积极的采取必要措施;同时,本站也将在技术手段和能力范围内,履行版权保护的注意义务。 (如有侵权,欢迎举报) |
|
京ICP备16021002号-2 京B2-20170662号
京公网安备 11010802022788号
论坛法律顾问:王进律师
知识产权保护声明
免责及隐私声明