Rの関数から VAR {vars} を確認します。
関数 VAR とは
VAR は、ベクトル自己回帰(Vector Autoregression)モデルを推定するための関数です。
単変量の自己回帰(AR)モデルが「自身の過去の値」のみを用いて現在の値を説明するのに対し、VARモデルは「複数の変数の過去の値」を用いて、変数間の相互依存関係を動的にモデル化します。
この関数は、指定されたラグ次数(過去の期間)に基づいてデータ行列を構築し、方程式ごと(変数ごと)に通常の最小二乗法(OLS)を適用して係数を推定します。
関数 VAR の引数
library(vars)
args(VAR)function (y, p = 1, type = c("const", "trend", "both", "none"),
season = NULL, exogen = NULL, lag.max = NULL, ic = c("AIC",
"HQ", "SC", "FPE"))
NULL-
y- 分析対象となる多変量時系列データです。
- データフレームまたは行列(matrix)。各列が変数、各行が観測時点を表します。少なくとも2つの変数が含まれている必要があります。
-
p- VARモデルのラグ次数(Lag Order)です。
- デフォルト:
1 - 「何時点過去のデータまでを説明変数として用いるか」を指定します。例えば
p=2ならば、1期前と2期前の値がモデルに含まれます。 -
lag.maxが指定されている場合、この引数は無視され(または選択されたラグ数が格納され)ます。
-
type- モデルに含める決定論的項(Deterministic terms)の種類を指定します。
- 選択肢:
-
"const": 定数項(切片)のみを含めます(デフォルト)。 -
"trend": トレンド項(時間の経過とともに直線的に変化する項)のみを含めます。 -
"both": 定数項とトレンド項の両方を含めます。 -
"none": 決定論的項を含めません。
-
-
season- 季節ダミー変数を含める場合の、季節の周期(整数)を指定します。
- 例: 月次データなら
12、四半期データなら4を指定します。これにより、季節変動を捉えるための中心化された季節ダミーがモデルに追加されます。
-
exogen- 外生変数(Exogenous variables)のデータ行列です。
- モデル内の変数には影響を与えるが、モデル内の変数からは影響を受けない(と仮定される)変数を追加する場合に使用します。
-
lag.max- ラグ次数
pを情報量基準に基づいて自動選択する場合の、探索するラグの上限値です。 -
NULLでない場合、内部的にVARselect関数が呼び出され、指定された情報量基準(ic)を最小化するラグ次数が自動的にpとして採用されます。
- ラグ次数
-
ic-
lag.maxを使用してラグ次数を自動選択する際に用いる情報量基準です。 - 選択肢:
-
"AIC": 赤池情報量基準(Akaike Information Criterion)。 -
"HQ": Hannan-Quinn 情報量基準。 -
"SC": Schwarz 基準(BIC: Bayesian Information Criterion)。 -
"FPE": 最終予測誤差(Final Prediction Error)。
-
-
シミュレーションコード
以下に、VAR 関数の機能を確認するためのサンプルデータを用いたシミュレーションコードを示します。
このシミュレーションでは、互いに影響し合う2つの変数(「広告費」と「売上」のような関係)を生成します。
- 変数X: 自身の過去だけでなく、変数Yの過去の影響も受ける。
- 変数Y: 自身の過去だけでなく、変数Xの過去の影響も受ける。
このような「フィードバック関係」を持つデータを生成し、VAR 関数がその真の係数構造を正しく推定できるかを確認します。
なお、有意水準は5%とします。
シミュレーションデータの生成
# パッケージの読み込み
library(ggplot2)
library(tidyr)
# 乱数シードの固定
seed <- 20260103
set.seed(seed)
# 設定: 2変量VAR(1)モデル
# 変数: y1, y2
# データ長: 200時点
n_obs <- 200
# 係数行列 A の設定 (真のモデル)
# y1(t) = 0.5 * y1(t-1) + 0.3 * y2(t-1) + e1
# y2(t) = -0.4 * y1(t-1) + 0.6 * y2(t-1) + e2
#
# 解説:
# y1 は y2 の過去から正の影響 (0.3) を受ける
# y2 は y1 の過去から負の影響 (-0.4) を受ける
A_true <- matrix(c(0.5, 0.3, -0.4, 0.6), nrow = 2, byrow = TRUE)
# 誤差項の生成 (標準正規分布)
e1 <- rnorm(n_obs)
e2 <- rnorm(n_obs)
# データの格納用行列
data_sim <- matrix(0, nrow = n_obs, ncol = 2)
colnames(data_sim) <- c("Variable_A", "Variable_B")
# ループによる時系列データの生成
# 初期値は0とする
for (t in 2:n_obs) {
# 前期の値ベクトル
y_prev <- matrix(data_sim[t - 1, ], ncol = 1)
# VAR(1) プロセス: y(t) = A %*% y(t-1) + e(t)
y_curr <- A_true %*% y_prev + c(e1[t], e2[t])
data_sim[t, ] <- as.vector(y_curr)
}
# 扱いやすいようにデータフレームに変換
df_sim <- as.data.frame(data_sim)
df_sim$Time <- 1:n_obs
cat("データ概要:\n")
cat(sprintf("観測数: %d\n", n_obs))
cat("真のモデル構造:\n")
cat(" Variable_A = 0.5 * A(t-1) + 0.3 * B(t-1) + e\n")
cat(" Variable_B = -0.4 * A(t-1) + 0.6 * B(t-1) + e\n\n")
# データの可視化
# ggplot用にデータを縦持ち(ロング形式)に変換
df_long <- pivot_longer(df_sim,
cols = c("Variable_A", "Variable_B"),
names_to = "Variable", values_to = "Value"
)
p1 <- ggplot(df_long, aes(x = Time, y = Value, color = Variable)) +
geom_line(linewidth = 0.8) +
labs(
title = "生成された2変量時系列データ",
subtitle = "互いに影響し合いながら変動している",
x = "時間 (Time)",
y = "値 (Value)",
color = "変数"
) +
theme_minimal()
print(p1)データ概要:
観測数: 200
真のモデル構造:
Variable_A = 0.5 * A(t-1) + 0.3 * B(t-1) + e
Variable_B = -0.4 * A(t-1) + 0.6 * B(t-1) + eVARモデルの推定
# VAR関数の実行
# ここでは真のラグ次数 p=1 が分かっているものとして指定します
# 定数項はデータ生成に含めていないため type="const" でも "none" でも良いですが、
# 一般的には定数項を含めて推定することが多いため "const" とします。
# (真の切片は0なので、推定される切片も0に近くなるはずです)
var_model <- VAR(df_sim[, c("Variable_A", "Variable_B")], p = 1, type = "const")
print(summary(var_model))
VAR Estimation Results:
=========================
Endogenous variables: Variable_A, Variable_B
Deterministic variables: const
Sample size: 199
Log Likelihood: -550.449
Roots of the characteristic polynomial:
0.6566 0.6566
Call:
VAR(y = df_sim[, c("Variable_A", "Variable_B")], p = 1, type = "const")
Estimation results for equation Variable_A:
===========================================
Variable_A = Variable_A.l1 + Variable_B.l1 + const
Estimate Std. Error t value Pr(>|t|)
Variable_A.l1 0.44906 0.05573 8.058 7.46e-14 ***
Variable_B.l1 0.34416 0.04710 7.307 6.75e-12 ***
const -0.05708 0.06680 -0.854 0.394
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.9375 on 196 degrees of freedom
Multiple R-Squared: 0.3948, Adjusted R-squared: 0.3887
F-statistic: 63.94 on 2 and 196 DF, p-value: < 2.2e-16
Estimation results for equation Variable_B:
===========================================
Variable_B = Variable_A.l1 + Variable_B.l1 + const
Estimate Std. Error t value Pr(>|t|)
Variable_A.l1 -0.41945 0.06005 -6.986 4.31e-11 ***
Variable_B.l1 0.63857 0.05075 12.583 < 2e-16 ***
const 0.04334 0.07198 0.602 0.548
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.01 on 196 degrees of freedom
Multiple R-Squared: 0.4988, Adjusted R-squared: 0.4936
F-statistic: 97.51 on 2 and 196 DF, p-value: < 2.2e-16
Covariance matrix of residuals:
Variable_A Variable_B
Variable_A 0.87889 -0.06167
Variable_B -0.06167 1.02032
Correlation matrix of residuals:
Variable_A Variable_B
Variable_A 1.00000 -0.06512
Variable_B -0.06512 1.00000モデル全体の概要 (VAR Estimation Results)
- Sample size: 199: 元の観測数は200ですが、ラグ次数 \(p=1\) を設定したため、最初の1時点分が初期値として利用され、推定に使用されたサンプルは199個となります。
- Roots of the characteristic polynomial: 特性多項式の根(0.6566)がすべて1未満(単位円の内側)に収まっています。本結果は、この時系列システムが発散することなく、安定的(定常)であることを示唆しています。
Variable_A の方程式 (Estimation results for equation Variable_A)
ここでは、「Variable_A の現在の値」が「過去の自分」と「過去の Variable_B」からどのような影響を受けているかが推定されています。
- Variable_A.l1 (1期前の自分):
- 推定値: 0.44906
- 真の値: 0.5
- 解説: 真の値に近い数値が推定されており、p値は設定した有意水準を下回っています。自己相関を正しく捉えているといえます。
- Variable_B.l1 (1期前の相手):
- 推定値: 0.34416
- 真の値: 0.3
- 解説: こちらも真の値に近く、p値は設定した有意水準を下回っています。「Variable_B の過去が Variable_A にプラスの影響を与える」という因果関係を正しく検出できています。
- const (定数項):
- 推定値: -0.05708
- 解説: p値は 0.394 と設定した有意水準を上回っています。シミュレーションデータは切片ゼロで生成したため、この項がゼロと区別がつかないことは正しい結果です。
Variable_B の方程式 (Estimation results for equation Variable_B)
同様に、「Variable_B の現在の値」に対する影響の推定結果です。
- Variable_A.l1 (1期前の相手):
- 推定値: -0.41945
- 真の値: -0.4
- 解説: 真の値に近く、設定した有意水準を下回っています。「Variable_A の過去が Variable_B にマイナスの影響を与える」という逆方向の因果関係も特定されています。
- Variable_B.l1 (1期前の自分):
- 推定値: 0.63857
- 真の値: 0.6
- 解説: こちらも適切に推定されています。
残差の相関 (Correlation matrix of residuals)
- Variable_A と Variable_B の残差間の相関係数は -0.06512 です。
- シミュレーションでは互いに独立な(無相関な)誤差項を生成したため、この相関がゼロに近いことは、モデルが構造を適切に説明しており、未説明の部分(残差)に意図しない関係性が残っていないことを示しています。
以上です。


