我想运行这三个回归。请注意,每个都有一个不同的参考组,这就是为什么我分别运行它们的原因。
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
回归,也许不需要在每次回归之前从样本中删除观察值?
类似以下的方法可行,但是我需要找到一种方法来选择每个ib
组中的不同参考组(即.city_str
XX rcode
中的不同XX):
statsby _b, by(rcode grp_iden) saving(reg_ccc.dta, replace): reg prezzo ib11.city_str i.marca_str, baselevels
答案 0 :(得分:2)
您可以在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必须解释循环机械,尽管这样做的成本应该微不足道。请始终将花在阅读代码上的时间包括在内。