楼主: vincent829
10956 28

[数据管理求助] cut()不能和by一起用,怎么办? [推广有奖]

  • 0关注
  • 0粉丝

硕士生

0%

还不是VIP/贵宾

-

威望
0
论坛币
515 个
通用积分
0.1673
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1736 点
帖子
99
精华
0
在线时间
108 小时
注册时间
2005-10-6
最后登录
2013-9-25

楼主
vincent829 发表于 2009-7-2 18:02:38 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
又是panel data,有id,year, mv(market value)三个变量,分别代表公司号,年份,市场价值
先gsort year -mv,然后对每一年应用egen c=cut(mv), group(10),也就是对每一年的市场价值分成10组,每组的公司数量相同
但是这个命令不能和by一起用,我就像到了用egen c=cut(mv) if year==#, group(10),对每一年都用一次上述命令
可是显示出错,所以想问问大家有解决方法吗?
二维码

扫码加我 拉你入群

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

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

关键词:cut 怎么办 panel data market Group cut

回帖推荐

sungmoo 发表于10楼  查看完整内容

*个人以为,如采用上述命令,也可使用(省去egen过程): sort year mv by year: g gr=_n/_N replace gr=int(gr*10)+1 recode gr (11=10)

voodoo 发表于9楼  查看完整内容

我指的是耗时(当然应该是可忽略的差异) viewsource cumul.ado 发现: by year: cumul mv, g(group) 就等于by year: gen group = _n/_N 当然cumul命令可增加很多options,功能更加强大。

voodoo 发表于7楼  查看完整内容

出错是由于当你egen循环第二次时,变量c已经存在。当然你可以规避这一问题: forv i = 1/# { egen c= cut(mv) if year == `i', group(10) replace gr = c if year == `i' drop c } 由于你要求每组公司的数量相同(当然当公司数不能被10整除时,允许组10公司数量不同,比如公司数为119时,组1-9每组11家公司,而组10将有20家公司),试试: sort year mv // “组1的mv最小,组10的mv最大”更直观;同时由 ...

sungmoo 发表于4楼  查看完整内容

*如果公司的次序不重要,可以去掉eq项。试一下下面: gsort year mv by year: cumul mv, g(group) eq replace group=int(group*10)+1 recode group (11=10)

sungmoo 发表于2楼  查看完整内容

*不知以下可否实现目标?(酌情可去掉eq选项) gsort year -mv by year: cumul mv, g(group) eq replace group=int(group*10)+1 recode group (11=10)

本帖被以下文库推荐

沙发
sungmoo 发表于 2009-7-2 21:10:30
*不知以下可否实现目标?(酌情可去掉eq选项)
gsort year -mv
by year: cumul mv, g(group) eq
replace group=int(group*10)+1
recode group (11=10)

藤椅
vincent829 发表于 2009-7-2 23:26:41
sungmoo 发表于 2009-7-2 21:10
*不知以下可否实现目标?(酌情可去掉eq选项)
gsort year -mv
by year: cumul mv, g(group) eq
replace group=int(group*10)+1
recode group (11=10)
谢谢版主,问题基本上能解决。
但衍生出一个问题,因为mv精度不大,比较粗糙,造成某个相同的值(比如说1百万MV的公司有很多家),在这些相同值的情况下,cumulative distribution是怎么确定的,因为不是按照从大到小的顺序排列,这就造成了一个潜在的问题。执行完倒数第二条命令(replace group=int(group*10)+1),有的组里面会出现其他的值,比如第9组会出现10这样的值,而且似乎是没有规律

板凳
sungmoo 发表于 2009-7-2 23:33:00
*如果公司的次序不重要,可以去掉eq项。试一下下面:

gsort year mv
by year: cumul mv, g(group) eq
replace group=int(group*10)+1
recode group (11=10)

报纸
sungmoo 发表于 2009-7-2 23:35:19
cumul x
即计算变量x的样本(累积)分布。
(有eq项,同样的取值累积概率相同;否则,同样的取值累积概率不同)

地板
vincent829 发表于 2009-7-3 09:26:10
sungmoo 发表于 2009-7-2 23:35
cumul x
即计算变量x的样本(累积)分布。
(有eq项,同样的取值累积概率相同;否则,同样的取值累积概率不同)
问题解决了,不用eq选项,虽然一个在mv相同的情况下会出现和那个组值不同的值,但是如果执行完命令,再输入gsort year -group,每个group的值数目还是一样的。谢谢版主的关心

7
voodoo 发表于 2009-7-5 11:35:15
vincent829 发表于 2009-7-2 18:02
又是panel data,有id,year, mv(market value)三个变量,分别代表公司号,年份,市场价值
先gsort year -mv,然后对每一年应用egen c=cut(mv), group(10),也就是对每一年的市场价值分成10组,每组的公司数量相同
但是这个命令不能和by一起用,我就像到了用egen c=cut(mv) if year==#, group(10),对每一年都用一次上述命令
可是显示出错,所以想问问大家有解决方法吗?
出错是由于当你egen循环第二次时,变量c已经存在。当然你可以规避这一问题:
forv i = 1/# {
    egen c= cut(mv) if year == `i', group(10)
    replace gr = c if year == `i'
    drop c
}

由于你要求每组公司的数量相同(当然当公司数不能被10整除时,允许组10公司数量不同,比如公司数为119时,组1-9每组11家公司,而组10将有20家公司),试试:
sort year mv   // “组1的mv最小,组10的mv最大”更直观;同时由于公司mv分布显著正偏,当公司数不能被10整除时,让第10组(规模最大组)有更多公司可能是更好的选择,所以有意不用sort year -mv
by year: gen g = _n/_N    // 此命令本意是用来规避 egen cut()不能byable的问题
egen gr = cut(g), group(10)   // 你要的egen cut()!
replace gr = gr + 1   // 由于egen cut() 由0开始编号
drop g

此方法应该会比sungmoo用cumul的方法效率高些。
巫毒上传,必属佳品!
坛友下载,三思后行!

8
sungmoo 发表于 2009-7-5 11:48:45
voodoo 发表于 2009-7-5 11:35
你指的效率是耗时,还是命令行数?

9
voodoo 发表于 2009-7-5 11:55:40
我指的是耗时(当然应该是可忽略的差异)
viewsource cumul.ado 发现:
by year: cumul mv, g(group) 就等于by year: gen group = _n/_N
当然cumul命令可增加很多options,功能更加强大。
巫毒上传,必属佳品!
坛友下载,三思后行!

10
sungmoo 发表于 2009-7-5 11:59:09
voodoo 发表于 2009-7-5 11:35
sort year mv
by year: gen g = _n/_N
egen gr = cut(g), group(10)
replace gr=gr+1
drop g
*个人以为,如采用上述命令,也可使用(省去egen过程):
sort year mv
by year: g gr=_n/_N
replace gr=int(gr*10)+1
recode gr (11=10)

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

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-13 04:32