2012-05-12 75 views
0

在Stata中,经过回归后,我知道可以通过名称调用存储结果的元素。例如,如果我想操纵变量precip上的系数,则只需键入_b[precip]。我的问题是如何在tabstat命令后执行相同的操作?例如,说我想的precip样本均值乘上precip系数:在Stata中,我如何操纵矩阵元素的名字?

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

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

+0

请将您的问题与'sysuse auto'开头的完整变量名称相关联,后面加上'regress price mpg foreign weight',这样每个人都在共同的波长上。 'tabstat'是一个非常肤浅的命令,虽然这可能是个人喜好的问题。 – StasK

回答

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记忆中的(全局)矩阵一起操纵;大多数情况下,这是一个坏主意,因为程序只能用本地对象进行操作。

我怀疑你想要做的是解决,在这种或那种方式,方法是omnipowerful margins命令,或者通过适当的predict,或matrix score(这是predict水平低版本)是什么。将影响归因于一个变量只有当你的回归正交时才有意义,这只发生在精心设计和进行的实验中。