Stata入門

経済系の実証分析などで用いられている商用の統計パッケージソフト Stata (ステータ)について簡単に触れます。


Web上の参考資料


おもなファイル形式

  • .do コマンドを保存

    • Windows では、実行したい行の一部(1文字以上)を選択して「Ctrl」+「D」を押すと実行

    • R の場合、実行する行の _全体_ を選択して「Ctrl」+「R」なので、似てはいるが若干異なる

    • 逆に、(.do ファイルではなく)コンソールの「コマンド」部分で「Ctrl」+「R」を押すと、前に実行したコマンドを表示させることができる。コマンドの一部を書き換えてデータを見たり試行錯誤するときに便利。

  • .log コマンドの実行結果を保存

    • オーソドックスなテキストエディタで閲覧可

  • .dta データを保存

    • Python や R で開くことも可


コマンド例

基本

文字の出力

display "hello world"

コメントアウト

// 行末までコメントアウト
* 行末までコメントアウト
/* 囲まれた部分がコメントアウト */

註)「/* foo /* bar */ buz */」とした場合、buz もコメントアウトされる(すなわち、コメントアウトの入れ子がうまいこと評価される)。この点はC言語や R (foo と bar しかコメントアウトされない)と異なる。

四則演算

display 1 + 3 // display コマンドで結果を表示
di sqrt(2) * (1/2) // display コマンドは di と略すことも可

ヘルプ。関数などの意味を調べる。たとえば、help help という自己言及的なコマンドを打つと「Display help in Stata」と表示される。

help display

ディレクトリの変更 (change directory)

cd "c://dir"

ログを取る。replace で上書き(なければ新規作成)。

log using "log_filename.log", replace
// 計算など
log close

時刻を表示する

display "$S_TIME" // hh:mm:ss

処理時間を測定する

timer clear
timer on 1 // 1-100
// 計算(その1)
timer off 1
timer on 2
// 計算(その2)
timer off 3
timer list


データIO

データ (.dta) の読み込み。オプションとして clear を加えることで、この前に読み込んでいたデータセットを Stata のメモリから消去する。なお、Stata 16 からはメモリに複数のデータセットをロードできるように進化している。拡張子 .dta は書かなくてもよい。

use "dataset_name", clear

データの保存

save "dataset_modified", replace

CSVファイルからデータを入力する場合。データに日本語が含まれていると文字化けすることがあるので、文字コードを指定する。1行目に列名が入力されている場合は varnames(1)

import delimited using filename.csv
import delimited using filename.csv, encoding(shift_jis) varnames(1)
// ラベル等の付与
label data "Dataset name"
rename var1 price // 変数名の変更
label variable price "purchase price in 1,000 JPY" // ラベル
label define sex_label 0 "male" 1 "female" // 値ラベル
label values sex sex_label

Excelに出力

export excel filename.xlsx, firstrow(varlabels) replace
export excel var1 var2 using filename.xlsx, firstrow(varlabels) replace // var1, var2 のみ

データを手入力する場合

clear
input y x1 x2, // y, x1, x2 という3変数のデータセット
0 -1 6
0 3 10
1 2 3
1 5 -2
end


データのハンドリング

特定の行を表示する

list in 2 // 2行目だけ
list in 1/5 // 1行目から5行目
list var1 var2 in 1/5 // 特定の変数のみ

分析に使用しない変数をデータセットから削除する。このあたり、Stata の便利でもあり、(R などオーソドックスなソフトに慣れ親しんだユーザにとっては)むず痒くもあるところ。R で例えれば、常に attach(dataset) での作業を強いられる状況。

drop var_name
drop var1 var2 // 複数 drop
drop var3 var4 var5 var6
drop var3 - var6 // 真上と同じ

註)ハイフン「-」を使って連続する変数(列)を指定することができる。drop/keep に限らず global (説明変数の集合を一変数名で表す等)でも有用。

データセットに変数を追加する(新しく列を作る)。大雑把に言えば、ある変数の i 番目の case について計算する際に、他の変数(や、データセット外の定数など)の i 番目の case のみに依存する場合は generate を使い、i 番目以外の case にも依存する場合(max, min, mean, sum, ...)は egen を使う。

generate var3 = var1 + var2
generate var4 = (var1 ~= 0)
generate var5 = _n // 1, 2, 3, ..., N
egen var6 = mean(var1) // すべての case に同一の値が代入される

註)generate x2 = sum(x1) だと running sum (running total) になる。Rでいう sum (overall sum) は egen x2 = sum(x1) または egen x2 = total(x1) で計算できる。


その他

結果を表示させない

quietly summarize dataset // qui でも可
display r(mean) // quietly しても計算はしているので、計算結果を取り出して表示できる

エラーが出ると実行が止まるので、capture (cap) をつけて続きのコマンドを実行させることもある。

capture cd "c://user1/dir" // 複数人で .do を共有する場合の使い方の例
capture cd "c://user2/dir" // user1 の環境で実行すると出る(であろう)エラーが無視される

論理演算("&": AND, "|": OR, "!" or "~": NOT)。1: TRUE, 0: FALSE

di 1 // TRUE
di !1 // FALSE
di 1 & 0 // F
di 0 & 0 | 1 // (F AND F) OR T --> T
di 1 == 0 // F
di 1 != 0 // T. "!=" または "~=" は「等しくない」の意

コマンド実行時点の日付を保存して利用。global の便利な使い方の一例

global today_ymd %tdCYND daily("$S_DATE", "DMY") // YYYYMMDD 形式
display $today_ymd
// 作図
graph export `: di $today_ymd'_fig.png, replace
graph export `: di %tdCYND daily("$S_DATE", "DMY")'_fig.png, replace

for文(forvalues)

