|
//
// 生成模拟数据
clear
set seed 123456
set obs 120
gen firm_id = _n
drop if uniform()<0.15 // 约15%的firm_id为空
gen a = uniform() - 0.5
gen b = uniform() + 0.5 // 可以和最终的beta作个比较
expand 60
sort firm_id
by firm_id: gen month = _n
by firm_id: gen index_ret = invnormal(uniform())
by firm_id: gen Rt = a + b*index_ret + invnormal(uniform())
save temp, replace
//
// 主程序
//
// 1楼,by wqdy, 确实有问题
use temp, clear
sort firm_id month
egen t = max(firm_id)
gen beta = .
local t1 = 1
while `t1' <= t {
reg Rt index_ret if firm_id == `t1'
replace beta = _b[index_ret] if firm_id == `t1'
local t1 = `t1'+1 // 进入第3次循环时提示“no observations r(2000);”,循环停止
}
//
// 2楼,by ctx5518, 可行
use temp, clear
sort firm_id month
egen t = max(firm_id)
gen beta = .
local t1 = 1
while `t1'<=t{
qui count if firm_id==`t1'
local obs=r(N)
if `obs'>0 {
qui reg Rt index_ret if firm_id==`t1'
qui replace beta=_b[index_ret] if firm_id==`t1'
local t1=`t1'+1
}
else {
local t1=`t1'+1
}
}
//
// 5楼,sungmoo对ctx5518作了改进
use temp, clear
sort firm_id month
qui su firm_id
local t = r(max)
gen beta = .
forv t1 = 1/`t' {
qui count if firm_id==`t1'
if r(N)>0 {
qui reg Rt index_ret if firm_id==`t1'
qui replace beta=_b[index_ret] if firm_id==`t1'
}
}
//
// 3楼,by sungmoo, 可行
use temp, clear
sort firm_id month
gen beta = .
qui levelsof firm_id
foreach t1 of numlist `r(levels)'{ // help limits发现numlist最多只支持1600个元素!
qui reg Rt index_ret if firm_id == `t1'
qui replace beta = _b[index_ret] if firm_id == `t1'
}
//
// 4楼,by arlionn, 可行
use temp, clear
gen beta = .
tsset firm_id month
egen id123 = group(firm_id)
tsset id123 month
local N=r(imax)
forvalues i = 1/`N'{
qui reg Rt index_ret if id123==`i'
qui replace beta=_b[index_ret] if id123==`i'
}
//
// 8楼,by 小概率事件, 可行
use temp, clear
sort firm_id month
statsby beta = _b[index_ret], by(firm_id): reg Rt index_ret
sort firm_id
save temp2, replace
use temp, clear
sort firm_id month
merge firm_id using temp2
drop _merge
//
// by voodoo, 也可行,但只是为了展示capture和_rc的应用
use temp, clear
sort firm_id month
qui su firm_id
gen beta = .
forval t1 = 1/`=r(max)' {
capture {
reg Rt index_ret if firm_id == `t1'
replace beta = _b[index_ret] if firm_id == `t1'
}
if _rc != 0 {
continue
}
}
//
// 总之,个人认为,若(空)firm_id比较多的话,3楼sungmoo用levelsof思路省去if ...的条件判断,值得借鉴,但foreach的效率比forval低,运行速度不如4楼arlionn。8楼小概率事件用statsby的思路好,效率也高,推荐使用!
//
|