オーム社トップページ >Rで学ぶ経済シミュレーション分析

Rで学ぶ経済シミュレーション分析
ー予測と政策効果の検証ー

プログラム集(Rスクリプト集)の説明書


更新日:2025年9月25日
公開日:2025年9月25日

村尾 博

この説明書では、提供するプログラム(Rスクリプト)のファイル名をリストアップし、 ファイル名の後に簡単な説明を書き、それぞれの役割や目的が分かるようにしています。

最後にディレクトリー(フォルダー)の表記法に関する説明を行っています。 Rスクリプト(プログラム)を書く人にとっては自明な内容ですが、念押しを兼ね、書いています。

もくじ

  1. プログラム
  2. データ
  3. ディレクトリー表記に関する説明


1. プログラム

プログラム(Rスクリプト)は次のフォルダーに分けて入っています。 本書で用いたプログラムを含める一方、実験的なプログラムなど、関連性の強いプログラムも含めています。 演習問題の解答となるプログラム、演習問題作成に使ったプログラムも含めています。

  1. ISLM --- 主役的なプログラムを含む。
  2. Klein --- 演習問題のプログラムを含む。
  3. Kmenta --- 演習問題のプログラムを含む。
  4. Metal --- 演習問題のプログラムを含む。
  5. Apple --- 演習問題のプログラムを含む。
  6. Others --- 上の分類に含まれないプログラムを含む。

ISLM」や「Klein」といったフォルダー内にサブフォルダー「R_prg」を作り、 そこにプログラム(Rスクリプト)を入れています。 各フォルダー「R_prg」には次の3つのサブフォルダーを作っています。

  1. data
  2. data_temp
  3. outputs

個々のフォルダーによってサブフォルダー構造を変えることが面倒であることから、 「R_prg」と名付けた全てのフォルダーに対して同じサブフォルダー構造を採用しています。 サブフォルダーを使うRスクリプトもあれば、サブフォルダーを使わないRスクリプトもあります。

R関数については、「lmtest::bgtest()」といった表記法を用い、R関数が含まれているパッケージ名を示しています。 必要に応じてパッケージをインストールしてください。 他のパッケージをインストールするときに自動的にインストールされる基本的なパッケージが存在し、その中にはパッケージ[stats]が含まれています。 「stats::lm()」や「lm()」といった表記のR関数については、別途インストールする必要はありません。 どのパッケージをインストールする必要があるかは、個々のR利用者のコンピュータ環境によって異なりますが、次のパッケージはインストールする必要はありません。

  1. base --- Rのインストール時に自動的にインストールされる基本パッケージ
  2. stats, graphics, grDevices, utils, datasets, methods --- 同じ理由

実験的なプログラムを含め、提供するプログラムの数が多くなっています。 本書に記載しているプログラムは、紙媒体と電子媒体の形で提供することになります。 一方、実験的なプログラムなど、他のプログラムは、電子媒体のみの形での提供することになります。 これを受け、次の分類項目を設けています。

  1. 紙媒体と電子媒体 --- 本書に記載した紙媒体のプログラムが、電子媒体の形で含まれています。 メインとなるプログラムが含まれているセクションと言えます。 この種のセクションには、電子媒体のみの形で提供するプログラムも含まれていることがあります。
  2. 電子媒体のみ --- 電子媒体のみの形で提供するプログラムが含まれています。 実験的なプログラム、試作的モデルを推定するプログラム、演習問題作成のためのプログラムが、含まれています。 本書で内容の説明を行なっているものの、そのプログラムを本書に記載していないプログラムも、ここに含まれます。

このような分類項目が重要性の目安になれば、幸いです。



1.1 フォルダー「ISLM

このフォルダーにはデータセット「data_ISLM」を使うRスクリプトが入っています。

分析前のデータチェック(紙媒体と電子媒体)

次のRスクリプトはデータを読み取り、幾らかの変数の推移を表すグラフを描きます。

次のRスクリプトは周期の異なる2種類のデータセットを用い、 それぞれbimets型のデータセットへ変換します。 四半期データはIS-LMモデル用データを用い、 年周期データはKleinモデル用データを用います。 2つの実践例を比較することにより、共通点と差異点が明確になると思い、このようなRスクリプトを作ってみました。

