データ分析において、同じ処理を複数回繰り返したいことがよくあります。Stataには効率的にループ処理を行うための`forval`と`foreach`という2つの便利なコマンドがあります。今回は初心者向けに、この2つのループコマンドの基本的な使い方を解説します。
## コード例とその実行結果
まずは今回紹介する全体のコードを見てみましょう。このコードはそのままStataにコピー&ペーストして実行できます。
```stata
* 例 1
forval i = 1/5{
di `i'
}
* 例 2
clear all
sysuse auto
sum price
sum weight
sum length
foreach var of varlist price weight length{
sum `var'
}
```
**実行結果:**
例 1の結果:
```
1
2
3
4
5
```
例 2の結果:
```
(各変数の詳細な記述統計が表示されます)
Variable | Obs Mean Std. dev. Min Max
---------+----------------------------------------------------------
price | 74 6165.257 2949.496 3291 15906
Variable | Obs Mean Std. dev. Min Max
---------+----------------------------------------------------------
weight | 74 3019.459 777.1936 1760 4840
Variable | Obs Mean Std. dev. Min Max
---------+----------------------------------------------------------
length | 74 187.9324 22.26634 142 233
(foreachによる繰り返し処理で同じ結果が3回表示されます)
```
## 例 1:forvalコマンドの詳細解説
```stata
forval i = 1/5{
di `i'
}
```
**forvalコマンドの基本構造**
`forval`は数値の範囲を指定してループを実行するコマンドです。構文は以下の通りです:
`forval ローカルマクロ名 = 開始値/終了値 { 実行したいコマンド }`
このコードでは:
- `i`がローカルマクロ名(カウンター変数)
- `1/5`で1から5までの範囲を指定
- `di` i'`で現在のiの値を表示(`di`はdisplayコマンドの省略形)
**ローカルマクロについて**
``i'`の部分に注目してください。Stataでは、ローカルマクロの値を参照する際にバッククォート(`)とアポストロフィ(')で囲みます。これにより、Stataは`i`に格納されている値(1, 2, 3, 4, 5)を順番に取り出して使用します。
**forvalを使う場面**
- 数値の範囲でループしたい場合
- 回数を指定して処理を繰り返したい場合
- インデックス番号が必要な場合
## 例 2:foreachコマンドの詳細解説
```stata
clear all
sysuse auto
sum price
sum weight
sum length
foreach var of varlist price weight length{
sum `var'
}
```
**データの準備**
まず`clear all`でメモリをクリアし、`sysuse auto`でStataに標準で含まれている自動車データセットを読み込みます。このデータセットには価格(price)、重量(weight)、長さ(length)などの変数が含まれています。
**手動での処理(比較用)**
```stata
sum price
sum weight
sum length
```
これらの3行は、各変数に対して個別に記述統計(`sum`コマンド)を実行しています。同じような処理を3回繰り返していることがわかります。
**foreachによる効率的な処理**
```stata
foreach var of varlist price weight length{
sum `var'
}
```
**foreachコマンドの基本構造**
`foreach`は変数のリストや値のリストに対してループを実行するコマンドです。`of varlist`を使った構文は:
`foreach ローカルマクロ名 of varlist 変数名のリスト { 実行したいコマンド }`
このコードでは:
- `var`がローカルマクロ名(現在処理中の変数名を格納)
- `of varlist price weight length`で処理したい変数のリストを指定
- `sum` var'`で現在の変数に対して記述統計を実行
**処理の流れ**
1回目:`var`に"price"が格納され、`sum price`が実行される 2回目:`var`に"weight"が格納され、`sum weight`が実行される 3回目:`var`に"length"が格納され、`sum length`が実行される
**foreachを使う場面**
- 複数の変数に対して同じ処理を行いたい場合
- 変数名のリストが決まっている場合
- データセット内の変数を効率的に処理したい場合
慣れてきたら、より複雑な条件分岐と組み合わせたり、ネストしたループ(ループの中にループ)なども試してみてください。Stataでのデータ分析がより効率的になるはずです。