回归循环和存储系数
Regression loop and store coefficients
我打算 (1) 多次循环回归某个标准; (2) 存储每个回归的某个系数。这是一个例子:
clear
sysuse auto.dta
local x = 2000
while `x' < 5000 {
xi: regress price mpg length gear_ratio i.foreign if weight < `x'
est sto model_`x'
local x = `x' + 100
}
est dir
我只关心一个预测变量,在这里说mpg
。我想从每个结果中提取 mpg
的系数到一个独立的文件中(任何文件都可以, .dta
会很棒)看是否有随着 weight
阈值增加的趋势.我现在做的是使用estout
导出结果,比如:
esttab * using test.rtf, replace se stats(r2_a N, labels(R-squared)) starl(* 0.10 ** 0.05 *** 0.01) nogap onecell title(regression tables)
estout
将导出所有内容,我需要编辑结果。这适用于预测变量很少的回归,但我的真实数据集有 30 多个变量,回归将至少循环 100 次(我有一个变量 Distance
,范围从 0 到 30,000:它具有 weight
在示例中)。因此,我真的很难不出错地编辑结果。
还有其他有效的方法可以解决我的问题吗?由于我的案例不是循环遍历组变量,而是循环遍历某个标准。 statsby
函数在这里似乎不能正常工作。
我建议您查看 help postfile
以了解如何汇总结果的示例。我同意 statsby
可能不是最好的方法。在 price
上评估 mpg
和 weight
之间的交互可能有助于解决看似经典的交互问题。
正如@Todd 已经建议的那样,您可以只选择您关心的特定结果并使用 postfile
将它们作为新变量存储在新数据集中。请注意,forval
循环比您的 while
代码更直接,而在最新版本的 Stata 中,使用 xi:
已被因子变量表示法取代。 (我没有改变它,以防万一你使用的是一些旧版本。)注意对保存的结果的评估,例如 _b[_cons]
的动态和使用括号 ()
来停止评估负号。其他地方的一些代码示例将结果临时存储在本地宏或标量中,这是完全没有必要的。
sysuse auto.dta, clear
tempname myresults
postfile `myresults' threshold intercept gradient se using myresults.dta
quietly forval x = 2000(200)4800 {
xi: regress price mpg length gear_ratio i.foreign if weight < `x'
post `myresults' (`x') (`=_b[_cons]') (`=_b[mpg]') (`=_se[mpg]')
}
postclose `myresults'
use myresults
list
+---------------------------------------------+
| thresh~d intercept gradient se |
|---------------------------------------------|
1. | 2000 -3699.55 -296.8218 215.0348 |
2. | 2200 -4175.722 -53.19774 54.51251 |
3. | 2400 -3918.388 -58.83933 42.19707 |
4. | 2600 -6143.622 -58.20153 38.28178 |
5. | 2800 -11159.67 -49.21381 44.82019 |
|---------------------------------------------|
6. | 3000 -6636.524 -51.28141 52.96473 |
7. | 3200 -7410.392 -58.14692 60.55182 |
8. | 3400 -2193.125 -57.89508 52.78178 |
9. | 3600 -1824.281 -103.4387 56.49762 |
10. | 3800 -1192.767 -110.9302 51.6335 |
|---------------------------------------------|
11. | 4000 5649.41 -173.9975 74.51212 |
12. | 4200 5784.363 -147.4454 71.89362 |
13. | 4400 6494.47 -93.81158 80.81586 |
14. | 4600 6494.47 -93.81158 80.81586 |
15. | 4800 5373.041 -95.25342 82.60246 |
+---------------------------------------------+
statsby
(一个命令,不是一个函数)根本就不是为这个问题设计的,所以不是能不能用的问题。
我打算 (1) 多次循环回归某个标准; (2) 存储每个回归的某个系数。这是一个例子:
clear
sysuse auto.dta
local x = 2000
while `x' < 5000 {
xi: regress price mpg length gear_ratio i.foreign if weight < `x'
est sto model_`x'
local x = `x' + 100
}
est dir
我只关心一个预测变量,在这里说mpg
。我想从每个结果中提取 mpg
的系数到一个独立的文件中(任何文件都可以, .dta
会很棒)看是否有随着 weight
阈值增加的趋势.我现在做的是使用estout
导出结果,比如:
esttab * using test.rtf, replace se stats(r2_a N, labels(R-squared)) starl(* 0.10 ** 0.05 *** 0.01) nogap onecell title(regression tables)
estout
将导出所有内容,我需要编辑结果。这适用于预测变量很少的回归,但我的真实数据集有 30 多个变量,回归将至少循环 100 次(我有一个变量 Distance
,范围从 0 到 30,000:它具有 weight
在示例中)。因此,我真的很难不出错地编辑结果。
还有其他有效的方法可以解决我的问题吗?由于我的案例不是循环遍历组变量,而是循环遍历某个标准。 statsby
函数在这里似乎不能正常工作。
我建议您查看 help postfile
以了解如何汇总结果的示例。我同意 statsby
可能不是最好的方法。在 price
上评估 mpg
和 weight
之间的交互可能有助于解决看似经典的交互问题。
正如@Todd 已经建议的那样,您可以只选择您关心的特定结果并使用 postfile
将它们作为新变量存储在新数据集中。请注意,forval
循环比您的 while
代码更直接,而在最新版本的 Stata 中,使用 xi:
已被因子变量表示法取代。 (我没有改变它,以防万一你使用的是一些旧版本。)注意对保存的结果的评估,例如 _b[_cons]
的动态和使用括号 ()
来停止评估负号。其他地方的一些代码示例将结果临时存储在本地宏或标量中,这是完全没有必要的。
sysuse auto.dta, clear
tempname myresults
postfile `myresults' threshold intercept gradient se using myresults.dta
quietly forval x = 2000(200)4800 {
xi: regress price mpg length gear_ratio i.foreign if weight < `x'
post `myresults' (`x') (`=_b[_cons]') (`=_b[mpg]') (`=_se[mpg]')
}
postclose `myresults'
use myresults
list
+---------------------------------------------+
| thresh~d intercept gradient se |
|---------------------------------------------|
1. | 2000 -3699.55 -296.8218 215.0348 |
2. | 2200 -4175.722 -53.19774 54.51251 |
3. | 2400 -3918.388 -58.83933 42.19707 |
4. | 2600 -6143.622 -58.20153 38.28178 |
5. | 2800 -11159.67 -49.21381 44.82019 |
|---------------------------------------------|
6. | 3000 -6636.524 -51.28141 52.96473 |
7. | 3200 -7410.392 -58.14692 60.55182 |
8. | 3400 -2193.125 -57.89508 52.78178 |
9. | 3600 -1824.281 -103.4387 56.49762 |
10. | 3800 -1192.767 -110.9302 51.6335 |
|---------------------------------------------|
11. | 4000 5649.41 -173.9975 74.51212 |
12. | 4200 5784.363 -147.4454 71.89362 |
13. | 4400 6494.47 -93.81158 80.81586 |
14. | 4600 6494.47 -93.81158 80.81586 |
15. | 4800 5373.041 -95.25342 82.60246 |
+---------------------------------------------+
statsby
(一个命令,不是一个函数)根本就不是为这个问题设计的,所以不是能不能用的问题。