連立方程式回帰モデルの推定(紙媒体と電子媒体)

IS-LMモデルを推定します。

連立方程式回帰モデルの推定: 実験的なRスクリプト(電子媒体のみ)

所得よりも所得変化のほうが投資への影響力が大きいのではないのか。 この疑問に答えるための実験です。

bimetsがVARMAXモデルに適用できるか否かの実験です。 具体的には"AUTO(2)"を採用したIS-LMモデルを構築しています。

本書に示すIS-LMモデルに対し、参考的なIS-LMモデルを構築するRスクリプトになっています。 変化率に基づくモデルも、偏差に基づくモデルも、モデル適合度が低い結果になっています。 一方、自然対数に基づくモデルは、モデル適合度が高い結果になっています。

systemfit::systemfit()関数を使用する実験的なRスクリプトになっています。

確定的シミュレーション分析(紙媒体と電子媒体)

IS-LMモデルに基づく確定的シミュレーション分析を実行します。

次は金融政策の所得パズルに関する分析を行ないます。

次は新型コロナ禍に関する分析を行ないます。

確定的シミュレーション分析: 実験的なRスクリプト(電子媒体のみ)

予測に関し、「bimets」対「systemfit」の比較を行ないます。systemfitではpredict()関数を使用します。

次は季節変動ダミー変数を使用しない初期のRスクリプトです。 四半期データの場合は、季節変動ダミー変数を利用することにより、予測曲線が大幅に改善されます。

確率的シミュレーション分析(紙媒体と電子媒体)

IS-LMモデルに基づく確率的シミュレーション分析を実行します。

乗数分析(紙媒体と電子媒体)

流動性のワナに関し、乗数分析を行ないます。 実験的な仮説検定も、検討しています。

仮説検定については、流動性のワナの分析を仮説検定の形で行なっている先行研究を見つけ出すことが必要です。 その先行研究の定式化を参考にしつつ、定式化の改善を図ることが求められます。 利子率はどの利子率を用いるのか。LM曲線は直線的な関係式で良いのか。 等々の疑問があり、定式化の改善が求められます。

尤度比検定(紙媒体と電子媒体)

IS-LMモデルを対象とし、仮説検定を実行します。

systemfit::lrtest()関数に適用できるようにIS-LMモデルを変換しています。

ワルド検定(紙媒体と電子媒体)

systemfit::linearHypothesis()関数に適用できるようにIS-LMモデルを変換しています。

系列無相関の検定(紙媒体と電子媒体)

単一方程式回帰モデル用R関数を使用します。

均一分散の検定(紙媒体と電子媒体)

単一方程式回帰モデル用R関数を使用します。

正規分布の検定(紙媒体と電子媒体)

単一方程式回帰モデル用R関数を使用します。

構造安定性の検定(紙媒体と電子媒体)

単一方程式回帰モデル用R関数を使用します。 伝統的な連立方程式回帰モデルから抜き出した1本の方程式を推定すれば使用できます。

VAR用R関数を使用します。VAR用R関数なので、現在のところは伝統的な連立方程式回帰モデルに使用できません。

固有値のチェック(電子媒体のみ)

本書に示すIS-LMモデルの内生変数(消費、投資、利子率、所得)でもってVAR過程を構築します。 そのVAR過程の最大固有値が1より小さいことを確認します。

AR(p)過程に関するラグ次数pの選択問題(電子媒体のみ)

IS-LMモデルの内生変数(消費、投資、利子率)に関する推定残差を用い、AR(p)過程のラグ次数pを決定するための情報収集を行ないます。 Breusch-Godfrey検定やBox-Pierce検定では、この種の情報を用いる機会があります。

ここでは攪乱項(残差)のラグ次数を決定するための情報収集を行なうので、AR(p)過程のラグ次数pよりも、 MA(q)過程のラグ次数qを決定する選択問題が正確な表現かも知れません。 議論の対象物がAR(p)過程なのかMA(q)過程なのかは具体的な想定により異なるものの、 ラグ次数を決定するための情報を得る目的で、次のRスクリプトを用います。

