空飛ぶチンアナゴの統計解析日記

統計解析を嗜むチンアナゴのメモ帳です

STATAの関数

STATAの関数の定義についてようやく理解できたのでまとめてみる。
もちろん、公式のドキュメントをみれば一発なんけど、チートシートがないのでどこから手をつけていいのかマジでわからんかったのよね。

関数を定義する

STATAで「Hello World!」を表示させる関数を書くと

capture program drop hello_world
program define hello_world
    display "Hello World!"
end

のようになる。
最初の

capture program drop hello_world

は一種のお約束のようなものである。
重複した名前の関数が既にあった場合、後から同じ名前の関数を定義できないことから、事前にこれから定義する関数と同じ名前の関数を消去している。
もちろん、同名の関数が事前にない場合も多いので、冒頭に「capture*1」とつけて同名の関数が事前になくても次の処理に進むようにしている。
次の

program define hello_world

pythonで言う所の

def hello_world():

の行に相当する。
ただし、pythonのようにインテンドでコードブロックの区切りを決めているわけではないので、関数のおしまいには必ず、

end

と一文加わることになる。

display "Hello World!"

については特に"Hello World!"と表示するというだけなので細かい説明は省略。
関数内でやらせたいことは

program define hello_world

end

の間に記述してあげればOKだ。

パラメータの設定

基本的な話

例えば、"Hello, ◯◯!"と任意の人の名前を表示したい場合を考えてみよう。
STATAのパラメータはprogramを定義した時に自動的に1番から定義してくれる*2
なので、

capture program drop hello_name
program define hello_name
    display "Hello, `1'!"
end

と書くことができる。
`1'の所には最初の引数が入力されるので

hello_name "David"

とするだけで勝手に"Hello, David!"と出力される。

そうはいっても数字では分かりにくい

とはいえ何個もパラメータがある場合、数字だけではどの数字が何のパラメータなのかは非常に分かりづらい。
で、あればパラメータに名前をつけてしまえばいい。
するとさっきのプログラムは

capture program drop hello_name
program define hello_name
    args name

    display "Hello, `name'!"
end

と改変することができる。
argsで最初のパラメータに「name」と名前をつけてあげることで、`1'は`name'としても読み込むことができるわけだ。

STATAの標準的なプログラムのように操作したい

STATAの標準的なプログラムの構文は

[byvarlist:]command[varlist][=exp][ifexp][inrange][weight][,options]

であるわけだが*3、先ほどのようにargsでパラメータを決めた場合、このような普通のsyntaxは使えない。
ではどのようにするのかというとsyntaxで設定する。

設定例

実例としてロジスティック回帰分析をこなって推定結果を保存するプログラムを書きたい。
1. ifで条件を絞る場合とそうでない場合
2. ifで絞るものを変える場合
この二つに対応できることが条件となる。
で、ついでに事後推定の結果も適当な名前で保存したい。
このようなプログラムは

capture program drop logistic_and_store
program define logistic_and_store
    syntax anything [if], STOre(string)

    logistic `anything' `if'
    estimates store `store'
end

と書くことができる。
syntaxの所は今回のif節のようにあってもなくてもいい場合は[]で囲うようにする。
また、オプションについては最低限必要な所を大文字で記載することにより、実際にコードを実行する際に大文字の所を小文字で記載することでコードを省略することができる。この際注意してほしいのは実際にオプションとして使用する変数はコード内ではすべて小文字で記載する必要があるということだ。ちなみに今回のstoreは変数名なので()内にデータの属性としてstringを指定している。
実際に

sysuse nlsw88.dta
* 単純にサンプルのデータセットを呼び出している

capture program drop logistic_and_store
program define logistic_and_store
    syntax anything [if], STOre(string)

    logistic `anything' `if'
    estimates store `store'
end

logistic_and_store never_married race age, sto(test)

でロジスティック回帰分析の結果が表示され、事後推定の結果が_est_testとして記録されているはずだ。
結構、設定が色々細かくできるので
https://www.stata.com/manuals13/psyntax.pdf
を読んでほしい。
使いこなせるとすごく便利。

まとめ

STATAのprogrammingにはargを指定する場合とsyntaxをしてする方法の2種類がある。
どちらの方法も良し悪しがあるので適時使い分けるといいだろう。

*1:https://www.stata.com/manuals/pcapture.pdf

*2:本当は0もあるが特殊なものなので、今回の説明からは省略。STATAは基本的に1が起点とだけ覚えてください

*3:https://www.stata.com/manuals/u11.pdf#u11Languagesyntax