我想运行这三个回归。请注意,每个都有不同的引用组,这就是我单独运行它们的原因。
-
statsby _b, by(grp_iden) saving(reg_aaa.dta, replace): reg prezzo ib43.city_str i.marca_str, baselevels
-
statsby _b, by(grp_iden) saving(reg_bbb.dta, replace): reg prezzo ib6.city_str i.marca_str, baselevels
-
statsby _b, by(grp_iden) saving(reg_ccc.dta, replace): reg prezzo ib11.city_str i.marca_str, baselevels
但是,在运行每个之前,我采用以下方法:
在运行回归 (1) 之前,我使用:keep if rcode=="aaa"
在运行回归 (2) 之前,我使用:keep if rcode=="bbb"
在运行回归 (3) 之前,我使用:keep if rcode=="ccc"
有没有办法更有效地运行三个statsby
回归,也许不需要在每次回归之前从样本中删除观测值?
像下面这样的东西可以工作,但我需要找到一种方法来选择每个rcode
集中的不同参考组(即ib
XX.city_str
中的不同 XX
statsby _b, by(rcode grp_iden) saving(reg_ccc.dta, replace): reg prezzo ib11.city_str i.marca_str, baselevels
您可以在43 6 11
和aaa bbb ccc
上使用循环:
tokenize "aaa bbb ccc"
local x = 1
foreach g in 43 6 11 {
statsby _b, by(grp_iden) saving(reg_``x''.dta, replace): reg prezzo ib`g'.city_str i.marca_str if rcode == "``x''", baselevels
local ++x
}
我对这种编码的感觉非常复杂。当然,你利用通用结构来缩短代码。 如果真正的问题包括 10 个案例,那将清理大量代码。如果真正的问题非常相似,你可能会失去很多清晰度,以后会为自己、团队中的人员以及试图理解你的代码的其他人失去很多清晰度。一个尖锐的测试是,如果您自己没有看到如何执行此操作,它可能比您想要使用的更棘手。但同样真实的是,我们只有通过了解如何使用语言功能才能成长,然后成为我们基本工具包的一部分。
效率听起来总是比缺乏效率好,但让代码更聪明但不那么清晰通常不是一个好主意。循环获得的时间收益是可疑的:Stata实际上必须解释循环机制,尽管这样做的成本应该是微不足道的。始终将阅读代码所花费的时间包括在考虑范围内。