vars::VARselect()関数は次の4つの情報量規準に基づき、AR(p)過程のラグ次数pを提案してくれます。

  1. AIC: 赤池情報量規準(Akaike Information Criterion)
  2. HQ: ハナン=クイン情報量規準(Hannan-Quinn Information Criterion)
  3. SC: シュワルツのベイズ情報量規準(Schwarz Bayesian Information Criterion)
  4. FPE: 赤池最終予測誤差(Akaike’s Final Prediction Error)

これら4タイプの情報量規準が提案するラグ次数pを、p(AIC)、p(HQ)、p(SC)、p(FPE)と表記すると、 次の3タイプの情報量規準が選ぶラグ次数には次の傾向があります。

p(SC)$\leq$p(HQ)$\leq$p(AIC)

もちろん、同じラグ次数を示すこともあります。

この種の情報を得るためのR関数は多くなく、 vars::VARselect()関数は貴重な存在と言えます。 VARselect()関数はVAR過程にもAR過程にも適用できること、タイムトレンドや季節変動の影響も制御(除去)できること、等々の利便性を備えています。

時系列分析の場合は、 vars::VARselect()関数が便利な分析ツールになります。

データ作成の実験(電子媒体のみ)

bimets::TSEXTEND()関数がどのようにどのように働くかをチェックします。

単一方程式回帰モデルの推定(電子媒体のみ)

回帰のイメージを示すグラフを作成します。

単一方程式回帰モデルをTSLS推定法やLIML推定法で推定します。 多くはモデル構造を決めるための実験的な内容になっています。

ivmodel::ivmodel()関数は、使用する操作変数によってエラーが無くなることがある。 内生的な説明変数の個数=1の制約が、ivmodel()関数にはある。

単一方程式回帰モデルの仮説検定(電子媒体のみ)

単一方程式回帰モデルに基づく仮説検定を実行します。

Rパッケージ[lavaan]の使用(電子媒体のみ)

Rパッケージ[lavaan]は本書では採用していません。 lavaanを評価する際に作成した実験的なRスクリプトです。 IS-LMモデルを推定したり、 推定されたIS-LMモデルに基づき予測を行なったりします。

モデル推定は、lavaan()関数、cfa()関数、efa()関数といった3つの関数で可能です。 推定された定数項を取り出す場合は、cfa()関数を使用する必要があります。 言い換えると、回帰分析ではlavaan()関数やefa()関数を使うことはないと思われます。

特殊なRパッケージを使わない場合は、一般的なsolve()関数でもって予測や予測系シミュレーション分析を行なうことになります。 一般的なR関数を使うと、どの程度に煩雑になるかを体験することになります。 連立方程式回帰モデルに基づき予測や予測系シミュレーション分析を行なう場合は、それに特化したR関数を使うといった対処法が適切です。



1.2 フォルダー「Klein

このフォルダーにはKleinモデルに関するRスクリプトが含まれています。 次のデータセットを使うRスクリプトが含まれています。

  1. data_Klein_Greene.csv --- 演習問題のためのデータ。Greene(2000)をデータ入手源とする。
  2. data_Klein_bimets.csv --- bimetsマニュアルに記載されている実践例を再現するためのデータ

連立方程式回帰モデルの推定(電子媒体のみ)

Greene版Kleinモデルを推定します。

bimets版Kleinモデルを推定します。

尤度比検定(電子媒体のみ)

Greene版Kleinモデルに基づき、尤度比検定を実行します。

確定的シミュレーション分析(電子媒体のみ)

Greene版Kleinモデルに基づき、確定的予測を実行します。

bimets版Kleinモデルに基づき、確定的予測を実行します。

確率的シミュレーション分析(電子媒体のみ)

Greene版Kleinモデルに基づき、確率的予測を実行します。

bimets版Kleinモデルに基づき、確率的予測を実行します。

構造安定性の検定(電子媒体のみ)

単一方程式回帰モデル用R関数を使用します。

単一方程式回帰モデルの推定(電子媒体のみ)

単一方程式回帰モデルを使用し、回帰の基本を表すグラフを作成します。



1.3 フォルダー「Kmenta

