ill-identified diary

所属組織の見解などとは一切関係なく小難しい話しかしません

STATA の結果を LaTeX 形式でエクスポートする方法

この記事は最終更新日から3年以上が経過しています

経済学系の統計解析で便利な STATA ですが、どうも結果出力が貧弱です。 デフォルトでは TeX 形式で出力してくれないし、エクセルにコピペしようとしてもセルがうまく区切られなかったりします (その点 EViews は結果出力の編集がしやすかった。私は最初はエクセルコピペして行列を整えた後、LaTeX のコードに変換するというめんどいことをやってました)。そこで、回帰分析の結果を様々な形式で出力してくれる esttab コマンドをインストールして直接 LaTeX 形式出力する方法を書いておきます。
自分は前処理を他の環境でやるので回帰分析以外の結果出力は今回は書きません。

ちなみに、 outtex というモジュールもあります。 こちらは回帰分析した直後に outtex と入力するだけでtexコードが表示され、かなり簡単ですが、STATAの画面上に表を出してくれない、あまりレイアウトを変更できない、そして複数の結果を同時に表示できない、という弱点があります。

esttab は estout の構文を簡略化したもので、おそらく全ての回帰分析 (regress) とパネルデータ分析 (xt--) 系統のコマンドに対し有効です。

インストール方法

STATA 8.2以降で使用できます。
STATAを開き,

ssc install estout, replace

でインストールできます。ネットワーク設定の問題でうまく行かない場合、
http://repec.org/bocode/e/estout/installation.html
に従ってください。管理者権限がないためにインストールできなかった場合は adopath でパスをつなげましょう (別記事参照)

一番簡単なコマンド
regress hoge hoge
esttab

これで直前の regress の結果を、経済学系の論文でよくある表の形式で出力します。ただ、これではまだテキスト形式で出力しているアスキーアートと変わらない状態なので、LaTeX 形式にします。

qui reg hoge hoge
estab using result.tex

これで result.texLaTeX コードが出力されます。

もう少しかっこよく

esttab はデフォルトでは、括弧書きで表示するのが 標準誤差ではなく t 値 (z 値) です。また、有意水準も 5%で *、1%で**、0.1%で*** となっています。そこで、経済系の論文でより一般的な、括弧書きで標準誤差を表示し、かつ有意水準も10%で*、5%で**、1%で***の形式にします。
括弧書きで標準誤差を表示するには、se オプションを使います。有意水準の星は star() オプションで変更できます。また、ついでに b(3) を指定して係数の桁数も丸めましょう。

reg hoge hoge
esttab using result.tex, se r2 star(* 0.1 ** 0.05 *** 0.01) b(3) replace

ただし、先ほどのコマンドですでに result.tex ができているため、replace オプションを追加して上書きしています。有意水準の記号についての注意書きも自動で出力されます。
また、さらに r2 をオプションに指定すれば決定係数が出力されます。ar2 なら自由度修正済みの決定係数を表示します。その他、pr2 で擬似決定係数 (psuedo-R2) や bic も表示できます。それ以外の統計量 (F値とか) を記載したいならば、scalar() を使います。統計量を表すマクロ等は各回帰分析のヘルプを参照してください。

複数の結果を並べる方法

パネルデータ分析なんかではよく OLS、FE、RE モデルの結果を比較するものがあります。用いる被説明変数に自信がないときも複数の候補を用いて比較する必要があります。
そのような場合にはそれぞれの結果を横に並べる必要があります。これは estimates store コマンド (est sto に省略可能) で複数の結果を保存することで可能になります。

qui reg hoge hoge
est sto reg1
qui reg foo foo
est sto reg2
esttab * using result.tex, se r2 star(* 0.1 ** 0.05 *** 0.01) b(3)  replace

* で保存されている全ての結果を出力します。もちろん、esttab reg1 reg2 というふうに書いても同じです。また、最後の回帰分析の結果は store しなくても自動で保存されるので、あえて est sto しなくても問題ありません。ちなみに est sto で保存した結果は est drop 保存名 で削除、または est clear で全削除されます。