sysuse auto, clear // サンプルデータ
forvalues i = 1/5 { // tab var, generate(v) とほぼ同様
generate rep78_`i' = (rep78 == `i')
}
list rep78_1 - rep78_5 in 1/10 // 確認

for文(foreach)

sysuse auto, clear // サンプルデータ
foreach i in price mpg {
generate `i'_squared = `i'^2
}
list price price_squared mpg mpg_squared in 1/10 // 確認


分析

簡単な記述統計

サンプルデータ(1978年に米国で販売された車両のモデルごとの価格・燃費・重量等データ)を用いる

sysuse auto, clear // Stata インストール時についてくるサンプルデータを読み込む
describe // データセットの概要(サンプルサイズ、変数の数、変数とラベル)
summarize // 要約統計量(観測数、平均、標準偏差、最小、最大)
summarize price mpg // 一部の変数のみ
summarize price, detail // 分位点(含、中央値)や歪度・尖度もレポート
histogram price, frequency // ヒストグラム("frequency" で縦軸が度数になる)
table foreign // 度数分布表
count if price >= 10000 // 条件を満たす case の数

2変数間の関係を見る

twoway scatter price mpg // 散布図
graph export price_mpg_001.png, replace // グラフを保存
by foreign: summarize price mpg // "foreign" (国産 or 輸入)の水準ごと
table foreign, contents(n price mean price sd price median price)
tabulate rep78 foreign // 分割表 (contingency table)
correlate // 相関係数行列


t検定

sysuse auto, clear
ttest price == 5000 // one-sample
ttest price, by(foreign) // two-sample


線形回帰(最小二乗法)

sysuse auto, clear
regress price mpg // 単回帰
regress price mpg, robust // ロバスト標準誤差
regress price mpg if price <= 5000 // 分析対象をサブサンプルに絞る
display e(r2) // 推定結果の一部だけを取り出して見ることも可(cf. command: ereturn list)
display _b[mpg] // 推定値
predict price_hat, xb // 当てはめ値
regress price mpg weight foreign // 重回帰
test mpg weight // joint hypothesis のF検定 (Null: beta(mpg)=beta(weight)=0)

註)このあたりもRユーザにはむず痒いところ。predicttest などのコマンドは直前に推定したモデルのパラメータを使用する。

残差 vs. 当てはめ値 の散布図

predict price_hat, xb // 当てはめ値 (fitted value)
predict ols_resid, residuals // 残差
twoway scatter ols_resid price_hat, title("Resid. vs. Fitted (linear model)")
rvfplot // 実はこのコマンドだけで作図できる

註)コマンドが2行以上にわたる場合は、行末を「///」とすると便利(「1行目 /* \n */ 2行目」と書くより簡単)。

行列・ベクトル演算による回帰パラメータの最小二乗推定の例

clear
matrix input y = (2 \ 3 \ 4 \ 2 \ 1) // 被説明変数ベクトル。「\」は「¥」の半角
matrix input X = (1, 2, 2 \ 1, 1, 4 \ 1, 2, 1 \ 1, 3, 2 \ 1, 2, 3) // 説明変数行列(1列目は切片項)
matrix beta = inv(X' * X) * X' * y // β = (X'X)^{-1}X'y
matrix list beta // 結果を表示


ロジット回帰(最尤法)

sysuse auto, clear
egen mean_price = mean(price) // 平均価格の列を追加
generate price_binary = (price > mean_price) // 二値変数を生成
logit price_binary mpg weight
margins, dydx(mpg weight) // 限界効用


分析結果の出力

パッケージ「outreg2」が便利。ExcelやWordなどに出力できる。出力されたファイルを開こうとすると「"*.xls"のファイル形式と拡張子が一致しません。...」というエラーが出るのはなぜだろう。「seeout」をクリックして見る分には、エラーは特に表示されない。

ssc install outreg2 // すでにインストールされている場合は不要
regress price mpg
outreg2 using estimates_table.xls, replace ctitle(Model 1)
regress price mpg, robust
outreg2 using estimates_table.xls, append ctitle(Robust S.E.) // 2本目以降は append
regress price mpg weight foreign
outreg2 using estimates_table.xls, append ctitle(X: 3 vars)
// +ロジット回帰
capture drop mean_price price_binary // 上記ブロックを既に実行していた場合のため
egen mean_price = mean(price)
generate price_binary = (price > mean_price)
logit price_binary mpg weight
outreg2 using estimates_table.xls, append ctitle(Logit)


その他

  • 変数の概要(型,uniqueな要素数,要素例,NA数):codebook

  • 変数の検査(数値のヒストグラム,整数・ゼロ値・NA数):inspect

  • 出力が省略されないように「--more--」表示を off にする:set more off

  • do ファイルの中で別の .do ファイルを呼び出して実行する:do subfile001.do.実行はせずに中身を見る:type subfile001.do

  • グラフ scheme の変更:set scheme s1color, permanently

  • コマンド about で、session information (ステータの種類・バージョン・シリアルナンバーなど)が確認できます。が、そのほとんどの情報は起動時に表示されているため、利用機会はあまりなさそう。

  • 固定効果といえば xtreg という気がするが,非推奨との意見も。 cf. Stataの固定効果のコマンド (reghdfe), suketani’s diary, 2019-11-21.

  • IC → SE など、すでにインストールされているのとは違う種類の Stata をインストールする際には、(古い方の Stata をアンインストールしたとしても)ライセンス認証がうまくいかない場合があります。その際は、C:\Program Files (x86)\Stata* などにあるライセンスファイル (STATA.LIC) を別の場所に移動させると、新しい方の認証ステップに問題なく移行できる場合があります。 ※公式による対処法ではないので、自己責任で。。。