!- // 以下程序尽管循环部分并未优化,但只需根据你的数据对数据进行清洁,并合并重复样本的信息,就可将程序运行时间缩短至原来的20%!这事实上也说明了在数据管理过程中理解数据的重要性。
- // 加入“分而治之”的做法,分30个子样本,程序运行时间进一步缩减至未采取此做法前的10%!
- set rmsg on
- set more off
- global NSMPL = 30 // 分而治之以加速循环计算效率,分NSMPL个子样本
- use sample.dta, clear
- count // 看看共有多少样本
- // #1
- // 根据你的说明,B E MA取值要么1,要么missing,不应为0啊?
- // 将0替换为.,然后删除三个变量均为.的样本
- // 竟然多达26万个,节约50%的时间
- foreach v in B E MA {
- replace `v' = . if `v' == 0
- }
- drop if missing(B) & missing(E) & missing(MA)
- save sample2, replace
- // #2
- // 循环计算
- /*
- // #2.0
- // 10000样本先试一下
- sort id date
- keep in 1/10000
- */
- // #2.1
- // 用`v't合并重复样本的信息,然后删除重复样本
- foreach v in B E MA {
- bysort id date: egen `v't = total(`v')
- drop `v'
- }
- duplicates drop id date, force
- // #2.2
- // 删除只有一个date的,肯定无需进入循环
- by id: gen N = _N
- drop if N == 1
- drop N
- count // 看看还剩下多少样本
- // #2.3
- // 按总样本id数划分为NSMPL个子样本
- sort id date
- by id: gen _tagid = (_n==1)
- gen id2 = sum(_tagid)
- su id2, meanonly
- local cid = ceil(r(max)/$NSMPL) // 每个子样本id数
- drop _tagid
- local j = 1
- forval i = 1/`=$NSMPL-1' { // 前NSMPL-1个子样本
- preserve
- keep if inrange(id2, `j', `j'+`cid'-1)
- drop id2
- local j = `j' + `cid'
- save _smpl`i', replace
- restore
- }
- keep if inrange(id2, `j', `j'+`cid'-1) // 最后一个子样本
- drop id2
- save _smpl$NSMPL, replace
- // #2.4
- // 三重循环计算目标变量
- forval i = 1/$NSMPL { // 子样本集循环
- use _smpl`i', clear
- foreach v in B E MA { // 变量循环
- gen Var_`v' = .
- qui forval j = 1/`=_N' { // 子样本内循环
- su `v't if id==id[`j'] & inrange((date[`j']-date), 1, 1826)
- replace Var_`v' = r(sum) in `j'
- }
- drop `v't
- }
- save _smpl`i'_, replace
- }
-
- // #2.5
- // 和原来的样本数据合并
- clear
- forval i = 1/$NSMPL {
- append using _smpl`i'_
- }
- save _SMPL_, replace
- use sample2, clear
- merge m:1 id date using _SMPL_, nogen
- save sample2, replace
- // #2.6
- // 收尾
- /*
- foreach v in B E MA {
- replace Var_`v' = 0 if missing(Var_`v')
- }
- */
- save sample2, replace
- forval i = 1/$NSMPL {
- erase _smpl`i'.dta
- erase _smpl`i'_.dta
- }
- erase _SMPL_.dta
- set rmsg off
- set more off


雷达卡



京公网安备 11010802022788号







