0

在 Stata 中,在回归之后,我知道可以按名称调用存储结果的元素。例如,如果我想操作变量 的系数precip,我只需键入_b[precip]。我的问题是如何在tabstat命令之后执行相同的操作?例如,假设我想将系数乘以precip的样本均值precip

    reg --variables in regression--
    tabstat --variables in regression--
    mat X=r(StatTotal)
    mat Y=_b[precip]*X[1,precip]

啊,要是这么简单就好了。但是很可惜,在最后一行 X[1, precip] 是无效的语法。奇怪的是,Stata 确实承认display X[1, precip]. precip如果不是我使用precip出现在X向量中的列号, Stata 就会知道我要做什么。如果我只做一次这个操作,没问题。但是我需要多次执行此操作(对于几种不同的模型规格)以及将向量中的位置从一个模型更改为下一个模型的几个变量,所以我不能只使用列号。

4

1 回答 1

2

我还不确定我是否完全理解你想要做什么,但这是我试图重现你正在做的事情:

    sysuse auto, clear
    regress price mpg foreign weight
    tabstat mpg foreign weight, save
    matrix X = r(StatTotal)
    matrix Y = _b[mpg]*X[1, colnumb(X, "mpg") ]

如果您需要将其放入一个循环中,那也是可行的:

    matrix bb = e(b)
    local explvar : colnames bb
    foreach x in `explvar' {
      if "`x'" != "_cons" {
        matrix Y_`x' = _b[`x'] * X[1, colnumb(X, "`x'")]
      }
      else {
        matrix Y_`x' = _b[`x']
      }
    }

您可能希望将其放入program您将在每次回归模型估计调用之后调用的,例如:

    program define reg2mat , prefix( name )

      if "`e(cmd)'" != "regress" {
        // this will intentionally produce an error
        regress
      }

      tempname bb

      matrix `bb' = e(b)
      local explvar : colnames `bb'
      foreach x in `explvar' {
        if "`x'" != "_cons" {
          matrix `prefix'_`x' = _b[`x'] * X[1, colnumb(X, "`x'")]
        }
        else {
          matrix `prefix'_`x' = _b[`x']
        }
      }
    end // of reg2mat

在许多层面上,它并不理想,因为它使用 Stata 内存中的(全局)矩阵进行操作;大多数时候,这是一个坏主意,因为程序应该只使用它们本地的对象进行操作。

我怀疑您想要做的事情是以一种或另一种方式通过无所不能的margins命令,或通过适当的predict,或matrix score(这是 的低级版本predict)来解决的。仅当您的回归量是正交的时,将影响归因于变量才有意义,这仅发生在精心设计和进行的实验中。

于 2012-05-14T01:55:08.030 回答