このフォルダーにはKmentaモデルに関するRスクリプトが入っています。 そのデータセット「Kmenta」はRパッケージ[systemfit]に入っています。

連立方程式回帰モデルの推定: 実験的なRスクリプト(電子媒体のみ)

2本の方程式からなる需要・供給モデルにおいて、「数量」の従属変数が双方に現れるといった意味で、Kmentaモデルは特殊構造になっています。 一般化すると、同じ従属変数が異なった推定式の左辺に現れるといった意味で、特殊構造になっています。 理論的には何ら問題がないことですが、統計ソフトでは問題になります。 そのため、いくらかの実験を行なっています。

前述の特殊構造は、パッケージ「bimets」の基本設計に対して違反する形になります。 言い換えると、パッケージ「bimets」は、前述の特殊構造に対応できないと言うことです。 あるアイデアに基づき、モデル推定で問題がないように対策を講じても、その後の予測で問題が生じます。 そのため、予測に関する幾らかの実験を行なっています。

2本の方程式からなる需要・供給モデルにおいて、「数量」の従属変数を双方に使ったのが、Rスクリプト「forecast_out_sample_bimets_Kmenta_noGood.R」であり、予測曲線に誤りが生じます。 2本の方程式からなる需要・供給モデルにおいて、一方の従属変数を「価格」、他方の従属変数を「数量」にすれば、問題解決です。 そのようなモデルをRスクリプト「forecast_out_sample_bimets_Kmenta_OK.R」に採用しています。

確定的シミュレーション分析(電子媒体のみ)

特殊なパッケージを使わず、基本的な関数のみを使う場合、モデル推定や予測がどの程度に煩雑になるかを示しています。 基本的な関数を用い、予測を実行する場面では、役立つと考えます。

尤度比検定(電子媒体のみ)

systemfitマニュアルに掲載されている実践例の再現です。

ワルド検定(電子媒体のみ)

systemfitマニュアルに掲載されている実践例の再現です。

構造安定性の検定(電子媒体のみ)

単一方程式回帰モデル用R関数を使用します。

ハウスマン特定化検定(電子媒体のみ)

ハウスマン特定化検定は本書では採用していません。 ハウスマン特定化検定を評価する際に作成したRスクリプトです。 検定対象が単一方程式回帰モデルなのか、連立方程式回帰モデルなのか、パネルデータ回帰モデルなのかといった差異に基づき、ハウスマン特定化検定には色々なタイプがあります。 これは連立方程式回帰モデル用です。具体的には「TSLS」対「3SLS」を考え、3SLS推定法を使う推定環境なのか否かを判断します。

検定のタイトルは「Hausman specification test for consistency of the 3SLS estimation」となっています。 タイトルに示されているように、3SLS推定法を使う推定環境なのか否かを検定します。



1.4 フォルダー「Metal

単一方程式回帰モデル(電子媒体のみ)

このフォルダーにはコブ=ダグラス型生産関数に関するRスクリプトが入っています。 データはサブフォルダ「Metal/R_prg/data」に入っています。



1.5 フォルダー「Apple

単一方程式回帰モデル(電子媒体のみ)

このフォルダーにはリンゴ需要関数に関するRスクリプトが入っています。 データはサブフォルダー「Apple/R_prg/data」に入っています。



1.6 フォルダー「Others

上に示す分類に属さず、分類しにくいRスクリプトが入っています。

作図のためのRスクリプト(電子媒体のみ)

本書で用いたグラフのためのRスクリプトです。




2. データ

本書に記載したデータセットは、次のフォルダーに入っています。

  1. LSLM
  2. Klein
  3. Kmenta

一方、本書に記載しなかったものの、演習問題作成のために使ったデータセットは、次のフォルダーに入っています。

  1. Apple
  2. Metal

演習問題用のデータセットのほうには、データ説明書を含めている場合もあれば、含めていない場合もあります。

本書に記載したデータセットについては、データ入手源を含め、基本情報を以下に提供します。


2.1 データセット「data_ISLM

