部分程序段:
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 //* 遇见空ID号会停止,怎么处理?*//
}
while `t1'<=t{
count if firm_id==`t1'
local obs=r(N)
if `obs'>0 {
reg Rt index_ret if firm_id==`t1'
replace beta=_b[index_ret] if firm_id==`t1'
local t1=`t1'+1
}
else {
local t1=`t1'+1
}
}
试试这个:
tsset firm_id year
egen id123 = group(frim_id)
然后,用 id123 执行循环操作:
tsset id123 year
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'
}
//
// 生成模拟数据
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
}
}