ill-identified diary

所属組織の業務や見解とは一切無関係なアフィリエイト付きメモ帳。所属とは関係ないけどここを見て所属先にも興味を持っていただけると喜びます。

[R] R で二段階最小二乗法 (操作変数法)

概要

  • 今回は大した内容ではない
  • sem パッケージで二段階最小二乗法をする tsls() 関数の構文がちょっとわかりづらかったのでメモ書き程度に残しておく

操作変数

 \begin{equation}
y = \beta_{0} + \beta_{1} x_{1} + \beta_{2} x_{2} + \varepsilon \tag{1}
\end{equation} のようなモデルがあるとして,  x_{1} が内生変数である, つまり 誤差項  \varepsilon と相関するとき, 通常の最小二乗法より二段階最小二乗法 (two-stage lease squares; 2SLS) を利用したほうがよい場合がある. 二段階最小二乗法が何かという話は, Rで学ぶ観察データでの因果推定 を参照してほしい (リンク先では操作変数法ということで紹介されている). より厳密な数式を知りたいなら, 浅野・中村 (2009) 『計量経済学』第2版がよい.

二段階最小二乗法では, まず1段階目で, 内生変数 x_{1}を被説明変数とし, 元の式 (1) の,内生変数以外の説明変数と, 操作変数  z を説明変数とした回帰式,

 \begin{equation}
x_{1} = \gamma_{0} + \gamma_{2} x_{2} + \delta z + \eta \tag{2}
\end{equation}

を推定し, (1) 式の  x_{1} に, (2) の推定結果から得た  x_{1} の予測値  \hat{x}_{1} を置き換えた式 (1') を推定する.

 \begin{equation}
y = \beta_{0} + \beta_{1} \hat{x}_{1} + \beta_{2} x_{2} + \varepsilon \tag{1'}
\end{equation}

なお, この式では, 内生変数と操作変数が1対1になっている. 二段階最小二乗法のなかでもこのケースは特に操作変数 (IV) 法, その方法から導いた推定量を操作変数推定量 (IVE) と呼ぶ. 逆に言えば, 推定したい式に内生変数, 操作変数が複数であっても同様のことができる*1. 操作変数法に対して二段階最小二乗法も基本的に同じ方法で計算されるが, 二段階最小二乗法の場合は, 内生変数より新たに加えた操作変数のほうが多くなり, そのうちいくつかは実際には操作変数として無意味である可能性がある. これを過剰識別の問題といい, 通常は仮説検定で過剰識別の問題がないか検証する必要がある. 例えば二段階最小二乗法をさらに一般化した, 一般化モーメント法 (GMM; generalized method of moments, GLM ではない. ) を応用した, Arellano-Bond 推定量などは操作変数が非常に多くなるため, 常に過剰識別の問題がつきまとう.

二段階最小二乗推定量 (操作変数推定量) を R で計算するには, 2通りの方法がある. 1つは以前の記事 [計量経済学][時事ネタ?] 非連続回帰デザイン (RDD) 実践編 - ill-identified diary でも使用した, AER パッケージの ivreg() 関数, もう一方は sem パッケージの tsls() である. ivreg() の構文は前回も説明したが, formula= にまとめて書く:

ivreg(forumla= y ~ x1 + x2 | x2 + z, data=...)

tsls() の場合, formula= にはメインの式 (今回の場合は (1) 式) を書き, instruments= には操作変数のリストを書く*2.

tsls(forumla=y ~ x1 + x2, instruments= ~ x2 + z)

tsls()instruments= には, 先頭に ~ が来ていて不自然だが, これが正しい.

ここで勘違いしやすいのだが, 操作変数というのは (2) で新しく加えられた z だけでなく, 説明変数のうち, 誤差項  \varepsilon と相関しない変数 も含まれる*3. 内生変数は誤差項と相関するからこの条件は満たさない. よって, 「操作変数 = 内生変数以外」と言うふうに言い換えることもできる. よって,

ivreg(formula = [被説明変数] ~ [説明変数s] | [操作変数s], data=... ) tsls([被説明変数] ~ [説明変数s], instruments= ~ [操作変数s], data=...)

ということになる.

どっちを使えばいいか

前回も使用したように, 標準誤差の計算方法を変えたいなら, ivreg() のほうが簡単だろうか. そもそもパッケージが名が「Rで応用計量経済学」なので, 計量経済学の文脈で使うなら当然か. 一方, tsls() は構造方程式モデリングのパッケージなので, そっち方面で使いたい場合は sem を使えばいいだろう.

参考文献

Rで学ぶ観察データでの因果推定

*1:ただし (内生変数の数) <= (説明変数に含まれない操作変数の数) でなければならない

*2:formula でなく説明変数・操作変数の行列を与える構文もある.

*3:つまり定数項も操作変数であるが, R 他多くの統計ソフトウェアでは, 定数項をわざわざ書かなくてもよい構文になっている.