3

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

但我似乎无法正确使用引号将宏附加到当前变量的标签。

4

1 回答 1

2

矩阵行名和列名的内容有限。一般来说,变量标签不会很合适。

这是一些更简单的代码。

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 中然后再次取出。为了摆脱这种习惯,想想这个类比。你手里拿着一支笔。你把它放在一个盒子里。你再拿出来。现在你手里拿着一支笔。如果不需要,为什么要做盒子?

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

 local rownms `rownms' "`: var label `v''" 
于 2017-05-11T12:29:36.003 回答