在Stata中附加本地宏

时间:2017-05-11 12:07:11

标签: loops stata stata-macros

在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)

但是我似乎无法使用当前变量的标签附加宏来添加引号。

1 个答案:

答案 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

注意:

  1. nullmat()技巧首先删除了对代码分支的需要,之后又运行了。

  2. 不需要将结果放入local s然后再取出它们。为了摆脱这种习惯,想一想这个比喻。你手里拿着一支笔。你把它放在一个盒子里。你再拿出来。现在你手里拿着一支笔。如果你不需要盒子的话,为什么呢?

  3. 这适用于您的示例,但结果不是很好。

     local rownms `rownms' "`: var label `v''"