在Stata中,如何按名称操作矩阵元素?

时间:2012-05-12 19:05:48

标签: matrix linear-algebra matrix-multiplication stata

在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,degra]是无效的语法。奇怪的是,Stata确实承认display X[1, precip]。如果不是precip我使用了precip向量中出现X的列号,Stata会知道我要做什么。如果我只是做了一次这个操作,没问题。但是我需要多次执行此操作(针对几种不同的模型规范)以及将一个模型中的位置从一个模型更改为下一个模型的几个变量,因此我不能只使用列号。

1 个答案:

答案 0 :(得分: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命令,或通过适当的predictmatrix score(这是predict的低级版本。将效果归因于变量只有在回归量正交时才有意义,这只有在经过精心设计和实施的实验中才会发生。