*adoファイルとdo ファイル
- adoファイル
- コマンドを新たに作成することができる。
- たとえば,regコマンドに対しては,regress.adoファイルが存在する。
- adoファイルを作成
簡単な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