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

时间:2019-05-29 04:51:27

标签: stata stata-macros

我想运行这三个回归。请注意,每个都有一个不同的参考组,这就是为什么我分别运行它们的原因。

  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回归,也许不需要在每次回归之前从样本中删除观察值?

类似以下的方法可行,但是我需要找到一种方法来选择每个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

1 个答案:

答案 0 :(得分:2)

您可以在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必须解释循环机械,尽管这样做的成本应该微不足道。请始终将花在阅读代码上的时间包括在内。