楼主: vincent829
10407 54

[其他] 如何定位是在哪个group [推广有奖]

41
sungmoo 发表于 2009-7-7 14:56:47
vincent829 发表于 2009-7-7 11:31 我用了比较低级的命令解决分组的问题。
*两组任务合并一处(sheet1的mv的缺失值被替换后,再按sheet2替换相应的group缺失值,如果某一mv值对应多个group值,只取最小的group值):

tempfile d
use sheet2,clear
keep year mv group
g g=1
save `d'

*去掉无available值替代的缺失值
use sheet1,clear
sort id year month
by id: g s=sum(mv)
by id: egen n=sum(mv)
drop if s==n&mv==.
drop s n
*替换有available值替代的缺失值
sort id year month
loc n=_N
forv i=1/`n'{
egen n=count(mv)
if n==_N {
continue,break
}
by id: replace mv=mv[_n+1] if mv==.&mv[_n+1]<.
drop n
}
drop n

*按sheet2替换group的缺失值
g g=1 if group==.
append using `d'
sort g year mv id month group
by g year: g x=(group[_n]+1==group[_n+1]&group<.) if g==1
by g year: g y=sum(x)-x+1 if g==1
replace group=y if g==1&group==.
drop if id==.
drop x y g
sort id year month

42
vincent829 发表于 2009-7-7 16:13:12
41# sungmoo
谢谢谢谢,这个第二部分的问题总算尘埃落定

43
voodoo 发表于 2009-7-8 16:50:22
sungmoo 发表于 2009-7-7 14:56
vincent829 发表于 2009-7-7 11:31 我用了比较低级的命令解决分组的问题。
*去掉无available值替代的缺失值
use sheet1,clear
sort id year month
by id: g s=sum(mv)
by id: egen n=sum(mv)
drop if s==n&mv==.
drop s n
*替换有available值替代的缺失值
sort id year month
loc n=_N
forv i=1/`n'{
    egen n=count(mv)
    if n==_N {
        continue,break
    }
    by id: replace mv=mv[_n+1] if mv==.&mv[_n+1]
    drop n
}
drop n
想到一个全新的(可能)更简单的方法(受sungmoo曾发表的计算累积回报率程序http://www.pinggu.org/bbs/thread-451864-1-1.html的启发):
use sheet1, clear
replace mv = . if id == 6855 & year == 1986
    // 模拟无available值替代的缺失值

gsort id -year -month    // 将每一id的mv按year month反向排序,最近的数据在最前
by id: replace mv = mv[_n-1] if missing(mv)    // 将每一id的mv依次替换为最近期的可得数据,如将mv[50](缺失值)替换为mv[49](非缺失值),然后将mv[51]替换为mv[50](在前一步刚巧替换为非缺失值,= mv[49])...
sort id year month    // 回复原来排序

drop if miss(mv)

运行速度飞快!
巫毒上传,必属佳品!
坛友下载,三思后行!

44
sungmoo 发表于 2009-7-8 18:39:52
voodoo 发表于 2009-7-8 16:50 想到一个全新的(可能)更简单的方法
新方法更简单。

两种方法的区别在于:如果某公司的mv的末端值是0,而其前的mv是缺失值,在原方法中,这样的缺失值被删除,不被换为0;在新方法中,这样的缺失值被换为0。

本数据库有个特点:若mv的缺失值替换为0,则0是末端值。

45
vincent829 发表于 2009-7-9 10:41:10
sungmoo 发表于 2009-7-8 18:39
voodoo 发表于 2009-7-8 16:50 想到一个全新的(可能)更简单的方法
新方法更简单。

两种方法的区别在于:如果某公司的mv的末端值是0,而其前的mv是缺失值,在原方法中,这样的缺失值被删除,不被换为0;在新方法中,这样的缺失值被换为0。

本数据库有个特点:若mv的缺失值替换为0,则0是末端值。
末端的缺失值替换为0会有一个潜在问题,会错误的编入组里面,因为bechmark里面有MV为0的数据,被编入第1组。除非在把替换的缺失值重新编组之前,把MV为0的sample 观测值都删除

46
sungmoo 发表于 2009-7-9 10:54:10
vincent829 发表于 2009-7-9 10:41 末端的缺失值替换为0会有一个潜在问题,会错误的编入组里面,因为bechmark里面有MV为0的数据,被编入第1组。除非在把替换的缺失值重新编组之前,把MV为0的sample 观测值都删除
仅就给出的全样本数据库,原方法不会把mv的缺失值替换为0,而会把可能替换为0的缺失值删除(但会保留mv=0的非缺失值)。

47
guolaiguoqu 发表于 2009-7-13 02:40:20
#sungmoo


我觉得同一年,同样的MV分在不同的组,说明分组是存在问题的。

48
sungmoo 发表于 2009-7-13 06:22:46
guolaiguoqu 发表于 2009-7-13 02:40 我觉得同一年,同样的MV分在不同的组,说明分组是存在问题的。
楼主想做十等分组。但其中mv取值“打结”(ties)情况很多,有些ties的观测值数超过了十分之一。

49
voodoo 发表于 2009-7-13 11:40:12
guolaiguoqu 发表于 2009-7-13 02:40
#sungmoo


我觉得同一年,同样的MV分在不同的组,说明分组是存在问题的。
金融学研究中经常会涉及到10等分或5等分作为比较组(comparable groups),这是传统的主流做法。关键问题是本例中mv的数据太粗糙,进而导致出现ties的样本太多了!
巫毒上传,必属佳品!
坛友下载,三思后行!

50
guolaiguoqu 发表于 2009-7-13 14:27:36
[quote]sungmoo 发表于 2009-7-7 14:56
*去掉无available值替代的缺失值
use sheet1,clear
sort id year month
by id: g s=sum(mv)
by id: egen n=sum(mv)
drop if s==n&mv==.
drop s n[quote]

这个似乎就是排序后把最后一个是缺失值的样本删除吧?
use sheet1,clear
sort id year month
by id :drop if mv==. & _n==_N

附带问一下,if x<.是不是等价于if x!=.,我看前面类似的命令很多。

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

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