全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 Stata专版
2009-7-6 20:39:07
vincent829 发表于 2009-7-6 20:05
sungmoo 发表于 2009-7-6 18:21
*这两个命令是有区别的
by id: g s=sum(mv)
by id: egen n=sum(mv)
我查了help,egen里面没有sum这个function,只有total吧?
Stata 9.0用egen sum;后改成egen total
viewsource _gsum.ado
二维码

扫码加我 拉你入群

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

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

2009-7-6 20:44:35
vincent829 发表于 2009-7-6 17:44
26# sungmoo

成功了,缺失值的替代终于可以完成,衷心谢谢sungmoo
一个基于sungmoo的简单又管用的“替换缺失值”的方法:

use sheet1,clear
*替换缺失值
sort id year month
forv i=1/12 { // 因为至多替换1年即12个月的缺失数据
      by id: replace mv = mv[_n+1] if mv == . & mv[_n+1] < .
}
drop id if mv == .
二维码

扫码加我 拉你入群

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

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

2009-7-6 21:08:03
32# voodoo

现在剩下分组的问题,如果知道了MV, 然后也知道benchmark的MV和分组情况,用什么命令可以定位这个MV在哪个group里呢?
二维码

扫码加我 拉你入群

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

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

2009-7-6 22:10:06
vincent829 发表于 2009-7-6 20:05 我查了help,egen里面没有sum这个function,只有total吧?
你可以试一下,看看你的stata版本可否运行egen x=sum()
二维码

扫码加我 拉你入群

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

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

2009-7-6 22:26:55
voodoo 发表于 2009-7-6 20:44 一个基于sungmoo的简单又管用的“替换缺失值”的方法:

use sheet1,clear
*替换缺失值
sort id year month
loc n=_N
forv i=1/12 { // 因为至多替换1年即12个月的缺失数据
      by id: replace mv = mv[_n+1] if mv == . & mv[_n+1] < .
}
drop id if mv == .
这个未必吧?

若某公司连续两年24月里mv都缺失,却有后续年的数据。你的命令是不能实现替换的。

当然,这要看楼主的要求了。
二维码

扫码加我 拉你入群

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

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

2009-7-6 22:28:21
vincent829 发表于 2009-7-6 21:08 现在剩下分组的问题,如果知道了MV, 然后也知道benchmark的MV和分组情况,用什么命令可以定位这个MV在哪个group里呢?
现在楼主需要说明:你的sheet2里共要涉及哪些年份。
二维码

扫码加我 拉你入群

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

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

2009-7-6 23:48:51
sungmoo 发表于 2009-7-6 22:10
vincent829 发表于 2009-7-6 20:05 我查了help,egen里面没有sum这个function,只有total吧?
你可以试一下,看看你的stata版本可否运行egen x=sum()
egen sum()在Stata 10.1 SE中仍然可用,但由于容易和求running sum的sum()函数产生混淆,所以更名为egen total(),在help egen和手册中也不再对egen sum()进行说明。
二维码

扫码加我 拉你入群

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

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

2009-7-7 09:30:31
36# sungmoo

涉及从1981到2007年,文件我发给你了
二维码

扫码加我 拉你入群

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

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

2009-7-7 11:31:50
我用了比较低级的命令解决分组的问题。
sort year mv id month group
by year (mv): replace gr=group[_n+1] if id!=.&gr==.
by year (mv): replace gr=gr[_n+1] if id!=.&gr==.
第3条命令要实行好多遍,直到没有变换值为止。怎么循环我还没想到。
二维码

扫码加我 拉你入群

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

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

2009-7-7 14:32:37
vincent829 发表于 2009-7-7 09:30 涉及从1981到2007年,文件我发给你了
(sheet1指sample,sheet2指benchmark)

有一个问题:

sheet2中,比如1981年,mv=1的公司的group号可能是1、2、3,对于这样的mv,要选择哪个group号?
二维码

扫码加我 拉你入群

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

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

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
二维码

扫码加我 拉你入群

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

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

2009-7-7 16:13:12
41# sungmoo
谢谢谢谢,这个第二部分的问题总算尘埃落定
二维码

扫码加我 拉你入群

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

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

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)

运行速度飞快!
二维码

扫码加我 拉你入群

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

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

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

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

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

扫码加我 拉你入群

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

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

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 观测值都删除
二维码

扫码加我 拉你入群

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

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

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的非缺失值)。
二维码

扫码加我 拉你入群

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

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

2009-7-13 02:40:20
#sungmoo


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

扫码加我 拉你入群

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

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

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

扫码加我 拉你入群

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

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

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


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

扫码加我 拉你入群

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

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

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!=.,我看前面类似的命令很多。
二维码

扫码加我 拉你入群

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

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

2009-7-13 15:26:35
guolaiguoqu 发表于 2009-7-13 14:27 这个似乎就是排序后把最后一个是缺失值的样本删除吧?
按楼主的要求,要去掉无available替代值的缺失值。

(若缺失值要被替换成0值,这样的缺失值也被认作“无available替代值”)
二维码

扫码加我 拉你入群

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

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

2009-7-13 15:27:38
guolaiguoqu 发表于 2009-7-13 14:27 附带问一下,if x<.是不是等价于if x!=.
stata中,缺失值相当于无穷大。
二维码

扫码加我 拉你入群

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

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

2009-7-13 15:38:31
[quote]sungmoo 发表于 2009-7-13 15:27



没搞懂。既然缺失值是无穷大,那么if x<.不是什么都没说明吗,除非x含有缺失值,
那其实就是等价于if x!=.吧?
此外,不见得缺失值都是无穷大吧?似乎有些命令是把缺失值视同0。我也忘记什么命令了,好像碰到过。
二维码

扫码加我 拉你入群

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

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

2009-7-13 15:50:16
guolaiguoqu 发表于 2009-7-13 15:38 没搞懂。既然缺失值是无穷大,那么if x<.不是什么都没说明吗,除非x含有缺失值,那其实就是等价于if x!=.吧?此外,不见得缺失值都是无穷大吧?似乎有些命令是把缺失值视同0。我也忘记什么命令了,好像碰到过。
x<.与x!=.是一回事,但少打一个字符(节约)。

有些命令在计算时要忽略缺失值(否则只要有缺失值,结果一定是缺失值);如果不忽略,当无穷大处理。
二维码

扫码加我 拉你入群

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

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

2009-9-17 18:54:00
有个新问题产生,假如前12个月内MV为缺失值,我想删除这个id,这个通过命令怎么实现呢?
二维码

扫码加我 拉你入群

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

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

栏目导航
热门文章
推荐文章

说点什么

分享

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