ill-identified diary

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

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

経済学系の統計解析で便利な 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 概要&ダウンロード)

大学の STATA にインストールされていない外部のモジュールを使う

経済学系の統計解析で便利な STATA ですが、有償なので多くの学生は大学の PC に用意されているものを使うはず。しかしこの STATA, 便利なのですがちょっとマイナーな手法になると実装されていないため、自作するかネット上で公開されている外部モジュールに頼らなければなりません。しかし、大学の端末はたいてい管理者権限がないところに STATA 本体がインストールされているので、外部モジュールをインストールすることができません。
こういう場合、USBメモリとユーザーの作成した .ado ファイルのあるフォルダを指定する adopath を併用すれば管理者権限がなくても使用できる可能性があります。

つまり、

  1. 自前のUSBメモリ (もしくは権限のあるローカルフォルダ内) に使用したい .ado ファイルを入れておく
  2. USBメモリを STATA の入った大学の PC に接続し、
adopath + ".adoの入ったフォルダのパス"

とすれば、外部モジュールによるコマンドを認識してくれます。

同様にカレントフォルダに権限のない場所が指定されていると log using でログを取ることができないので、 これも

cd "適当なパス"

で指定する必要があります。コマンドを直接打ち込む以外にも、 [file] から "change working directory" を選択することでもフォルダを変更できます。

64bit版 Ubuntu で32bit版(学生版) MATLAB を動かす方法

学生版は32bit限定のため、 64bit版 Ubuntu ではインストール時や起動時に不具合が発生するおそれがある。 以下は自分が64bit版 Ubuntu 13.04でMATLAB R2012a学生版を起動までこぎつけた時のメモ.とはいえ、大半はMATLAB-Community Ubuntu Documentationの要約。

注: MATLAB 2012a は ubuntu13.04 の動作対象外です。また、他のバージョンでも最新の Ubuntu に対して動作保証してないことが多いので真似する方は自己責任でお願いします。

光学ドライブにディスクをセットし、端末を開き installファイルのあるディレクトリへ移動。
例)

cd /media/USER_NAME/MATHWORKS_R2012a
./install -glnx86 -v

単に./installとするのではなく、 上記のようなオプションをつける。
自分はここで最初のエラー。

インストール時にjavaのエラーっぽいものが出る
exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class java.awt.Component
        at java.lang.Class.forName0(Native Method)
        ...

と出た。しかしJavaの問題ではなく、先のページに書いてあるように、ia32-libs をインストールすれば解決できる。

sudo apt-get install ia32-libs

でインストールできる。リポジトリ登録は特に必要ない。

MATLABインストールウィンドウが現れ、各種設定項目が現れた。
Choose installation type では"Custom"を選ぶ。
specify the install folder は初期設定のまま続行。
次の画面で Create symbolick links to MATLAB scripts in:
にチェックを入れる。pathは初期設定の /usr/local/binのまま。

アクティベーション画面で文字化け

次の不具合、 アクティベーション画面で文字化けがひどく、 所属学部等のリスト選択でどれを選べばよいかわからなかった。
これは、 MathWorks公式サイトにログインし、 そこでのリストの並び順を覚えて選択するという力技で解決。 ログイン後、 右上の「アカウント」をクリックし、 遷移後のページ左上の Edit Profileをクリック。下方の学生ユーザー情報の各ドロップダウンリストの並びを覚えておく。
ただし、 これに関してはJavaランタイムに日本語フォントを指定すれば解決できた可能性がある(後述)。
これ以降インストール完了まで不具合は発生しなかった。
一旦端末で

matlab

と入力し起動するか確認。

ランチャーファイルの作成

そのままではunityドック等に表示されないので、 体裁に拘りたければ、 先のページにしたがってランチャーファイルを作成。端末を開き、アイコン画像の取得

sudo wget http://upload.wikimedia.org/wikipedia/commons/2/21/Matlab_Logo.png -O /usr/share/icons/matlab.png

もちろん、 /usr/share/icons/matlab.pngとして保存すればoctaveのアイコンだろうがmathematicaのアイコンだろうが可能。
次に、 .desktopファイルの取得

sudo wget 'https://help.ubuntu.com/community/MATLAB?action=AttachFile&do=get&target=matlab-r2012a.desktop' -O /usr/share/applications/matlab.desktop

32bit版なので修正する必要がある。テキストエディタで開く.

sudo gedit /usr/share/applications/matlab.desktop

もちろんgedit以外のテキストエディタでもよい。
アイコンを表示させるため、.desktop ファイル内の記述

#StartupWMClass=com-mathworks-util-PostVMInit

をアンコメントアウト(頭の#を消す)。
次にに学生版(つまり64bit環境で32bit版を実行する場合)ならば

Exec=matlab

コメントアウト(頭に#をつける)し、

#Exec=matlab -arch=glnx86 -desktop

をアンコメントアウト
以上を保存しテキストエディタを閉じる。
これで起動できるようになった。自分は cairo dock を使用しているが、これでドラッグ&ドロップで簡単に登録できる。
次は起動後の不具合

シンボリック変数が使えない
syms a b;

のようにシンボリックリンク変数を宣言しようとしたところ、

Invalid MEX-file
'/usr/local/MATLAB/R2012a_Student/toolbox/symbolic/symbolic/mupadmex.mexglx':
libGL.so.1: cannot open shared object file: No such file or directory

というエラーが現れ実行できなかった。 libGL.so.1 にパスが通っていない?
locate等を使いパスを調べる。次に、調べたパスをLS_PRELOADに与えてMATLABを起動する。
例)

LD_PRELOAD=/usr/lib/i386-linux-gnu/mesa/libGL.so.1 matlab

たぶんだいたいの場合これと同じパスになるはず。
あるいは

sudo gedit /etc/ld.so.conf.d/matlab.conf

matlab.conf を作成し、 ライブラリへのPATHを記述。つまりファイル内に

/usr/lib/i386-linux-gnu/mesa/libGL.so.1

とだけ書いて保存し終了。
保存してテキストエディタ終了。 なお更新しないと反映されないので、

sudo /sbin/ldconfig

で更新する。これでシンボリック変数も使用できるようになった。

日本語の文字化け

MATLAB起動後も日本語が表示されるべき箇所が四角の羅列に文字化け(俗に言う豆腐?)している。
日本語のファイルを使うことが無いので放っておこうとも考えたが、 公式に解決方法が記載されていた。
ここの「Linux システムにアジア言語の文字が正しく表示されない」を参照。ただし、わかりにくいのでこちらも参考に。 とりあえず TakaoGothic を指定してみたが、 日本語に対応したフォントならおそらく何でも良いはず。 フォントフォルダにOSにすでにインストールされているフォントファイルへのシンボリックリンクを作れば良いので:

cd /usr/local/MATLAB/R2012a_Student/sys/java/jre/glnx86/jre/lib/fonts/
sudo mkdir fallback
sudo ln -s /usr/share/fonts/truetype/takao-gothic/Takao* ./fallback/.

/usr/.../R2012a_Student/のところはインストール時の設定やバージョンによって変わるので各自適当なものに置換してください。
これで自分は文字化けを解消できた。もう一方の fontconfig.properties を修正するやり方はよくわからなかったので無視。
インストール時の文字化けもこんな感じで解決できたのかもしれない。