ああ、グローバルの素晴らしい匂い...
この投稿のすべての回答はRの例を示しており、OPはいくつかのStataの例も望んでいました。だから私はこれらとチャイムを入れましょう。
Rとは異なり、Stataはローカルマクロ(local
コマンドで作成したマクロ)の局所性を処理するため、「これはグローバルzですか、それとも返されるローカルzですか?」という問題があります。決して出てこない。(まあ...ローカリティが強制されていない場合、Rの人はどのようにコードを書くことができますか?)しかし、Stataには別の癖があります。つまり、存在しないローカルまたはグローバルマクロは空の文字列として評価されます。望ましい場合と望ましくない場合があります。
私はいくつかの主な理由でグローバルが使用されているのを見てきました:
グローバルは、次のように変数リストのショートカットとしてよく使用されます。
sysuse auto, clear
regress price $myvars
このような構成の主な用途は、複数の仕様を試すときに、対話型の入力とコードのdoファイルへの格納を切り替える人のためだと思います。等分散性標準誤差、不均一分散性標準誤差、および中央値回帰を使用して回帰を試みたとします。
regress price mpg foreign
regress price mpg foreign, robust
qreg price mpg foreign
そして、これらの回帰を別の変数セットで実行し、次にさらに別の変数セットで実行し、最後にこれをあきらめて、次のようなdoファイルとして設定しますmyreg.do
。
regress price $myvars
regress price $myvars, robust
qreg price $myvars
exit
グローバルマクロの適切な設定を伴う必要があります。ここまでは順調ですね; スニペット
global myvars mpg foreign
do myreg
望ましい結果が得られます。ここで、非常に優れた回帰結果を生成すると主張する有名なdo-fileを共同編集者に電子メールで送信し、入力するように指示したとします。
do myreg
彼らの協力者は何を見ますか?mpg
最良の場合、 Stataの新しいインスタンスを開始したかどうかの平均と中央値(結合の失敗:myreg.do
空でない変数リストでこれを実行するつもりであるとは本当に知りませんでした)。しかし、共同作業者が作業中に何かを持っていて、グローバルにmyvars
定義された(名前の衝突)...人がいたら、それは惨事になるでしょう。
グローバルは、次のようにディレクトリ名またはファイル名に使用されます。
use $mydir\data1, clear
神は何がロードされるかを知っているだけです。ただし、大規模なプロジェクトでは便利です。global mydir
マスターdoファイルのどこかに定義したいと思うでしょう。
global mydir `c(pwd)'
グローバルは、コマンド全体のように、予測できないがらくたを格納するために使用できます。
capture $RunThis
神は何が実行されるかを知っているだけです。そうでないことを願いましょう! format c:\
。RunThis
これは暗黙的な強い結合の最悪のケースですが、意味のあるものが含まれるかどうかさえわからないため、そのcapture
前にを置き、ゼロ以外の戻りコードを処理する準備をします_rc
。(ただし、以下の私の例を参照してください。)
Stata自身のグローバルの使用は、タイプIの過誤の確率/信頼水準のように、神の設定のためです。グローバル$S_level
は常に定義されます(もちろん、技術的には実行可能ですが、このグローバルを再定義するには、完全に馬鹿である必要があります)。ただし、これはほとんどの場合、バージョン5以下のコード(大まかに)のレガシー問題です。これは、脆弱性の低いシステム定数から同じ情報を取得できるためです。
set level 90
display $S_level
display c(level)
ありがたいことに、グローバルはStataで非常に明示的であるため、デバッグと削除が簡単です。上記の状況のいくつか、そして確かに最初の状況では、do-file内でローカルと見なされるdo-fileにパラメーターを渡したいと思うでしょう`0'
。ファイルでグローバルを使用する代わりに、myreg.do
おそらく次のようにコーディングします
unab varlist : `0'
regress price `varlist'
regress price `varlist', robust
qreg price `varlist'
exit
これunab
は保護の要素として機能します。入力が正当なvarlistでない場合、プログラムはエラーメッセージで停止します。
私が見た中で最悪のケースでは、グローバルは定義された後に一度だけ使用されました。
グローバルを使用したい場合があります。そうしないと、他のすべてのdoファイルまたはプログラムに血まみれのことを渡さなければならないからです。グローバル変数がかなり避けられないことがわかった1つの例は、最尤推定量をコーディングすることでした。この場合、方程式とパラメーターの数が事前にわかりませんでした。Stataは、(ユーザー提供の)尤度エバリュエーターには特定の方程式があると主張しています。そのため、方程式をグローバルに蓄積してから、Stataが解析する必要のある構文の説明でグローバルを使用してエバリュエーターを呼び出す必要がありました。
args lf $parameters
lf
目的関数(対数尤度)はどこにありましたか。denormix
通常の混合パッケージ( )と確認的因子分析パッケージ( )で、これに少なくとも2回遭遇しましたconfa
。findit
もちろん、両方ともできます。