これはIS-LMモデルのためのデータセットであり、日本マクロ経済の四半期データからなり、50個ぐらいの変数が含まれています。 時間的なカバー範囲は次のようになっています。

  1. 下に示す変数を除き、全ての変数: 1994Q1-2022Q3, 115 time periods.
  2. マネーストック関連の変数: 2003Q2-2022Q3, 78 time periods.
  3. 消費者物価指数: 2001Q1-2022Q3, 91 time periods.

データの入手源は次のとうりです。

  1. GDP統計の変数: 内閣府経済社会総合研究所
  2. マネーストックと利子率に関する変数: 日本銀行
  3. 消費者物価指数: 政府統計ポータルサイト「e-Stat」
  4. 鉱工業生産指数: 経済産業省

データセット「data_ISLM」はサブフォルダー「ISLM/R_prg/data」に入っています。

このサブフォルダーには、次のデータ説明書も入っています。



2.2 データセット「data_Klein_bimets

パッケージ「bimets」のマニュアルに記載されていたデータをコピペの形で入手したものです。 別の入手源のデータ「data_Klein_Greene」と区別するため、「data_Klein_bimets」といった名を付けています。 データは米国マクロ経済に関する年周期データであり、1920年から1941年までの22年間をカバーしています。

データセット「data_Klein_bimets」と「data_Klein_Greene」は、サブフォルダー「Klein/R_prg/data」に入っています。



2.3 データセット「data_Kmenta

パッケージ「systemfit」に含まれているデータセット「Kmenta」をコピペの形で入手したものです。 人口1人あたりの食料消費に関する米国の年周期データであり、1922年から1941年までの20年間をカバーしています。

このデータセットは、サブフォルダー「Kmenta/R_prg/data」に入っています。




3. ディレクトリー表記に関する説明

プログラミング初心者を対象とし、ディレクトリー(フォルダー)の表記法に関する説明を行います。 Rスクリプト(プログラム)を書く人にとっては自明な内容であり、ざーと読み流してください。

まず、ディレクトリーも、ファルダーも、ファイルの保存場所といった意味では同じです。 フォルダーは入れ物(容器)といった意味合いが強くなります。 一方、ディレクトリーはツリー構造を持ったファイルの組織体といった意味合いが強くなります。

ダウンロードしたプログラムが問題なく動くためには、ディレクトリーやフォルダーと呼ばれるファイル保存場所の表記が重要であり、次の一致が必要です。

プログラムに記載されているディレクトリー(ファルダー) = コンピュータ上の実際のディレクトリー(ファルダー)

これだけです。 これだけでは味も素っ気もないので、もう少し詳しく説明します。 ここからは具体例でもって説明します。

まず、当サイトからダウンロードしたファイルを入れるための保存場所(フォルダー)を作ります。 「book_SIMU」と名付けたファルダーを作り、そこにダウンロードしたファイルを入れたとします。 ファルダー「book_SIMU」の場所は次の場所とします。

C:/data_works/book_SIMU

「C:/data_works/」の部分は、自分のコンピュータ環境に応じて選んでください。

ダウンロードしたファイルの中にはプログラム「forecast_out_sample_ISLM.R」が入っています。 このプログラム「forecast_out_sample_ISLM.R」は、フォルダー「ISML/R_prg」に入っていますから、 それを絶対参照の形で表記すると、次のようになります。

C:/data_works/book_SIMU/ISLM/R_prg/forecast_out_sample_ISLM.R

繰り返しになりますが、「R_prg」と名付けた各フォルダーに対し、次の3つのサブフォルダーを作っています。

  1. data
  2. data_temp
  3. outputs

サブフォルダー「data_temp」は、研究やプロジェクトが終了すると、削除するデータの保管場所といった意味で作っています。 どのサブフォルダーが必要かは個々のプログラムによって異なります。 説明の単純化のため、全てのフォルダーに対し、3つのサブフォルダーを作っています。

次はプログラムに記載されているディレクトリー(フォルダー)構造を変更します。 フォルダー「ISLM/R_prg」内のプログラム「forecast_out_sample_ISLM.R」を例に取ると、setwd()のところの内容を次のように変更します。

setwd("C:/book_SIMU/data_works/ISLM/R_prg")

setwd("C:/data_works/book_SIMU/ISLM/R_prg")