もっと体裁にこだわりたい人向け

ここまでの方法で最低限必要な情報を LaTeX 形式にエクスポートできますが、LaTeX 使いの方はおそらくもっと体裁にこだわるでしょう。
以下では体裁にこだわる人向けのオプションを紹介します。

  • タイトルは title() を使います。tex コードも有効なので、title(タイトル1\label{title1}) のように \label をつけることもできます。
  • 説明変数の名前をSTATAでの内部名にするのがいやな場合、label オプションで変数名を label の内容に置き換えます。ただし、MacOSで は日本語が扱えなかった (12以降は未確認) ので日本語の使用方法は分かりません。

さらに言うと、この方法では文字はTeXエスケープが必要な文字もそのまま出力してしまうので、あまり使えません。そこで、 細部まで拘りたい方は coeflabels() を使います。 ()内に 変数名1 "置き換えたい文字列1" 変数名1 "置き換えたい文字列2" ... と記入します。 たとえば coeflabels(_cons "$\alpha$") で定数項 (_cons) をギリシャ文字のアルファにできます。

  • booktabs オプションで booktabs パッケージの使用を前提とした罫線を使います。
  • alignment() で数値の行のアラインを指定できます。\begin{tabular}{lxxx} の xxx 部分に対応します。 l, c, r を指定できるほか、 alignment(D{.}{.}{-1})などと入力することで dcolumn パッケージを使用した、係数と標準誤差を小数点で合わせての位置調整ができます。よって、 dcolumn を使う場合で、かつプリアンブルにすでにマクロを記述しているなら単にalignment(.)でもいいです。

ただし、これを使うと小数点のないサンプルサイズの行とヘッダのモデル名の部分がずれるので、手動で調整する必要があります。

  • さらに、パネルデータ等でコントロール変数が大量にあるときなどは、keep() オプションに書いた変数リストのみを表示することができます。
  • 同様の書き方で、order() で記載する順序を変更できます。定数項は _cons で表します。
  • 複数の結果を表示する場合、各列のヘッダに (1) (2) と番号が振られまが、 これが不要ならば nonumbers で消せます。
  • また各行の上記の番号の下の見出しが被説明変数になりますが、mtitles( "列1の名前" "列2の名前" ) というふうに表示する列名を指定できます。

または、nodepvar と入力すると被説明変数が est sto で保存した名前に置き換わるので便利です。保存しなかった場合は . になります。

  • addnote("文章") で注意書きを書き足せます。

以上をまとめると、

reg hoge hoge1
est sto reg1
reg hoge hoge2
est sto reg2
esttab * using result.tex, se star(* .1 ** .05 *** .01) b(3) r2///
booktabs alignment(D{.}{.}{-1}) keep(記載したい変数リスト) order(変数リストの順序) label title(Title here)

となります (replace オプション省略)。r2は場合によって他のものと使い分けてください。

実行例

STATAマニュアルにある regress の用例として、
{\displaystyle
 \mathit{mpg}_i = \beta_0 \mathit{weight}_i + \beta_1 \mathit{weight}^2_i + \beta_3 \mathit{foreign}_i + u_i 
}
を regress で回帰した結果を表示させます (\mathit{mpg} は mile per gallon)。次に、 xtreg の用例の、 賃金関数
{\displaystyle
\ln w_{it} = \beta_0 + \beta_1 \mathit{grade}_{it} + \beta_2\mathit{age}_{it} + \beta_3\mathit{age}^2_{it} +\beta_4 \mathit{exp}_{it}+\beta_5 \mathit{exp}_{it}^2 + \beta_6 \mathit{tenure}_{it}^2 + \beta_7\mathit{tenure}_{it}^2 +u_{it} 
}

を、POLS、FE、BE、REで推定した結果をまとめて表示させます。
以下をコピペして .do ファイルとして保存して実行するか、コピペして使用してみてください。

