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

  • 但是,在运行每种方法之前,我采用以下方法:

    在运行回归(1)之前,我使用:
    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的数据是不同的。