久々の投稿です。どうやって投稿するのかすら忘れかけていました.
久しぶりなので少し軽めの話題にしておきます.
今回のテーマは、「回帰分析の結果を取り出す」
です.
これまでの記事ではいちいち回帰式の推定値や標準誤差などから
結果をわざわざ取り出すようなことをしていましたが、
もっと簡単に結果を取得できることを知りました.
回帰分析の結果というのはStataとしてはある程度統一した形で格納してくれています。
それを使って結果を取り出す、というある意味最もシンプルな方法です.
1.マトリックス関数 ”el”
用いる関数は、”el“というもので、これは、マトリックス関数の一種になります。
Syntaxとしては、
el(s,i,j)
のように記述します.
sのところにはmatrix(結果表)の名前が来ます.
iとかjといった数字で、表の何列目の何番目の値かを指定します.
いつものように車のデータを使ってみましょう.
値段は重さと長さと外車かどうかできまる、という重回帰式を作ってみます.
sysuse auto, clear
regress price weight length foreign
このときの回帰式の結果は次のように表示されます.

この結果は、実はr(table)というmatrixに格納されているのです.
なのでこのmatrixを表示させてみましょう。
matrix list r(table)
すると、次のような形で結果が表示されます.

何だか縦のものを横にしたのか?という感じがしますが、横に行くと別の変数、縦に行くと点推定値→標準誤差→t値→P値→95%信頼区間下限→95%信頼区間上限…
となります。
もしも注目している変数を一番初めに持ってくれば、
local b = el(r(table), 1, 1)
local lb = el(r(table), 5, 1)
local ub = el(r(table), 6, 1)
local p = el(r(table), 4, 1)
という感じにlocal macroに格納して、
disp %5.2f `b', %5.2f `lb', %5.2f `ub', %5.3f `p'
とすれば気になる変数の必要な結果だけを表示することができます.
2.ループを組んで結果を一括で整える
この関数の使いどころとしては、繰り返しの作業ということになるでしょう.
具体的には、多変量モデルをいくつか組んで、ループを回して結果を出し、
それをコピーしてエクセルに貼り付ければ、結果の表を簡単に作ることができます.
global macro あるいは local macroで変数のリストを作成し、それを使ってループを回してあげればよいですね.
global cov1 length
global cov2 $cov1 foreign
global cov3 $cov2 displacement
qui {
forvalues n = 1/3 {
regress price weight ${cov`n'}
local b = el(r(table), 1, 1)
local lb = el(r(table), 5, 1)
local ub = el(r(table), 6, 1)
local p = el(r(table), 4, 1)
noi disp "Model`n'" , %5.2f `b', %5.2f `lb', %5.2f `ub', %5.3f `p'
}
}
このようにするだけで以下のように結果を得ることができます。

もうちょっと細工してやることで、
qui {
forvalues n = 1/3 {
regress price weight ${cov`n'}
local b = el(r(table), 1, 1)
local lb = el(r(table), 5, 1)
local ub = el(r(table), 6, 1)
local p = el(r(table), 4, 1)
noi disp "Model`n'" , %5.2f `b', %5.2f `lb', %5.2f `ub', %5.3f `p'
}
}
こんな風にカッコつきで結果を出すこともできます.
でもこれ、エクセルでやってもいいんですよね~.

こんな風にマトリックスをテーブルとしてコピーします.
そしてエクセルに貼り付けます.

このとき「データ」タブの、「区切りの位置」を押下してください.
出てきたウィザードに沿って作業していくとうまく区切れたデータになります.

これであとはエクセル関数などを使ってカスタマイズしましょう.
3.その他の回帰式、MI後のデータはどうか?
安心してください。ちゃんとでてきますよ.
ちなみに、Y氏がイギリスの某テレビ番組で、
”Don’t worry. I am wearing!”
と言った後に、出演者が続けざまに”Paaants!”と叫んでいたのが印象的でした.しかしこれは、
「Wearは他動詞なのに目的語がないよ!」
というsyntax errorを指摘していたんじゃないでしょうか??
さて、話をもどしましょう.
そうです.心配しなくていいのです.r(table)の中には多重補完したあとのデータがきちんと格納されます.
ロジスティック回帰やCox比例ハザードモデルも問題ありませんが、eformというところが1になっているかを確認しましょう.そうすれば結果がオッズ比あるいはハザード比などで表現されたものとわかります.
logitとlosisticでは出てくる結果が異なります.後者で計算された結果はオッズ比で報告されます.
また、MI後にCox回帰を行う際、mi estimateの後ろに “hr” というオプションを忘れずにつけましょう.
mi estimate, hr: stcox…
てな具合です。
4.まとめ
回帰分析を走らせた後に、r(table)というマトリックスに格納された結果を取り出す方法を学びました.
マトリックス関数”el”を駆使して結果だけを取り出せるようにすることで、結果を表示する手間が少しでも解消されるとよいですね.
コメント