*adoファイルとdo ファイル

  • adoファイル
    • コマンドを新たに作成することができる。
    • たとえば,regコマンドに対しては,regress.adoファイルが存在する。
  • adoファイルを作成
    • do fileエディタ上で作成できる。メモ帳でもOK。
      • program…から始まりendで終わる。
    • adoフォルダに保存する。
      • adoフォルダの位置を確認するには,Stata上でsysdirコマンド
      • Win, Linux, OSXのいずれでもディレクトリの位置を確認できます。

簡単なadoファイルの作成例

現在時刻を表示する
規模の大きな計算をさせる場合に,作業開始時間と終了時間を知りたいときってありますよね? 
Stataを開く。doファイルエディタを開いて以下の3行をタイプ。それを,adoフォルダ下にtime.adoとして保存する。
これは前にブログに書いたかもしれない。

program time
	display "現在時間:  $S_TIME $S_DATE"
end

Stata上でtimeとタイプしてみる。

より複雑な例

 変数の基本統計量を出すときに,既存のtabstatコマンドを用いることがある。ただし,デフォルトでは平均値しか返してこない。より多くの統計量を出力させるには,statオプションを付ける必要があるが,毎回タイプするのが面倒。そんな時は,

program tabstat2
	tabstat `1', stat(n mean sd min p25 p50 p75 max)
end

 ado, doファイルのコマンド名の後に指定する文字列や値(引数)は,`1’, `2’, `3’としてado, doファイル内で参照される。上の例では,第1番目の引数をlocal変数`1'に格納している。そのため,
tabstat2 変数名
と入力すると,一番目の引数が変数名が local変数`1’に格納され,

tabstat 変数名, stat(n mean sd min p25 p50 p75 max)

とタイプしたことと同じことになる。simulation.adoでは,firm-fixed effectの程度と,time-fixed effectの程度,timeの長さの,3つの引数を指定する必要がある。

より!より複雑な例

上の例では,基本統計量を算出する変数は一つだけ。またifなどの条件文を付けることができない。

program tabstat2
	syntax varlist [in] [if]
	marksample touse
	tabstat `varlist' if `touse', stat(n mean sd min p25 p50 p75 max)
end

 program中に,syntax文を入れる事で,tabstat2プログラムのシンタックスを決めることができる。コマンドごとにif,inが使えるか,また利用可能なオプションは異なる。コマンドによってどのようなオプションが使用可能かをsyntax文によって指定する。
この例では,in, ifによる条件付けも使えるようにしている。

marksample touse

により,in, ifにより指定された観測値には1の値が付く変数が作成される。(なぜか)呼び出す際はlocal変数として呼び出す。それを元にして,3 行目でtabstatを行う。
 なお,この方法はcluster.ado内で使われています。

adoファイルの更新

adoファイルを更新するには,adoファイル自体を上書き保存するのみではなく,Stataにadoファイルを更新したことを認知させなければなりません。
方法としては,

program drop _all

とタイプする必要があります。

その他,adoファイル中で用いられているコマンドに関する説明とado,doファイルを組むうえでの注意点など

confirm string variable 変数名
ある変数が,文字列であるか,数値であるかを判断する。文字列でなければエラーがでる。
captureコマンドを用いると,エラーが出た場合でも次に進むことができる。

以下のコマンドを実行すると,

sysuse auto
capture confirm string variable price
if !_rc{
	dis "string"
}
else{
	dis "numeric"
}

priceという変数がstringか否かを判断して,変数の型を返す。

#delimit ;

文末を指定する。初期設定では改行箇所までが1文だが,上の設定をすることで,”;”までが1文となる。特に長いコマンドを打つ時には,この設定をすることでコードの可読性を高めることができる。

インデントについて

While, foreach, forvalueなどの繰り返し処理がある場合は,{}で繰り返しを行なう範囲を指定する。そのとき,{}の範囲内をインデント(Tabで一段落下げる)を行なう。Petersenのdo,adoファイルはきちんと行われていない。汚い。
以下の例の方が(おそらく)正しい。

foreach n in mpg length turn{
	regress price `n’
}

local変数とglobal変数

 これらを用いることによって,文字列や数値をメモリ内に保存できる。ただし,どれだけの期間保存されるかが異なる。

  • global変数は,Stataが起動している間,永続的にメモリ内に保存
  • local変数は,現在実行しているdo, adoファイル内でのみメモリ内に保存される
    • 基本的にはlocal変数を用いる

local 変数への代入と呼び出し

local変数は

local i = 1
local var_name  “length”

で代入,`’でくくることで呼び出すことができる。

dis `i’
reg price “`var_name’”

global変数への代入と呼び出し

global変数は,

global var_list  ”mpg length turn”

などの形式でメモリに代入,呼び出す際は,変数名の前に$をつける

regress price $var_list