Development Micro-econometrics Study Group: Code Notes

日本語で経済学分析に有用なコードの備忘録を作成しています。We provide explanations of useful codes in Japanese for data cleaning, analysis, visualization like memorandum. Our software focuses on STATA, R, Python.

Stataで重複する観測値を残す(duplicates keep)。

Stataで重複する観測値がある場合にduplicatesコマンドを用いることができる。例えば、duplicates drop variable, forceとすれば、重複するvariableを落とすことができる。 しかし、重複する観測値だけを残すというオプションは筆者の探す限り見つからなかった。そこで、以下の手順を踏んだ。

gen a = 1 
egen dup = sum(a), by(ID)
keep if dup != 1

具体的には、全て1をとるような変数を作り、それを重複しているもの(ここではID)ごとに足しあげることで、重複するIDに関しては1より大きい値が記録されることになる。 それらを落とせば、残るのは重複するもののみである。ちなみに、この後、sort IDとすれば重複が見やすくなる。

Stataで複数のグラフを一つのグラフにくっつけるときにlegendを一つにする方法。

複数のグラフを一つにまとめるとき使われるのが、graph combine ...のコマンドである。 しかし、すべてのグラフが同じlegendの時、グラフごとにlegendが表示されてしまうと目障りである。複数の同じlegendを持つグラフに対して、一つのlegendを表示させることができるのがgrc1legコマンドである。 例えば、以下のように複数グラフを出力する。

 foreach f of varlist $variables {   
        cibar `f', level(90) graphopts(name(`f'bar, replace)) 
    }

ここまでで、var1bar var2bar var3barの名前でそれぞれのグラフが保存されている。この後graph combineでなく、

 grc1leg var1bar var2bar var3bar, ///
        imargin(0 0 0 0) ycommon rows(2) iscale(0.4) title(Three graphs) legendfrom(var1bar)

のようにすると、三つのグラフをくっつけ、legendfrom()で指定したグラフのlegendのみ表示される。その他のoptionはgraph combineと大体同じといった印象で、rows()iscale()なども使える。 なお初めて使うときは

net install grc1leg,from( http://www.stata.com/users/vwiggins/)

を実行してインストールする必要がある。

Stataでデータから行列(matrix)を取り出す。

データの中から行列を取り出すことができるコマンドはmkmatである。(筆者はDelta methodでstandard errorを計算するときに必要な操作であった。) 例えば、変数が(var1 var2)のように二つありそれぞれの観測数がKであるとする。それらを2*Kの行列として取り出すには、

     mkmat var1 var2, matrix(newmatrix)

とすればよい。newmatrixは保存する名前である。実際に取り出した行列の中身を見るには、

matrix list newmatrix

とすればよい。mkmatでは行はr1, r2...のように名前付けられる。参照: https://www.stata.com/manuals13/pmatrixmkmat.pdf

Stataでestout/esttabの際にlocal statsが表示されない。

 回帰分析などの結果をきれいに出力するコマンドであるesttabであるが、表の下のほうに固定効果(FE)の有無や説明変数の有無など複数の情報を入れようとすると、うまく表示されないエラーがあった(他の人はうまくいっているようなので理由不明)。esttabestaddの使い方は多くの方が書いていますが、特にestaddに関しては、以下のリンクがわかりやすかったですdariotoman.com

local controls x1 x2 x3

* Model 1
reg y keyvar, robust
est sto reg_1
estadd local controls "No"
estadd local Region "No"

* Model 2
reg y keyvar `controls', robust
sum y if keyvar == 0
est sto reg_2
estadd local controls "Yes"
estadd local Region "No"

* Model 3
reg y keyvar `controls' i.village, robust
sum y if keyvar == 0
est sto reg_3
estadd local controls "Yes"
estadd local village "Yes"

* Export tex tables 
local regtable reg_1 reg_2 reg_3
esttab `regtable' using "$Dropbox/reg_table.tex",
stats(controls Region N, ///
    labels ("Control variables" "village FE" ""Observations) ///
    fmt(0 0 0)) ///
replace

これでControlやvillage FEのと欄にうまくYes/Noが表示されないとき、以下のようにestaddの後ろにその結果を付け加えるeststoの名前を付けると(なぜか)うまくいきました。

* Model 1
reg y keyvar, robust
est sto reg_1
estadd local controls "No": reg_1
estadd local Region "No": reg_1

Stataで文字列の空白を削除する。

元のデータがエクセルなどで手入力されていたりすると、一つのセルの中で変な空白が入ってしまっていることがある。これが数字の情報だったりすると文字列として読み込まれてしまうので、整理する必要がある。そういったときに便利なのがsubinstrコマンドである。 たとえばIDデータがセルの中に"123 456"のように、3と4の間に空白が入ってしまっているとする。そのとき、

replace ID = subinstr(ID, " ", "", .)

とすれば、ID内の空白はすべて削除される。(別件ではあるがこれを数字列の情報に変えたい場合、上のコマンド実施後にdestring ID, replaceとすればよい)

Stataでエラーを無視してスクリプトを進めさせる。

Stataでエラーがでたときに、時によっては無視して進めてほしい場合がある。エラーが出るといったんコードが止まってしまうので、エラーがあった場合もそれを無視して進めさせたいときに使うのがcap (captureでも可)コマンドである。

ex 1) 複数人でコード共有するときのパスの設定 複数人でdo-fileを共有すると、パスが人によって違うので各々作業を始めるときにパスをいちいち書き直さないとエラーで止まってしまう。しかし、

cap: cd "Dropbox\Tanaka"
cap: cd "Dropbox\Okada"

とすると、田中さんのパソコンでは上のpathを読み込み、下はエラーとなるので無視してコードが進み、岡田さんのパソコンでもその逆が起こるのでいちいちエラーが吐き出されずに済む。

ex 2) * close (log close \ est clearなど) 長いコードを書きlogファイルに記録していると、前でlog onされたがlog closeの前でコードが止まるとそれが閉じていないことがある。するともう一度上からコードを回すときに、閉じていないのにlog using ...が指令されエラーがでて止まってしまう。毎回do fileが止まるたびに手動でlog closeをするのは面倒なので、do-fileの最初のほうにcap: log closeを入れておけばよい。log onとなっていない場合、逆にcloseするものがなくこれがエラーとなってしまうので、capが必要である。

Stataで数字列から部分的な情報を取り出す方法。

データのセル内に特定のルールで数字列が並んでいるときに、その一部を取り出す方法。例えば、以下のようなデータがあるとする。 市町村ID(6桁) = 都道府県ID(2桁) + 市町村番号 (4桁) 291045 = 29 + 1045

この時、都道府県IDだけのデータを取り出すには、

gen 都道府県ID = real(substr(市町村ID, 1, 2))

のように、その変数名と、桁数のはじめと終わりを入力すればよい。