Stata

Stataで知っておくと便利なコマンドを不定期に更新します。

substr:文字列から特定の数文字を抽出

year
1996年 1996
1997年 1997
1998年 1998
1999年 1999
2000年 2000

左のように"年"という文字を含んだ変数から前4つの数字だけを取り出して、右のように数字だけからなる変数yearを作るときには、substrというコマンドを使う。

gen year = substr(年, 1, 4)
*** 以下でも同じ結果を得られる. 
gen year = substr(年, -2, 4)

substr()のなかの1つめの項は変数名を、2つめの項は前から何番目の文字から抽出するかを、3つめの項は先に指定した文字からいくつの個数の文字を抽出するかを、それぞれ指定する。たとえば前者のコマンドの場合は、「年という変数の1番目の文字から4文字分抽出する」ということになる。後者のコマンドのように2つめの項に-を指定することもでき、この場合は後ろから何番目の文字を抽出するかを表す。先の例だと、「年という変数の後ろから2番目の文字から4文字分抽出する」という意味になる。参考:http://statamemo.jugem.jp/?month=201103

generate double:8桁を超える値をとる変数を作成する

Stataでは数字はデフォルトだとfloatという型で保存される。詳しいことはわからないけれど、floatというのは10進数のもとでは有効桁数が7桁となる4byteのサイズを持つ形式のことを指すようである(参考:http://www.cc.kyoto-su.ac.jp/~yamada/programming/float.html)。ほとんどの場合数値はfloat型で問題なく扱えるのですが、たまに8桁を超える値をもつ変数を作ろうとした場合、値が指数表記されてしまい、正確な値を保存することができないという事態が起こる。

そのような場合は、変数を作成するときに型名としてdoubleを指定すれば良いようです(参考:https://www.stata.com/manuals13/u12.pdf#u12Data 12.2.2節"Numeric storage types")。doubleは10進数のもとでは有効桁数が15桁となる8byteのサイズを持つ形式。これを使うことで、8桁を超える値をとるような変数を扱うことができるようになる。実際の使い方としてはこんな感じ:

gen double x = y

これで、新しく作られる変数xが8桁を超える値をとるものであったとしても、値が指数表記されずにすむ。

labsumm:記述統計量の変数名にラベルをつけて出力

summarizeだと変数にラベルがつかないので、エクセルなどに貼り付けた後に自分で書かないといけないけど、labsummコマンドだとラベルをつけた状態で出力できる。

ssc install labsumm /*コマンドのインストール*/
lab var female "女性"
lab var income "所得"
labsumm female income

fsum:より一般的な記述統計量を出力するコマンド

labsummよりも新しいコマンドで、通常のsummarizeコマンドをさらに拡張したような使い方ができる。変数にラベルをつけて表示することはもちろん、カテゴリカル変数の内訳を(ダミー変数を作ることなく)算出できたりする。詳しくはhelpファイルを参照のこと。

ssc install fsum /*コマンドのインストール*/

lab var sex "性別"
lab def sexlab 1"男性" 2"女性"
lab val sex sexlab

recode sex (1=0)(2=1), gen(female)
lab var female "女性"

lab var income "所得"

fsum female income, stats(mean sd p50) /*平均、標準偏差、中央値を表示*/
fsum female income, uselabel /*変数名はラベルで表示*/
fsum sex income, catvar(sex) /*カテゴリカル変数について内訳の%を算出*/
fsum female income, format(%9.4f) /*小数点第4位まで出力(デフォルトは第2位)*/

vioplot:ヴァイオリン・プロットを描く

箱ひげ図とヒストグラムの特徴を併せ持つヴァイオリン・プロットをStataでも描くことができる。"VIOPLOT"というコマンドを使用する。

参考)「箱ひげ図とバイオリンプロットの印象の違い」

ssc install vioplot /*コマンドのインストール*/

/***試しに箱ひげ図と見た目を比べてみる***/
use "http://www.stata-press.com/data/r13/auto", clear
graph box mpg, title("Box plot") over(foreign) ylabel(10(10)50) /*こっちが箱ひげ図*/
graph save "box.gph", replace
vioplot mpg, title("Violin plot") over(foreign) ylabel(10(10)50) /*こっちがヴァイオリンプロット*/
graph save "vioplot.gph", replace
graph combine "box.gph" "vioplot.gph", scale(1.5) /*並べてみる*/

実際の見た目はこんな感じ。violin plotのほうがぱっとみた時の情報量が多い。デフォルトだと、カーネル密度のなかに箱ひげ図がはいったかたちになる。

coefplot:回帰係数と信頼区間をプロットする

種々の回帰分析から得られた係数とその信頼区間をプロットするコマンド。以下の通り開発者が詳しく解説してくれているので、ここでは最低限のコマンドだけ載せておく。

参考)Jahn, Ben. 2017. "Plotting regression coefficients and other estimates in Stata." University of Bern Social Sciences Working Paper No.1.

Jahn, Ben. "A new command for plotting regression coefficients and other estimates." 12th German Stata Users Group meeting Hamburg, June 13, 2014.

ssc install coefplot

use "http://www.stata-press.com/data/r13/auto", clear

qui reg mpg rep78 foreign /*回帰分析をしたあとに…*/

coefplot /*切片も含めすべての係数および95%信頼区間をプロット*/
coefplot, keep(rep78 foreign) /*指定した独立変数のみプロット*/
coefplot, scheme(s1mono) keep(rep78 foreign) ciopts(recast(rcap)) vert scale(1.2) ylabel(,grid) ytitle("coef.") /*自分が使うときはこんな感じで設定*/

tabulate, gen():ダミー変数を一度に作成する

tabulateコマンドのオプションに、結果を出力したあとにダミー変数を作ってくれるものがあります。generateやrecodeコマンドを使わずにダミー変数を一度に作成することができます。記述統計量を出すときなどに便利です。

tab educ, gen(educd)
/*
もしeducが1, 2, 3, 4, 5の5値の変数であれば,educd1-educd5という5つの変数が作られる.
小さいカテゴリから順に1, 2,…と自動的に名前が付いていくので,間違えないように注意.
*/
tab educ educd1 /*ちゃんと変数ができたかどうか確認してみる*/

set more off:no more --more--

Stataは縦に長い結果を出力したり、時間のかかる計算をしているときに、途中で

--more--

という表示を出します。これが出ると、何らかのキーを押したりクリックしたりしないと計算が進まなかったり、続く結果が出力されなかったりして面倒です。

そこで、Stataを開いたときに

set more off

というコマンドを走らせると、Stataを閉じるまでは

--more--

が出ないようになります。do fileの一番最初とかに書いておくとよいと思います。

また、

set more off, permanently

というコマンドを走らせるとStataの設定自体が書き換わるので、再度開いたときにもその効果が続きます。

grc1leg:グラフを結合したときに凡例を1つだけにする

graph combineという、Stataで作ったグラフを結合するコマンドがあります。ただ、もとのグラフごとに凡例がついている場合、単純に結合するとくっつけた数だけ凡例ができてしまい、大変冗長になってしまいます。

そこで、どれか一つのグラフから凡例をとってくるコマンドがgrc1legです。使い方は以下のとおり。

twoway line y1 x, by(sex) saving(graph1, replace)
twoway line y2 x, by(sex) saving(graph2, replace)
grc1leg graph1.gph graph2.gph, legendfrom(graph1)

このばあい、グラフ1から凡例をとってきて表示するというかたちになります。