日誌

たくさんの変数に同じ処理を繰り返したいとき

たとえば,100個の変数について性別とのクロス表をいっぺんに出したいという
状況があるとします。以下,Stata12.0で説明します。

性別の変数sexと変数a1 a2 a3 ・・・ a100とあったとき,
クロス表を書くコマンドは,

tab sex a1
tab sex a2
tab sex a3



tab sex a100

と100行にわたってしまいます。でも100行も書いてられないですよね。

実はこれは1行で書くことができます。

for varlist a1-a100: tab sex X

これは,for varlistの後におかれた一連の変数について,その後のXに代入して処理を
繰り返してくれるコマンドです。

a1-a100というのは,連番を意味していて,-(ハイフン)でつながれた間の変数
もすべて含めてくれるので,100個も変数を並べなくて大丈夫です。
もし並べたい場合は,a1 a2 a3 ・・・ a100とスペースを入れて並べます。

このようにfor~ というコマンドは便利なのですが,最近はout of dateだ
そうで,ヘルプにも詳しく書かれておりません。
もしかしたらいずれ使えなくなってしまうかもしれません。


それでは,今後を見据えて最新のコマンドではどう書くようになっているか
というと,最低でも3行必要なように変わっているようです。

foreach x of varlist a1-a100 {
    tab sex `x'
}

または,

foreach x in a1-a100 {
    tab sex `x'
}

です。

これは,foreachの後に置かれた文字や単語(なんでもよい)に一連の変数を
代入してくれるという意味です。for~との違いは,代入先が柔軟になったと
いうところでしょうか。

気をつけなければいけないのは,{} の位置は必ず上記の通りに
決まっていること,また` ' という初めての人には見慣れない記号がある
ことです。これらは,

a left quote ( ` )
a right quote ( ' )

という名前のようで,自分の環境だと,半角の状態でshift押しながら@と7キーを押す
と出てきました。

ここでやっていることは,英語ではloopingというみたいです。
検索すると大体この言葉と一緒にひっかかってきます。
これらの動きが分かってくると,一気にStataへの親しみがわいてきます。


(2015/04/06 追記)
数値のみを繰り返したい時
これは,forvaluesを使います。下記の記事参照。
線形回帰のメモ (いわゆる単回帰分析,重回帰分析)
 の,(5)グループごとの回帰(層別)で実行例あり。

(2015/05/07 追記)
また応用編として↓も
連続して変わる数値の繰り返し処理を入れ子で実行する(double loop)


変更履歴
2013/11/17 度数分布表→クロス表に修正
2015/04/06 forvaluesの例追記
2015/05/07 リンク追記,foreachのコマンド例に,クロス表の例として一貫するようsexを追記