有没有更有效的方法可以对不同的参考组运行三个 statsby 回归?



我想运行这三个回归。请注意,每个都有不同的引用组,这就是我单独运行它们的原因。

  1. statsby _b, by(grp_iden) saving(reg_aaa.dta, replace): reg prezzo ib43.city_str i.marca_str, baselevels

  2. statsby _b, by(grp_iden) saving(reg_bbb.dta, replace): reg prezzo ib6.city_str i.marca_str, baselevels

  3. 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集中的不同参考组(即ibXX.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 11aaa 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实际上必须解释循环机制,尽管这样做的成本应该是微不足道的。始终将阅读代码所花费的时间包括在考虑范围内。

最新更新