在 Stata 中附加本地宏
Append local macro in Stata
在 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
它将给出如下所示的结果矩阵 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)
。
但我似乎无法正确使用引号将当前变量的标签附加到宏中。
矩阵的行名和列名在它们可以容纳的范围内是有限的。一般来说,变量标签不是很合适。
这是一些更简单的代码。
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''"
在 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
它将给出如下所示的结果矩阵 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)
。
但我似乎无法正确使用引号将当前变量的标签附加到宏中。
矩阵的行名和列名在它们可以容纳的范围内是有限的。一般来说,变量标签不是很合适。
这是一些更简单的代码。
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''"