楼主: wqdy
7297 14

[数据管理求助] Stata编程,跳过空的ID号 [推广有奖]

  • 0关注
  • 0粉丝

硕士生

40%

还不是VIP/贵宾

-

威望
0
论坛币
24382 个
通用积分
0.0500
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
10349 点
帖子
79
精华
0
在线时间
178 小时
注册时间
2004-12-31
最后登录
2023-8-18

楼主
wqdy 发表于 2010-2-5 12:22:48 |AI写论文
100论坛币
现有100家公司。ID号从1-120,就是中间有些ID号是没有的。 在编程循环里面,有些ID号在经过i+1步骤后发现找不到ID号了,STATA自己停止运算。有什么办法跳过这些空ID号,让程序继续运行嘛? 哪位大牛来指导下吧?

部分程序段:
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号会停止,怎么处理?*//
}

最佳答案

ctx5518 查看完整内容

while `t1'0 { reg Rt index_ret if firm_id==`t1' replace beta=_b if firm_id==`t1' local t1=`t1'+1 } else { local t1=`t1'+1 } }
关键词:stata编程 Stata tata month Local local 程序

沙发
ctx5518 发表于 2010-2-5 12:22:49
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
        }
}
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
wqdy + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

藤椅
sungmoo 发表于 2010-2-5 15:23:11
*对id的观测值非缺失的观测值组操作
levelsof id
foreach i of num `r(levels)'{
  reg …… if id==`i'
  replace ……… if id==`i'
}
已有 1 人评分学术水平 收起 理由
dxystata + 1 好的意见建议

总评分: 学术水平 + 1   查看全部评分

板凳
arlionn 在职认证  发表于 2010-2-5 17:07:22
试试这个:
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'
}
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
wqdy + 1 + 1 + 1 好的意见建议

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

报纸
sungmoo 发表于 2010-2-5 18:22:27
wqdy 发表于 2010-2-5 12:22 现有100家公司。ID号从1-120,就是中间有些ID号是没有的。 在编程循环里面,有些ID号在经过i+1步骤后发现找不到ID号了,STATA自己停止运算。有什么办法跳过这些空ID号,让程序继续运行嘛? 哪位大牛来指导下吧?
*只对id的观测值在1-120中的观测值组操作

forv i=1/120{
  count if id==`i'
  if r(N)>0{
    reg …… if id==`i'
    replace …… if id==`i'
  }
}

地板
wqdy 发表于 2010-2-5 20:52:23
天啊。一个帖子带来如此多的大牛,小女子太感谢了。怎么发钱?

7
arlionn 在职认证  发表于 2010-2-6 08:33:53
钱就不必了,大家可能只是对这个问题感兴趣,呵呵。

8
小概率事件 发表于 2010-2-7 21:51:52
statsby beta = _b[index_reg], by(firm_id): reg Rt index_ret
maybe of help if the data structure is what I'm thinking.

9
wqdy 发表于 2010-2-8 09:25:20
7# arlionn

感谢 ctx5518 ,arlionn , sungmoo两位版主!和小概率事件
大家新年愉快!

10
voodoo 发表于 2010-2-11 18:38:27
//
// 生成模拟数据
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的思路好,效率也高,推荐使用!
//
巫毒上传,必属佳品!
坛友下载,三思后行!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-19 21:07