全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 Stata专版
7166 35
2013-05-01
悬赏 10000 个论坛币 已解决
有如下格式数据:
id           date                  B         E         MA       Var1         Var2        Var3     
AA   1980/01/02             1          .           .
B     1980/01/31             0          .           .
C     1982/02/16             .           .           1
D     1982/03/18             .           0           .
AA    1982/03/21            .           1           .
AA    1982/03/21            1          .            .
B      1982/03/22            
AA    1983/06/30            .           0            .
E      1985/11/22            0          .             .
AA    1985/12/31            0          .             .
G      1987/01/01            .           .             1
D      1991/02/27            .           1            .
.
AA    1999/03/16            .             .            1
.
Z     2010/12/31             0           .             .


想在Var1列生成本行对应id过去5年在B=1的情况下重复出现的次数(不计当次),在Var2列生成本行对应id过去5年在E=1的情况下重复出现的次数(不计当次),在Var3列生成本行对应id过去5年在MA=1的情况下重复出现的次数(不计当次)。举例来说,对应AA 1985/12/31行,Var1应显示1,Var2应显示1,Var3应显示0

我根据以前dxystata在类似问题中的程序,改写程序如下:
gen Var1=.
local N = _N
forvalues i = 1/`N' {
count if B==1&id==id[`i'] & (date[`i']-date)/365.2<=5 & (date[`i']-date)/365.2>0
replace var1=r(N) in `i'
}
但是这个程序运算速度比较慢,遇到观察值为几十万的情况,几个小时也出不了结果。

哪位高人有比较好的解决办法啊?非常感谢!!!

根据jonathanjp引用Nick Cox的建议,我编写如下代码,优点是不需要任何循环,因此速度快,缺点是如果数据量比较大,例如我提供的样本,会占用大量内存,甚至超过32G。
bys id Date: egen total_B=total(B)
bys id Date: egen total_E=total(E)
bys id Date: egen total_MA=total(MA)
duplicates drop id Date, force
egen ID=group(id)
xtset ID Date
tsfill
bys ID (Date): gen sum_B=sum(total_B)
bys ID (Date): gen freq_B=l.sum_B-l1827.sum_B
bys ID (Date): gen sum_E=sum(total_E)
bys ID (Date): gen freq_E=l.sum_E-l1827.sum_E
bys ID (Date): gen sum_MA=sum(total_MA)
bys ID (Date): gen freq_MA=l.sum_MA-l1827.sum_MA
drop if missing(id)

根据jonathanjp引用Michael Barker的程序,我进行了试验,运行速度也不快,而且结果有问题,但是思路有帮助。我一开始写的那个程序把每一个obs和其他所有obs进行比较,比较是否id一致及是否在5年之内,这样在样本大的情况下,运行速度自然很慢。现在有没有可能在一开始按时间sort数据的情况下,循环程序截止在5年的时间范围内?

目前为止,不管使用循环还是不使用循环,如果想解决速度问题,voodoo提出的“分而治之”的思路是最佳方案。

我把voodoo的“分而治之”的方法评为最佳答案,这个方法唯一的缺点是需要写的程序较为复杂,但是这种“分而治之”的思路是很好用的,而且程序运行速度比较快,不过多耗费系统资源。我写的上面这个不需要循环的程序运行速度最快而且代码比较简洁,但是必须保证内存足够大(建议16G或以上)。





最佳答案

voodoo 查看完整内容

在楼上程序的基础上加入“分而治之”的做法,将总样本划分为若干个小样本,在我的电脑上程序运行时间缩减至楼上程序的10%!只需303秒即解决问题!!
二维码

扫码加我 拉你入群

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

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

全部回复
2013-5-1 02:05:07
在楼上程序的基础上加入“分而治之”的做法,将总样本划分为若干个小样本,在我的电脑上程序运行时间缩减至楼上程序的10%!只需303秒即解决问题!
复制代码
二维码

扫码加我 拉你入群

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

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

2013-5-1 02:07:40
这是上面问题的示例文件。
附件列表

sample.rar

大小:1.66 MB

 马上下载

示例文件

本附件包括:

  • sample.dta

二维码

扫码加我 拉你入群

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

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

2013-5-1 11:57:38
用 12-Core Stata/MP
二维码

扫码加我 拉你入群

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

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

2013-5-1 13:35:51
你的数据里有很多重复的观测,删掉后能好一些。
二维码

扫码加我 拉你入群

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

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

2013-5-1 16:00:32
答案和问题是相关的。请你再澄清一下关于你样本的性质:
1. 为什么存在很多完全相同的duplicate obs?
2. id很多,且每个id的样本数多少也差很多呢?
3. 你所附的sample是你所拥有的全部样本,还是它仅是你所有样本的一个样本而已?
总之,请问这是关于什么研究的样本?
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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