この操作は、「プログラムに記載されているディレクトリー(フォルダー)」=「コンピュータ上の実際のディレクトリー(フォルダー)」となるようにするための変更です。

フォルダー「ISLM/R_prg」のサブフォルダー「data」や「outputs」を絶対参照の形で表示すると、次のようになります。

C:/data_works/book_SIMU/ISLM/R_prg/data
C:/data_works/book_SIMU/ISLM/R_prg/outputs

一方、working directory(現在位置)から見て、下のフォルダー、上のフォルダー、隣のファルダーといった形でフォルダー指定(一般的にはオブジェクト指定)を行う方式は相対参照と呼ばれます。 working directory(現在位置)が「ISLM/R_prg」であるとき、そのサブフォルダー「data」や「outputs」を相対参照で表記すると、次のようになります。

./data
./outputs

working directory「ISLM/R_prg」から見て、「ISLM/R_prg」内のサブフォルダーが「data」や「outputs」といった名前になっているといった意味です。 このように相対参照を利用すると、フォルダー指定の表記が簡単できます。 フォルダー指定のために、長々と続く絶対参照を書く必要がなくなります。

setwd()でもってworking directoryを指定しない場合は、Rの実行ファイルがある場所がworking directoryになっています。 「データが上手く読み取れない」「出力が思うように出力されない」といったトラブルは、相対参照の誤りであるケースが意外と多いものです。 このような経験から、私がRスクリプトを書く場合は、setwd()でもってworking directoryを特定化し、それを最初のコマンドとして書くようにしています。 つまり、自分の作業場所(現在位置)をコンピュータに伝えてから具体的な作業に入っていきます。 このような準備作業は、相対参照に関する指示ミスを少なくします。

次はworking directory「ISLM/R_prg」内のサブフォルダー「data」や「outputs」の名前や構造を変更した場合の対処法を説明します。

データの保存場所(フォルダー)の名前を「data」から「external_data」に変更した場合は、プログラム「forecast_out_sample_ISLM.R」における該当部分を変更します。 変更前と変更後を示すと、次のような変更を行います。

read.csv("./data/data_ISLM.csv")

read.csv("./external_data/data_ISLM.csv")

ファイルの保存場所は絶対参照の形で書くことも出来ますが、ここでは相対参照の形で書いています。

画像ファイルの保存場所(フォルダー)を「outputs」から「outputs/forecasts」に変更した場合は、プログラム「forecast_out_sample_ISLM.R」における該当部分を変更します。 変更前と変更後を示すと、次のような変更を行います。

dev.copy(jpeg, file = "./outputs/forecast_out_sample_ISLM.jpg")

dev.copy(jpeg, file = "./outputs/forecasts/forecast_out_sample_ISLM.jpg")

このような操作も、「プログラムに記載されているディレクトリー(フォルダー)」=「コンピュータ上の実際のディレクトリー(フォルダー)」となるようにするための変更です。

サブフォルダーの相対参照に関し、次の2つは同等です。

read.csv("./data/data_ISLM.csv")
read.csv("data/data_ISLM.csv")

一方、working directory(現在位置)から1つ上のディレクトリー(フォルダー)へ移動する場合は「../」の表記を使います。 2つ上のディレクトリー(フォルダー)へ移動する場合は「../../」、3つ上のディレクトリー(フォルダー)へ移動する場合は「../../../」の表記を使います。 したがってworking directory「ISLM/R_prg」から隣のフォルダー「Klein/R_prg」へアクセスする場合は、

../../Klein/R_prg

といった相対参照にします。 現在、自分のいる部屋「ISLM/R_prg」から別の部屋へ移動する場合は、一度、廊下へ出てから別の部屋「Klein/R_prg」へ移動する必要があります。 コンピュータにおいても同様であり、一度、上のディレクトリー(フォルダー)へ移動し、そこから見える「Klein/R_prg」へアクセスするように指示します。 1つ上のディレクトリー(フォルダー)なのか、2つ上のディレクトリー(フォルダー)なのかは、個々の状況によって異なりますが、廊下へ出てから別の部屋へ行くという基本は変わりません。



このページのトップに戻る。