Stata——回归后预测 group_id
Stata -- predict after regression by group_id
我必须通过 group_id 运行 回归,然后生成预测。 predict 似乎不允许 "by" 选项。在 运行 回归 group_id 之后,有没有一种方法可以预测?数据按group_id堆叠。
我想使用的回归命令如下:
by group_id: reg y x
将不胜感激任何帮助。谢谢
你可以运行循环
levelsof group_id, local(levels)
foreach l of local levels {
reg y x if group_id == `l'
predict pred_`l'
}
经过进一步思考(并阅读了 Nick Cox 的一篇旧文章),我想到 statsby
可以用来避免循环并加快程序速度。这是他们速度的比较。
让我们先准备示例数据。
set more off
timer clear
webuse nlswork,clear
keep idcode ln_wage age
drop if missing(idcode, ln_wage, age) // drop all missing
drop if (idcode[_n]!=idcode[_n+1] & idcode[_n]!=idcode[_n-1]) // drop groups with one case
这是statsby
方法。 statsby
自动创建一个覆盖现有数据集的新数据集。因此,我继续执行以下步骤:
- 先保存原始数据(作为临时文件"master"),
- 运行
statsby
,
- 保存截距和斜率(作为临时文件 "using"),
- 加载原始数据,
- 合并两个数据,
- 计算预测值。
这是代码。
timer on 1
tempfile master using
save `master'
qui statsby _b[_cons] _b[age],by(idcode) :regress ln_wage age
save `using', replace
use `master'
qui merge m:1 idcode using `using'
gen yhat1=_stat_1+_stat_2*age
timer off 1
将此与 levelsof
/foreach
方法进行比较。
timer on 2
levelsof idcode, local(levels)
qui gen yhat2=.
foreach l of local levels {
qui reg ln_wage age if idcode==`l'
qui replace yhat2=_b[_cons]+_b[age]*age if idcode==`l'
}
timer off 2
第一种方法只需要第二种方法的一半时间。
. timer list
1: 22.11 / 1 = 22.1150
2: 56.44 / 1 = 56.4350
我必须通过 group_id 运行 回归,然后生成预测。 predict 似乎不允许 "by" 选项。在 运行 回归 group_id 之后,有没有一种方法可以预测?数据按group_id堆叠。
我想使用的回归命令如下:
by group_id: reg y x
将不胜感激任何帮助。谢谢
你可以运行循环
levelsof group_id, local(levels)
foreach l of local levels {
reg y x if group_id == `l'
predict pred_`l'
}
经过进一步思考(并阅读了 Nick Cox 的一篇旧文章),我想到 statsby
可以用来避免循环并加快程序速度。这是他们速度的比较。
让我们先准备示例数据。
set more off
timer clear
webuse nlswork,clear
keep idcode ln_wage age
drop if missing(idcode, ln_wage, age) // drop all missing
drop if (idcode[_n]!=idcode[_n+1] & idcode[_n]!=idcode[_n-1]) // drop groups with one case
这是statsby
方法。 statsby
自动创建一个覆盖现有数据集的新数据集。因此,我继续执行以下步骤:
- 先保存原始数据(作为临时文件"master"),
- 运行
statsby
, - 保存截距和斜率(作为临时文件 "using"),
- 加载原始数据,
- 合并两个数据,
- 计算预测值。
这是代码。
timer on 1
tempfile master using
save `master'
qui statsby _b[_cons] _b[age],by(idcode) :regress ln_wage age
save `using', replace
use `master'
qui merge m:1 idcode using `using'
gen yhat1=_stat_1+_stat_2*age
timer off 1
将此与 levelsof
/foreach
方法进行比较。
timer on 2
levelsof idcode, local(levels)
qui gen yhat2=.
foreach l of local levels {
qui reg ln_wage age if idcode==`l'
qui replace yhat2=_b[_cons]+_b[age]*age if idcode==`l'
}
timer off 2
第一种方法只需要第二种方法的一半时间。
. timer list
1: 22.11 / 1 = 22.1150
2: 56.44 / 1 = 56.4350