全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 Stata专版
3972 6
2011-01-08
请大侠们帮帮忙
四列数据:股票代码code,总市值tmv,换手率tn,月份month。

如何在每个月内按照总市值的P20, P50 百分位数分组?我知道单独每个月的命令可以这样做
_pctile tmv, p(20,50)
return list
gen g=(tmv<=r(r1)) if tmv<.
replace tmv=2 if tmv>r(r1) & tmv<=r(r2)
replace tmv=3 if tmv>r(r2) & tmv<.

但是关键是pctile的语句不能与  bys month  这样的分组命令连起来用,请问如何才能在样本期139个月的样本期中循环这个分组的命令呢?

多谢!
二维码

扫码加我 拉你入群

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

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

全部回复
2011-1-8 16:58:44
rucqqpp 发表于 2011-1-8 16:31 但是关键是pctile的语句不能与  bys month  这样的分组命令连起来用,请问如何才能在样本期139个月的样本期中循环这个分组的命令呢?
你的month的类型与格式是什么样的?
二维码

扫码加我 拉你入群

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

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

2011-1-8 21:42:03
就是
month
199801
199801
199803
......
200812
二维码

扫码加我 拉你入群

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

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

2011-1-9 08:12:51
rucqqpp 发表于 2011-1-8 21:42
就是
month
199801
199801
199803
......
200812
*如果month是数值型

levelsof month, l(m)
foreach i of num `m'{
*****   if month==`i'
}
二维码

扫码加我 拉你入群

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

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

2011-1-9 10:20:38
多谢版主的帮助!

请问我这样写对吗?
levelsof month, l(m)
foreach i of num `m'{
_pctile tmv, p(20,50)
return list
gen g=(tmv<=r(r1)) if tmv<.
replace tmv=2 if tmv>r(r1) & tmv<=r(r2)
replace tmv=3 if tmv>r(r2) & tmv<. if month=`i'
}

但是返回的结果说invalid syntax:

. foreach i of num `m'{
  2. _pctile tmv, p(20,50)
  3. return list
  4. gen g=(tmv<=r(r1)) if tmv<.
  5. replace tmv=2 if tmv>r(r1) & tmv<=r(r2)
  6. replace tmv=3 if tmv>r(r2) & tmv<. if month==`i'
  7. }

scalars:
                 r(r1) =  956154.375
                 r(r2) =  2015615.625
(55565 real changes made)
invalid syntax
r(198);

end of do-file


请问是不是我哪里弄错了?好像进行到第一个月就中断。。。。。。
二维码

扫码加我 拉你入群

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

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

2011-1-11 00:12:33
已经找到解决方法
sort month
gen group = 1
forval i = 10(10)90 {
by month: egen p`i' = pctile(lagtmv), p(`i')
replace group = (`i'/10 + 1) if lagtmv > p`i'
}

gen g=1 if group<=2
replace g=2 if group>3 & group<=5
replace g=3 if group>5
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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