Stata 有没有更有效的方法对不同的参照组进行三次statsby回归?
我想运行这三个回归。请注意,每个都有一个不同的参考组,这就是我分别运行它们的原因Stata 有没有更有效的方法对不同的参照组进行三次statsby回归?,stata,stata-macros,Stata,Stata Macros,我想运行这三个回归。请注意,每个都有一个不同的参考组,这就是我分别运行它们的原因 statsby,by(grp_iden)saving(reg_aaa.dta,replace):reg prezzo ib43.city_str i.marca_str,baselevels statsby,by(grp_iden)saving(reg_bbb.dta,replace):reg prezzo ib6.city_str i.marca_str,baselevels statsby,by(grp_ide
statsby,by(grp_iden)saving(reg_aaa.dta,replace):reg prezzo ib43.city_str i.marca_str,baselevels
statsby,by(grp_iden)saving(reg_bbb.dta,replace):reg prezzo ib6.city_str i.marca_str,baselevels
statsby,by(grp_iden)saving(reg_ccc.dta,replace):reg prezzo ib11.city_str i.marca_str,baselevels
keep if rcode==“aaa”
在运行回归(2)之前,我使用:keep if rcode==“bbb”
在运行回归(3)之前,我使用:keep if rcode==“ccc”
是否有一种方法可以更有效地运行三个statsby
回归,并且可能不需要在每次回归之前从样本中删除观测值
类似于以下的方法可能有效,但我需要找到一种方法,在每个rcode
集合中选择不同的参考组(即ib
XX.city\u str
):
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个案例,那么代码就会变得非常干净。如果真正的问题非常相似,那么对于您自己、您团队中的人员以及其他试图理解您的代码的人来说,您可能会失去很多清晰度。一个尖锐的测试是,如果你自己不知道如何做到这一点,它可能比你想要使用的更棘手。但是,我们只有通过了解如何使用语言特性才能成长,这些特性随后成为我们基本工具包的一部分
效率听起来总是比它的不足要好,但让代码更聪明但不那么清晰通常不是一个好主意。从循环中获得的时间收益是可疑的:事实上,斯塔塔必须解释循环机制,尽管这样做的成本应该微不足道。始终将阅读代码所花费的时间纳入考虑范围 在代码长度、机器时间、程序员时间方面是否高效?有一件事你可以比较,我们不能比较,那就是在
statsby
中使用if
限定符比你的解决方案快还是慢。在43 6 11
上循环会使代码更短。这就是你最想要的吗?就代码长度而言。不幸的是,我不能使用“if”,因为这样做需要在每个回归中指定相同的“基本组”。我的答案给出了不同if
条件的代码。这是完全合法的。如果这不是你想要的,那么你的问题对我来说毫无意义。调用statsby
之前的keep
命令应具有与指定要在前缀为statsby
的命令上使用的观察值相同的效果。我对您的评论进行了处理,好像它独立于您提供的答案及其包含的代码。这非常有用。我也同意你的所有观点。一个问题,“local++x”行是做什么的?它将一个局部变量增加1。请参阅帮助宏,并遵循链接。还可以尝试local i=1
,后跟local++i
,然后查看宏的值。运行代码时出现错误。如果rcode==“`x”,标记化“aaa bbb ccc”
或本地x=1,则它似乎与相关。问题中的错误在计算第一组结果后给出:regresse prezzo ib43.city_str i.marca_str if rcode==aaa”“无效名称
只需在if
语句和saving()中使用引号
选项。顺便说一句,你忘了对答案进行反投票,你发现这个答案非常有用。代码在我的电脑上可以很好地处理玩具数据。很明显,OP的数据是不同的。