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)の有無や説明変数の有無など複数の情報を入れようとすると、うまく表示されないエラーがあった(他の人はうまくいっているようなので理由不明)。esttab
やestadd
の使い方は多くの方が書いていますが、特に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
が必要である。