ループ(foreach と forvalues)

時には、作業中のあるステップ(データ変換の一部、ある分析)を、多少の変化をつけて繰り返し実行しなければならないことがあります。 例えば、一連の結果に対するこれらの変数の影響を調べるために、与えられた独立変数のセットでいくつかの回帰分析を行いたい場合を想像してみてください。 (複数の結果を完全に同時に分析するには、おそらく手続き sureg を使用することができますが、ここではそうしないと仮定しましょう)。 もちろん、最初のコマンドを書き、コマンドラインをコピーし、従属変数の名前を交換する、などということもできるかもしれません。

ループを定義する方法は2つあります。 foreachは列挙される要素のリストを指し、forvaluesは数値の範囲を指し、これらの数値のそれぞれに対して続くものが実行されるという効果である。

foreachによるループ

このエントリーの最初に書いた例を使って説明しましょう。 所得、家族構成、性別が様々な従属変数に与える影響を調査したいとします(もちろん、この例は非常に単純化されています)。

foreach x in excl depr satisfactory happy activ {
regress `x’ income i.famstat gender
}

これは変数 “excl”, “depr” などの回帰分析を独立変数のセットで実行するものです。 foreach x」の後に続くリストの変数名は、regressionで始まる行のxを順次置き換えていく。 xの代わりに他の文字や文字列を使ってもよい。

二つのことに注意することだ。 まず、中括弧とその配置。 リスト上の要素のリストには、開始波括弧が続いています(同じ行に!)。 実行されるコマンドは次の行に続きます。実際には、いくつかのコマンドが続き、Stataがリスト上の要素のリストを処理している間、すべてが繰り返されます。

次に、中括弧の中で、x (またはその代わりに使用するもの) は、左側がグレイヴアクセント、右側がアポストロフィで囲まれます。 (プログラマはこれをbackquote, backtick, backgraveと呼ぶそうです。) なお、Stataハンドブック(およびStataの他の資料)では、グレイヴアクセントを「single left quote」という名前で呼んでいますが、少なくともドイツのQUWERTZキーボードでは(そしてシングルレフトクォートにカンマを使っているドイツのユーザーにとっては)グレイヴアクセント(フランス語ではgravis、アクセント・グレイヴ)と言った方が正しいような気がします。

foreach inに続く項目のリストは変数のリストである必要はなく、要素のリストであれば何でもよいのです。 次の例を見てください。これはこれらの要素が数字の羅列である特別な場合です。

forvaluesによるループ

時には、何か、例えば変数のリストが連続した数字のリストに関連しているという状況があります。 これは私の最近の仕事での実例です(ここではかなり厄介な変数名が簡略化されています)。 調査データでは、回答者が住んでいる世帯のメンバーに関する情報を見つけることがよくあります。 この場合、世帯員の現在の状況に関する情報は、変数「hhms_2」から「hhms_10」に格納されています(最初の世帯員は、回答者自身です!)。 そこで、世帯員ごとに、雇用の有無を示すダミー変数(雇用の種類を1〜4で表す)を作りたいと考えた。

forvalues i= 2/10 {
gen emp’i’ = inrange(hhms_`i’,1,4)
}

この例では2~10の数字をiというインデックスで参照していますが、iの代わりに任意の文字または文字列(例えば「番号」など)や、数字も使用できるかもしれません。 ループ内では、インデックスは、左側がグレイヴアクセント(またはグレイヴィス)、右側がアポストロフィで囲まれる。 注意 最初のgraveアクセント、すなわち「emp」に続くものは、私が遭遇したいくつかの技術的な問題のために、ここではアポストロフィのように見えますが、実際の生活では、常にgraveアクセントであるべきです。

コメントを残す

メールアドレスが公開されることはありません。