楼主: seanj_cn
6355 13

[编程问题求助] 关于分年排序分组的小程序请教,谢谢! [推广有奖]

  • 2关注
  • 1粉丝

大专生

96%

还不是VIP/贵宾

-

威望
0
论坛币
914 个
通用积分
0.0002
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
353 点
帖子
36
精华
0
在线时间
92 小时
注册时间
2010-2-17
最后登录
2019-8-22

楼主
seanj_cn 发表于 2015-4-7 22:09:28 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
我的是2001-2012的IPO面板数据,需要按发行市值排序将股票平均分为0,1,2三组,如果是这样,应该用egen aa=cut(size), group(3)即可;但由于年度跨度较大,不同年份IPO的股票市值不具可比性,我希望能按股票在其发行年份的发行市值排序并分组,即发行市值在该年(其所在IPO年份)所有新股中排前1/3的股票分在0组,后1/3的股票分在2组,其余在1组,于是写了如下简单程序:

gen size_group=1
forvalues ipoyear=2001/2012{
egen pct1=pctile(iposize),p(66.7)
egen pct3=pctile(iposize),p(33.3)
replace size_group=0if iposize>pct1
replace size_group=1 if iposize<pct3
drop pct1
drop pct3
}

结果在第一次循环中,程序就把所有年份股票都一次性分好组了,之后的循环貌似都没作用,(如下),初学stata,不知道这是为什么,可以请高手帮解答下吗?谢了!
(2129 real changes made)
(2509 real changes made)
(0 real changes made)
(0 real changes made)
(0 real changes made)
...
...

二维码

扫码加我 拉你入群

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

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

关键词:小程序 forvalues forvalue replace values replace 程序

本帖被以下文库推荐

沙发
SpencerMeng 在职认证  发表于 2015-4-8 08:50:21
楼主,您好。

我觉得可以不用循环语句呢

“发行市值在概念所有股票中排前1/3的股票分在0组,”概念所有  是什么意思?

您提供样本dta吧,不要太多观测值,能体现你数据特征就行,尽量简洁。
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
seanj_cn + 1 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

藤椅
seanj_cn 发表于 2015-4-8 10:25:39
SpencerMeng 发表于 2015-4-8 08:50
楼主,您好。

我觉得可以不用循环语句呢
谢谢版主的回复!
不好意思,打错字了,“概念”应是“该年”。数据结构与所希望得到的分组示意如下:
stock        ipoyear        iposize   group  
6001        2001                 100              0
6002        2001                 200              1
6003        2001                 300              2
6004        2010                 400              1
6005        2010                 300              0
6006        2010                 500              2
昨天受您另一个回帖里的命令启发,我模仿着写了一个简单的命令bys ipoyear: egen group=cut(size), group(3),担报错egen ... cut() may not be combined with by。多谢了!

板凳
SpencerMeng 在职认证  发表于 2015-4-8 11:47:10
seanj_cn 发表于 2015-4-8 10:25
谢谢版主的回复!
不好意思,打错字了,“概念”应是“该年”。数据结构与所希望得到的分组示意如下:
...
与楼主共同学习。

我有个疑问,比如2001年10只股票中有一半都是相同的iposize,用cut就不能分组了,cut是平均分组。

分组时还涉及到某一年10只iposize怎么分三组呢?

是不是先针对每年的iposize进行求1/3处和2/3处的分位数值,然后在用命令将小于1/3的iposize 编码为0,中间的为1,大于2/3的编码为2。

不知楼主怎么看?
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
seanj_cn + 1 + 1 + 1 观点有启发

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

报纸
seanj_cn 发表于 2015-4-8 16:35:28
SpencerMeng 发表于 2015-4-8 11:47
与楼主共同学习。

我有的疑问,比如2001年10只股票中有一半都是相同的iposize,用cut就不能分组了,cu ...
我之前就是用“求分位数后再编组”的思路写了个简单的程序(见楼顶),但是会出现上面描述的问题,可以请版主帮我看看可以怎么改正吗?谢谢版主!

地板
SpencerMeng 在职认证  发表于 2015-4-8 18:34:03
seanj_cn 发表于 2015-4-8 16:35
我之前就是用“求分位数后再编组”的思路写了个简单的程序(见楼顶),但是会出现上面描述的问题,可以请版 ...
你看看下面的代码如何:
  1. clear
  2. inp  stock   ipoyear   iposize   
  3. 1 2000 12
  4. 1 2001 13
  5. 1 2002 15
  6. 1 2003 30
  7. 2 2000 24
  8. 2 2001 42
  9. 2 2002 43
  10. 2 2003 55
  11. 3 2000 42
  12. 3 2001 13
  13. 3 2002 42
  14. 3 2003 54
  15. 4 2000 45
  16. 4 2001 35
  17. 4 2002 46
  18. 4 2003 44

  19. end

  20. gen size_group=1
  21. forvalues ipoyear=2000/2003{
  22. egen pct1=pctile(iposize),p(66.7)
  23. egen pct3=pctile(iposize),p(33.3)
  24. replace size_group=2 if iposize>pct1
  25. replace size_group=0 if iposize<pct3
  26. drop pct1
  27. drop pct3
  28. }      
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
seanj_cn + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

