2016-08-23 698 views
0

我想通過列名讀取Stata矩陣元素,以便在運行迴歸後循環使用varlist按列名提取Stata矩陣元素

在下面的代碼中,它有時會起作用,但不是所有的時間。我無法弄清楚爲什麼。

sysuse auto, clear 
scalar drop _all 
matrix drop _all 

regress price weight headroom trunk 
matrix b = e(b) 
local colnames : colnames b 
foreach v of local colnames { 
    if ("`v'" != "_cons") { 
     display "-------------------------" 
     display "`v'" 
     quietly summarize `v', detail 
     scalar beta = b[1,`v'] 
     scalar p75 = `r(p75)' 
     scalar p25 = `r(p25)' 
     scalar iqr = p75 - p25 
     scalar effect = beta * iqr 
     scalar dir 
    } 
} 

它失敗了weighttrunk,但不headroomweighttrunk都是負數,但在我自己的單獨代碼中,它對於正係數失敗。

使用手動計數器工作(下面),但它爲什麼失敗與列名稱?還有其他解決方案嗎?

regress price weight headroom trunk 
matrix b = e(b) 
local colnames : colnames b 
local i = 1 
foreach v of local colnames { 
    if ("`v'" != "_cons") { 
     display "-------------------------" 
     display "`v'" 
     quietly summarize `v', detail 
     scalar beta = b[1,`i'] 
     local ++i 
     scalar p75 = `r(p75)' 
     scalar p25 = `r(p25)' 
     scalar iqr = p75 - p25 
     scalar effect = beta * iqr 
     scalar dir 
    } 
} 

回答

4

爲您爲什麼在嘗試使用下標列名沒有工作的說明,請參見help matrix subscripting。用

替換你的線
 scalar beta = b[1,colnumb(b,"`v'")] 

確實有效。

+0

謝謝,但從'幫助矩陣子腳本'它不清楚。它是數字和文本的混合嗎?在幫助文件中,他們顯示文本子腳本。無論如何,這工作!謝謝! –

+0

此外,上述工作在我的玩具代碼中,但在某些情況下,我收到以下錯誤。 'type mismatch r(109);' –

+0

在'help matrix subscripting'中,描述的第二句是_Subscripting by row/column name may be used in a matrix context._'scalar'命令不是矩陣命令。請注意,列名和行名必須是「字符串」,所以圍繞宏擴展的引號應該是「必需的」,不僅在「colnumb」中,而且在其他矩陣表達式中都是如此。當我寫最初的建議時,我在試圖縮小問題時遇到了這個問題,因此我希望您使用了未引用的列名。 – 2016-08-23 23:49:05