経済セミナー連載の「定量的マクロ経済学と数値計算」のサポート・リポジトリーにR用のコードが部分的にしか用意されていなかったので、ちょっと書いてみたものです。
実行方法はgit clone
などをしてファイルを展開した後に、Rに読み込ませるだけです。例えば、第3節の離散化による2期間モデルの解法は、two-period model discretized method.Rを以下のように読み込ませて計算します。
source("two-period model discretized method.R")
getwd()
で確認できるワーキングディレクトリにtwo-period model discretized method.Rが無いと呼び出せないので注意してください。また、他のファイルやパッケージに依存しているファイルもあります。ファイルはすべて展開し、ソースコード中のコメントやエラーメッセージに応じてパッケージをインストールしてください。
- CH2/two-period model discretized method.R 第3節 離散化による2期間モデルの解法
- CH2/two-period model continuous method.R 第4節 操作変数を連続変数にする: 最適化
- CH2/two-period model root-finding method.R 第5節1 非線形方程式のゼロ点を探す
- CH2/two-period model projection method.R 第5節2 射影法
- CH3/Robinson Cruesoe Model.R 第2節 ロビンソン・クルーソーとベルマン方程式
- CH3/Discretized Dynamic Programming.R 第5節 無限期間モデルの解法(状態変数と操作変数を離散化)
- CH3/Parametric Dynamic Programming.R 第5節 無限期間モデルの解法(操作変数が連続的)
- CH4/time iteration method.R 第2節 分権経済と時間反復法
- CH4/approximation to the Runge function.R 第3節 多項式近似
- CH4/time iteration chebyshev approximation method.R 第3節3 時間反復法への多項式近似の応用
- CH5/two-state NK model closed-form.R 第2節 2状態モデル
- CH5/N-state NK model times iteration method.R 第3節 N状態モデル
- CH5/compare a non-linear NK model to linear one.R 第4節 非線形モデル
- CH5/compare a quasi-linear NK model to linear one.R 第4節 非線形モデル(の中で言及された準線形モデル; Juliaのコードとプロット結果が微妙に異なるので要精査)
- CH6/aiyagari (1994) compute eq K and r.R 第2節 ビューリーモデル(図3のプロット)
- CH6/aiyagari (1994) plot capital demand and asset supply curves.R 第2節 ビューリーモデル(図4のプロット)
第6回の処理はこれまでと比較してかなり重たい上に、Dynamic Programmingであるためか、元のMatlabのソースコードがベクトルや行列演算の形に直すのは困難に思えるものだったので、RからCで書かれた関数の拡張を呼び出すことにより、処理の高速化が行えるオプションを用意しました。LinuxやMacOSでは、以下のようにCのソースコードをコンパイルした後に、Rのソースコード中で指定するオプションr_c_mp_switch
を変更することで、数十倍の高速化が図れます。
R CMD SHLIB aiyagari_vfi1.c
R CMD SHLIB aiyagari_vfi2.c
Rtoolsをインストールし、環境変数のPATHに"インストール先/usr/bin"
を追加すれば、MS-Windowsでも同様にdllを作成でき、実行できます。
図4のプロットでは、これもオプションとして、さらにマルチコア対応となっています。Cの拡張とマルチコアを利用することで、純粋なRのコードと比較してかなりの処理時間の短縮が可能になります。手元の古めの計算機では70〜140倍といった差異になりました。
- CH7/profile for lifetime assets and consumption by OLG.R 第2節 世代重複モデル(図3のプロット)
- CH7/profile for lifetime assets and consumption by OLG in various scenario.R 第2節 世代重複モデル(図4のプロット)
- CH8/Krusell and Smith (1998).R 第2節 クルセス=スミス・モデル(の計算)
- CH8/Krusell and Smith (1998) plot policy function.R 第2節 クルセス=スミス・モデル(のプロット)
- CH8/McKay, Nakamura and Steinsson (2016).R 第3節 HANKモデルとフォワード・ガイダンス・パズル
Krusell and Smith (1998)モデルは、部分的にCを使ったコードのみとなります。UNIX/Linux環境では添付のMakefileで、Cのソースコードのコンパイルができます。Windowsでは、
R CMD SHLIB KnS1998.c cubic_spline.c linear_interpolation.c which.c
としてください。なお、LinuxやMacOS Xでは$HOME/.R/Makevars
に、MS-Windowsでは%HOME%/.R/Makevars.win
と言うテキストファイルの中のCFLAGS
の行に-fopenmp
オプションを追加すると、コンパイル時にOpenMPが有効になって、高速に実行が可能になります。
なお、プロットは計算結果を保存したファイルを用いるので、先に計算しないとエラーとなります。
HANKモデル(McKay, Nakamura and Steinsson (2016))は、部分的にRcpp/RcppPararell/Eigen/Spectraを使ったパッケージを用いたコードのみとなります。EigenとSpectraのテンプレートライブラリをインストールし、CH8/MNS2016/src/Makevars
のPKG_CXXFLAGS
の行に-ISpectraインストール先
を追加した後、CH8ディレクトリで、
R CMD INSTALL MNS2016
とパッケージをインストールすることでC++部分のセットアップができ、McKay, Nakamura and Steinsson (2016).R
をRから呼び出して実行可能になります。まだ冗長な部分はあるのですが、手元の計算機ではJulia版の3倍以上の高速化になりました。