* STATAマニュアルにある regress の Example 1 の結果を出力してみる
* STATA 12 で動作確認
est clear
webuse auto.dta, clear
* ネット接続出来ないのならば別の方法でダウンロードしてください
* mpg = weight + weight^2 + foreign + u
* 回帰して結果を model1 として保存
reg mpg weight c.weight#c.weight foreign
est sto model1
* まずは STATA に完成図を表示
* 自由度修正済み決定係数と AIC も表示
esttab , se b(3) ar2 aic star(* 0.1 ** 0.05 *** 0.01) nodepvar 
* tex コードを表示
esttab , se b(3) ar2 aic star(* 0.1 ** 0.05 *** 0.01) ///
booktabs alignment(D{.}{.}{-1}) label title(Example 1) nodepvar
* reg1.tex として保存。 ついでに変数名も変更
esttab using reg1.tex, se b(3) ar2 aic star(* 0.1 ** 0.05 *** 0.01) booktabs alignment(D{.}{.}{-1}) title(Example 1) nodepvar coeflabels(weight "$\mathit{weight}$" c.weight#c.weight "$\mathit{weight^2}$" foreign "$\mathit{foreign}$" _cons "$\alpha$")

** 複数列を同時に出力する
* xtreg のExample 1 の National Longitudinal Surveys をもとに賃金関数を回帰分析したものの結果を出力してみる
* POLS, Between, FE, RE の4通りの結果を並べて表示
webuse nlswork.dta, clear
* 回帰して保存
reg ln_w grade age c.age#c.age ttl_exp c.ttl_exp#c.ttl_exp tenure c.tenure#c.tenure 2.race not_smsa south
est sto POLS
xtreg ln_w grade age c.age#c.age ttl_exp c.ttl_exp#c.ttl_exp tenure c.tenure#c.tenure 2.race not_smsa south, be
est sto Between
xtreg ln_w grade age c.age#c.age ttl_exp c.ttl_exp#c.ttl_exp tenure c.tenure#c.tenure 2.race not_smsa south, fe
est sto FE
xtreg ln_w grade age c.age#c.age ttl_exp c.ttl_exp#c.ttl_exp tenure c.tenure#c.tenure 2.race not_smsa south, re
est sto RE
* 完成図をSTATA上に表示
* ただし, コントロール変数の表示を省略。 またFEではgrade変数が落とされたので drop(o.grade) を使って無駄な表示を省いている。 
esttab POLS Between FE RE, se b(3) r2 star(* 0.1 ** 0.05 *** 0.01) title(Example 1) nodepvar keep( grade age c.age#c.age ttl_exp c.ttl_exp#c.ttl_exp tenure c.tenure#c.tenure _cons) drop(o.grade)
* TeXコード表示 & 保存
esttab POLS Between FE RE, se b(3) r2 star(* 0.1 ** 0.05 *** 0.01) title(Example 1) booktabs alignment(D{.}{.}{-1}) nodepvar keep(grade age c.age#c.age ttl_exp c.ttl_exp#c.ttl_exp tenure c.tenure#c.tenure _cons) drop(o.grade) nodepvar
esttab POLS Between FE RE using xtreg.tex, se b(3) r2 star(* 0.1 ** 0.05 *** 0.01) title(Example 1) nodepvar booktabs alignment(D{.}{.}{-1}) coeflabels(grade "$\mathit{grade}$" age "$\mathit{age}$" c.age#c.age "$\mathit{age}^2$" ttl_exp "$\mathit{exp}$" c.ttl_exp#c.ttl_exp "$\mathit{exp}^2$" tenure "$\mathit{tenure}$" c.tenure#c.tenure "$\mathit{tenure}^2$" _cons "$\alpha$") keep(grade age c.age#c.age ttl_exp c.ttl_exp#c.ttl_exp tenure c.tenure#c.tenure _cons) drop(o.grade) nodepvar

上記の出力を .png にしたのがこれ (svg変換がうまくいかなかった)
f:id:ill-identified:20140112211538p:plain
f:id:ill-identified:20140112211600p:plain

参考文献

(エクセルの表として出力する方法も記載されています)

(esttab のドキュメンテーション)

(estimates コマンド)

(outtex 概要&ダウンロード)