2016-08-23 700 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