2012-05-12 107 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水平低版本)是什麼。將影響歸因於一個變量只有當你的迴歸正交時纔有意義,這隻發生在精心設計和進行的實驗中。