Development Micro-econometrics Study Group: Code Notes

日本語で経済学分析に有用なコードの備忘録を作成しています。We provide explanations of useful codes in Japanese for data cleaning, analysis, visualization like memorandum. Our software focuses on STATA, R, Python.

Stataでデータセット結合:あなたが探しているのは「merge m:m」?それとも「joinby」?

二つのデータセットを、ある変数をkeyとして横方向で結合したい場合、多いと思います。
このkeyがそれぞれのデータセットでunique(被りがない)なら、普段通り、merge 1:1を使えば問題ありません。 また、一方のデータセットはkeyとなる変数がuniqueになっていて、もう一方のデータセットではkey変数に被りがある場合(例えば、村レベルのデータセットに、家計レベルのデータセットを村IDで結合)、merge 1:m, merge m:1、もしくはkey変数に被りがあるデータセットの形を変えてmerge 1:1してしまう、どの方法でもうまくいくかと思います。

問題が発生するのが、二つのデータセット両方でkey変数がuniqueになっていない時。 例えば、村IDが振られている家計レベルのデータについて、同じ村の中で家計を総当たりで結合したいとします。 その時、データセットの形が各村について家計がlong型ではいっているものを、そのまま結合に使いたいとすると、選択肢となるコマンドは merge m:mjoinby です(データセットの形を変えて、merge 1:1 などに落とし込む方法もありますが)。 この二つのコマンド、挙動が全く異なります。 この(総当たりでマッチしたい)時、正解は joinby です。 merge m:m では求めている結果を返してくれません。

実際にどんな感じになるか見てみましょう。 例えば、ここでは次のような仮想データを考えます。

data1

id_village household
1 A
1 B
2 A
2 B

data2

id_village household_2
1 A
1 B
2 A
2 B

この二つのデータをid_villageで横方向で結合すると、

merge m:m id_village using data2

は次のデータを返します:

id_village household household_2
1 A A
1 B B
2 A A
2 B B

つまり、key変数の値がuniqueでない時、それぞれのkey変数の値について、上からマッチした順に上から結合していくというものになります(なので、元のデータでの行の順番によって結果が異なります)。 ここから分かるように、総当たりでは結合してくれません。

一方、joinby だと、

joinby id_village using data2

とすると、次のデータを返します:

id_village household household_2
1 A A
1 A B
1 B B
1 B A
2 A B
2 A A
2 B B
2 B A

同じkey変数の値内で、householdhousehould_2 が総当たりで結合されています。 ただし、merge が結合できた行・できなかった行を新たな変数 (_merge) で明示してくれる一方、joinby はデフォルトではそうした変数を新たに作りません。 また、data1, data2 どちらかにしかない id_village の観測値は、マッチされないため削除されてしまうことにも注意です( merge では「マッチされない」ということが明示されます)。

ここからも分かる通り、merge m:m は求めているものと異なる挙動をしている場合が多く、かつ結果が元のデータの行の順番に依存している、危険なコマンドなため、できるだけ使わない方が良いそうです。

参考:Statalist: Merge m:m vs joinby