在Stata中,我想探索具有不同因变量和自变量的多种组合的回归。
为此,我决定使用循环来完成所有这些回归,然后以简洁方便的形式将相关结果(系数,R2等)保存在矩阵中。
对于这个矩阵,我想命名行和列以使阅读更容易。
到目前为止,这是我的代码:
clear
sysuse auto.dta
set more off
scalar i = 1
foreach v in price mpg {
foreach w in weight length {
quietly: reg `v' `w' foreign
local result_`v'_`w'_b = _b[`w']
local result_`v'_`w'_t = ( _b[`w'] / _se[`w'] )
local result_`v'_`w'_r2 = e(r2)
if scalar(i) == 1 {
mat A = `result_`v'_`w'_b', `result_`v'_`w'_t', `result_`v'_`w'_r2'
local rownms: var label `v'
}
if i > 1 {
mat A = A \ [`result_`v'_`w'_b', `result_`v'_`w'_t', `result_`v'_`w'_r2']
*local rownms: `rownms' "var label `v'"
}
scalar i = i+1
}
}
mat coln A = b t r2
mat rown A = `rownms'
matrix list A
它将得到一个如下所示的结果矩阵:
. matrix list A
A[4,3]
b t r2
Price 3.3207368 8.3882744 .4989396
Price 90.212391 5.6974982 .31538316
Price -.00658789 -10.340218 .66270291
Price -.22001836 -9.7510366 .63866239
显然,还有一些尚未完成的事情。矩阵的行名称应为“price,price,mpg,mpg”,因为这是因变量在四个回归中的含义。
在上面的代码中,考虑现在注释掉的行
*local rownms: `rownms' "var label `v'"
它被注释掉了,因为在当前形式中,它会出错。
我希望在每次迭代时将本地宏rownms
附加变量的标签(或名称),生成Price Price Mileage (MPG) Mileage (MPG)
。
但是我似乎无法使用当前变量的标签附加宏来添加引号。
答案 0 :(得分:1)
矩阵行和列名称受限于它们可以容纳的内容。通常,变量标签不是非常合适。
这是一些更简单的代码。
sysuse auto.dta, clear
matrix drop A
local rownms
foreach v in price mpg {
foreach w in weight length {
quietly: reg `v' `w' foreign
mat A = nullmat(A) \ (_b[`w'], _b[`w']/_se[`w'], e(r2))
local rownms `rownms' `v':`w'
}
}
mat coln A = b t r2
mat rown A = `rownms'
matrix list A
注意:
nullmat()
技巧首先删除了对代码分支的需要,之后又运行了。
不需要将结果放入local
s然后再取出它们。为了摆脱这种习惯,想一想这个比喻。你手里拿着一支笔。你把它放在一个盒子里。你再拿出来。现在你手里拿着一支笔。如果你不需要盒子的话,为什么呢?
这适用于您的示例,但结果不是很好。
local rownms `rownms' "`: var label `v''"