7
seanj_cn 发表于 2015-4-9 10:51:22
SpencerMeng 发表于 2015-4-8 18:34
你看看下面的代码如何:
我试了一下,好像还是第一次循环就把各年的样本一次性分组了呢,后面的循环都未产生作用。下面是运行结果:
(5 real changes made)
(5 real changes made)
(0 real changes made)
(0 real changes made)
(0 real changes made)
(0 real changes made)
(0 real changes made)
(0 real changes made)
分组结果:
stock        ipoyear        iposize        size_group
1        2000        12        0
1        2001        13        0
1        2002        15        0
1        2003        30        1
2        2000        24        0
2        2001        42        1
2        2002        43        1
2        2003        55        2
3        2000        42        1
3        2001        13        0
3        2002        42        1
3        2003        54        2
4        2000        45        2
4        2001        35        1
4        2002        46        2
4        2003        44        2
还是把所有年份的规模放到一起分的呢。

8
ywh19860616 发表于 2015-4-9 12:54:47
  1. clear
  2. inp  ipoyear   iposize   
  3. 1 2000 12
  4. 1 2001 13
  5. 1 2002 15
  6. 1 2003 30
  7. 2 2000 24
  8. 2 2001 42
  9. 2 2002 43
  10. 2 2003 55
  11. 3 2000 42
  12. 3 2001 13
  13. 3 2002 42
  14. 3 2003 54
  15. 4 2000 45
  16. 4 2001 35
  17. 4 2002 46
  18. 4 2003 44
  19. end

  20. cumul iposize, g(g) eq

  21. levelsof ipoyear, local(year)
  22. local cut1 = 1/3
  23. local cut2 = 2/3
  24. foreach x of local year {
  25. recode g (min/`cut1'=0)(`cut1'/`cut2'=1)(`cut2'/max=2) if ipoyear==`x'
  26. }  
复制代码


试试结果?
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
seanj_cn + 1 + 1 + 1 精彩帖子
SpencerMeng + 20 + 2 + 2 + 2 大牛,你迟到了~~

总评分: 论坛币 + 20  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

9
SpencerMeng 在职认证  发表于 2015-4-9 14:44:29
ywh19860616 发表于 2015-4-9 12:54
试试结果?
您在input的时候少了stock这个变量名。

加上去之后,跑出的结果并不是想要的结果了。
  1. stock        ipoyear        iposize        g
  2. 1        2000        12        0
  3. 1        2001        13        0
  4. 1        2002        15        0
  5. 1        2003        30        1
  6. 2        2000        24        0
  7. 2        2001        42        1
  8. 2        2002        43        2
  9. 2        2003        55        2
  10. 3        2000        42        1
  11. 3        2001        13        0
  12. 3        2002        42        1
  13. 3        2003        54        2
  14. 4        2000        45        2
  15. 4        2001        35        1
  16. 4        2002        46        2
  17. 4        2003        44        2
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
seanj_cn + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

10
ywh19860616 发表于 2015-4-9 14:51:00
SpencerMeng 发表于 2015-4-9 14:44
您在input的时候少了stock这个变量名。

加上去之后,跑出的结果并不是想要的结果了。
  1. clear
  2. input stock  ipoyear   iposize   
  3. 1 2000 12
  4. 1 2001 13
  5. 1 2002 15
  6. 1 2003 30
  7. 2 2000 24
  8. 2 2001 42
  9. 2 2002 43
  10. 2 2003 55
  11. 3 2000 42
  12. 3 2001 13
  13. 3 2002 42
  14. 3 2003 54
  15. 4 2000 45
  16. 4 2001 35
  17. 4 2002 46
  18. 4 2003 44
  19. end

  20. bys stock:cumul iposize, g(g) eq

  21. levelsof stock, local(id)
  22. display "`r(levels)'"

  23. local cut1 = 1/3
  24. local cut2 = 2/3
  25. foreach x of local id {
  26. recode g (min/`cut1'=0)(`cut1'/`cut2'=1)(`cut2'/max=2) if stock==`x'
  27. }  
复制代码
抱歉,刚写错了,试试这个。此外,没有很明白楼主是想按year还是按stock进行排序,不过修改下即可。
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
seanj_cn + 1 + 1 + 1 十分感谢!!

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-8 23:15