suketani’s diary

個人的メモ用、どこも代表していない

Stataでマージに不等式を用いる

タイトル何言ってるのかよくわからんと思うのだけど案外大事。
これは、少し特殊なmergeコマンド、nearmrgコマンドについて解説します。


次のようなマージ作業をする場合に便利なのです:

あるデータセット (masterとする) のt年m月のデータに対して、別のデータ (usingとする) のt年m月以前の直近のデータをくっつけたいケースを考える。
これはたとえば、企業の財務データのデータセット (master) に、企業のガバナンス機構に関連するデータ (using) をマージすることを考えよう。

企業のガバナンス機構は、次の年の企業行動やパフォーマンスに影響を与えると考えられます。
であるならば、企業の財務データに対して、それ以前の期間で直近のガバナンスデータをくっつける必要があります。


つまり、任意のt年m月の財務データに対して、ガバナンスデータは同じ年のn月、ただしnであるか、
前年度 (t-1) のデータをマージする必要があります。


しかし、通常のmergeコマンド (下記リンク;PDF注意) だと、マッチングさせる変数が一致しているものにデータをくっつけることしかできない。
https://www.stata.com/manuals13/dmerge.pdf


ではなんとか上の作業を簡単にできないだろうか?
あるんですねえ、面倒な作業をやってくれるコマンドが。

それがnearmrgコマンドです。
参考にするリンクはこれです。

まず、設定は上と同様に:
あるデータセット (Aとする) のt年m月のデータに対して、別のデータ (Bとする) のt年m月以前の直近のデータをくっつけたいケースを考えます。
ここで、時間の変数の名前をtime、企業を識別するIDをidとしているとする。なお、timeはSTATAの時間の変数*1として読み込んでることを前提にします。

このときに、time時点の企業idのデータに対して、Bに収録されているtime時点の企業idのデータをくっつけるためには:

nearmrg id using B, nearvar(time)  lower type(1:1)

を回せばよい。


これは、「ファイルAのデータに対して、Bのデータに含まれる企業IDが一致してかつ変数timeがファイルAの値以下で最近傍のデータをマージする」という指令です。


上の例は、直前の期間をマージさせる例であったためtimeの変数について「BのtimeがAの値が小さい場合にマージさせる」ことを支持するためにlowerオプションをつけています。
もしUsingデータセットの値の方が大きくなるようにマージさせたい場合には、lowerオプションをupperに取り合えればよい。つまり:

nearmrg id using B, nearvar(time)  upper type(1:1)


また、マージ・タイプのオプションtype(1:1)は、マージさせる数の対応関係を指定するオプションである。
もしn:1でマージしたい場合には次のようになります:

nearmrg id using B, nearvar(time)  lower type(n:1)


参考リンク:
nearmergeのヘルプ:http://fmwww.bc.edu/RePEc/bocode/n/nearmrg.html



*1:時間変数の読み込みについては suketani.hatenablog.comを参照してください。