2016-08-23 41 views
0

回帰を実行した後にvarlistにループするように、Stata行列要素を列名で読み取ってみたいと思います。列名で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ではなくheadroomで失敗しました。 weighttrunkはどちらも負ですが、私自身の別のコードでは正の係数では失敗します。

マニュアルカウンターを使用すると(下記)、なぜ列名で失敗するのですか?別の解決策がありますか?

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

ありがとうございますが、 'help matrix subscripting'からは明らかではありません。数字とテキストが混在していますか?ヘルプファイルには、テキストサブスクリプトが表示されます。いずれにせよ、これは機能します!ありがとう! –

+0

また、上記は私のおもちゃのコードで動作しますが、場合によっては次のエラーが発生します。 'type mismatch r(109);' –

+0

'help matrix subscripting'では、記述の2番目の文は_Subscripting by行/列名は行列コンテキストでのみ使用できます。' scalar'コマンドは行列コマンドではありません。列と行の名前は 'string'でなければならないので、マクロ展開を囲む' 'が必要です。これは' colnumb 'だけでなく他の行列式でも当てはまります。最初のアドバイスを書いていたときに問題を絞り込もうとしていたときにこの問題が発生したため、引用符で囲まれていない列名を使用したと考えられます。 –

関連する問題