Loops Stata:在单个变量中按组保存回归的残差

Loops Stata:在单个变量中按组保存回归的残差,loops,stata,Loops,Stata,在Stata中,我希望按组运行多元回归,并将相应的残差保存在单个变量中。这是我正在尝试做的一个工作示例: sysuse auto, clear forvalues i=0/1 { regress price mpg if foreign==`i' predict r_`i' if foreign==`i', resid } egen residuals=rowtotal(r_0-r_1) , missing drop r_0-r_1 虽然上面的循环工作得很好,但我想一定有更优雅的方法来实现

在Stata中,我希望按组运行多元回归,并将相应的残差保存在单个变量中。这是我正在尝试做的一个工作示例:

sysuse auto, clear

forvalues i=0/1 {
regress price mpg if foreign==`i'
predict r_`i' if foreign==`i', resid
}

egen residuals=rowtotal(r_0-r_1) , missing
drop r_0-r_1

虽然上面的循环工作得很好,但我想一定有更优雅的方法来实现这一点

您应该尝试
statsby

use http://www.stata-press.com/data/r13/auto2 
statsby _b, by(foreign) verbose nodots: regress price weight length mpg

另一种方法是使用
tempname
在循环中创建局部变量。然后,我们更新
res
(残差)变量。循环完成后,
tempname
将自动删除。这是我的密码:

sysuse auto, clear
* @Pilik's code:

forvalues i=0/1 {
    regress price mpg if foreign==`i'
    predict r_`i' if foreign==`i', resid
}
egen res = rowtotal(r_0-r_1) , missing
drop r_0-r_1

* My code: use `tempname`
gen res1 = .
forvalues i=0/1 {
    regress price mpg if foreign==`i'
    tempname r
    predict `r' if foreign==`i', resid
    replace res1 = `r' if foreign==`i'
}
* Compare two ways: same results
su res res1

SSC提供的
rangestat
允许:

sysuse auto, clear
rangestat (reg) price mpg, int(foreign 0 0) 
gen residual = price - b_cons - b_mpg * mpg 

该方法扩展到移动窗口以及不相交的组

“必须”在这里是一个强有力的词。你当然可以编程,但我不认为有一个现有的专用命令。从斯塔塔的观点来看,你是在结合几个回归的结果。它提供了
statsby
作为一个更通用的工具,但是
statsby
关注的是标量,而不是变量。不幸的是
statsby
无法帮助保存残差,正如已经指出的那样。并非如此;完成
statsby
后,只能访问上一次回归运行的残差。我的意思是,您可以使用您的参数估计值来计算残差。手动计算方法当然是可能的,尽管如果您有许多预测值,通常会很笨拙且容易出错。我认为您应该在扩展的答案中详细说明如何执行此操作的代码,因为这是问题的核心。隐含的策略要求在手动计算残差之前,将
statsby
结果与原始数据集进行
合并。因此,您将创建尽可能多的临时变量。它们将在您的程序或会话结束时消失,但它们仍然存在。