Rの関数:ARMAacf {stats}

Rの関数から ARMAacf {stats} を確認します。

関数 ARMAacf とは

ARMAacf は、ARMA(自己回帰移動平均)モデルの 理論的な自己相関関数 (ACF) または 偏自己相関関数 (PACF) を計算する関数です。

本関数は「データから相関係数を推定する」ものではなく、指定されたモデルのパラメータ(AR係数やMA係数)に基づき、そのプロセスの理論的相関構造を算出し、モデルの特性を理解したり、シミュレーションの理論的なベンチマークを作成したりする際に使用されます。

関数 ARMAacf の引数

args(ARMAacf)
function (ar = numeric(), ma = numeric(), lag.max = r, pacf = FALSE) 
NULL
  1. ar

    • AR(自己回帰)項の係数ベクトル。
    • モデル式 \(X_t = \phi_1 X_{t-1} + \dots + \phi_p X_{t-p} + \epsilon_t + \dots\) における \(\phi\) の部分を指定します。
    • デフォルト: numeric()(AR項なし)。
  2. ma

    • MA(移動平均)項の係数ベクトル。
    • モデル式 \(X_t = \dots + \epsilon_t + \theta_1 \epsilon_{t-1} + \dots + \theta_q \epsilon_{t-q}\) における \(\theta\) の部分を指定します。
    • デフォルト: numeric()(MA項なし)。
  3. lag.max

    • 計算するラグの最大値。
    • 数値を指定します。デフォルトでは、AR係数とMA係数の数に基づいて必要な最小限のラグ数が設定されます。
  4. pacf

    • 偏自己相関関数(PACF)を計算するかどうかの論理値。
    • デフォルト: FALSE(ACFを計算)。
    • 詳細:

      • FALSE の場合:自己相関関数(ACF)を返します。ラグ0(値は常に1)から始まります。
      • TRUE の場合:偏自己相関関数(PACF)を返します。ラグ1から始まります。

シミュレーションコード

以下に、ARMAacf の機能を確認するためのシミュレーションコードを示します。

このシミュレーションでは、以下の手順を実行します。

  1. 理論値の計算:

    • ARMAacf を使用して、特定のARMAモデルが持つ「理論的自己相関」を計算します。
  2. データの生成:

    • そのモデルに従う乱数データを arima.sim で生成します。
  3. 標本値の計算:

    • 生成されたデータから「標本自己相関」を計算します。
  4. 比較:

    • 理論値(ARMAacf)と標本値(シミュレーション結果)を重ねてプロットし、データ数が増えれば標本値が理論値に収束することを確認します。

今回は、AR項とMA項の両方を持つ ARMA(1, 1) モデルを使用します。

# パッケージの読み込み
library(ggplot2)

# 乱数シードの固定
seed <- 20260202
set.seed(seed)

# 1. ARMAモデルのパラメータ設定
# モデル: X_t = 0.8 * X_{t-1} + e_t + 0.6 * e_{t-1}
# AR係数 (phi) = 0.8: 正の自己相関を持ち、徐々に減衰する性質
# MA係数 (theta) = 0.6: 直近のノイズの影響を残す性質
ar_coef <- 0.8
ma_coef <- 0.6
max_lag <- 20

cat("--- モデル設定 ---\n")
cat(sprintf("AR係数: %.1f\n", ar_coef))
cat(sprintf("MA係数: %.1f\n", ma_coef))
cat(sprintf("最大ラグ: %d\n\n", max_lag))


# 2. ARMAacf を用いた理論的ACFの計算
theoretical_acf <- ARMAacf(ar = ar_coef, ma = ma_coef, lag.max = max_lag, pacf = FALSE)

# 3. シミュレーションによるデータの生成
# サンプルサイズを大きくするほど、理論値に近づきます
n_sample <- 10000
simulated_data <- arima.sim(model = list(ar = ar_coef, ma = ma_coef), n = n_sample)

# ggplot2で扱うためにデータフレームへ変換
df_ts_viz <- data.frame(
  Time = 1:length(simulated_data),
  Value = as.numeric(simulated_data)
)

# 3.1. 全期間のプロット(定常性の確認)
# データ全体を表示し、平均や分散が時間によって変化していないかを確認します
p_full <- ggplot(df_ts_viz, aes(x = Time, y = Value)) +
  geom_line(color = "steelblue", linewidth = 0.3) +
  geom_hline(yintercept = 0, color = "black", linetype = "dashed") +
  labs(
    title = "ARMA(1,1)プロセスの全期間プロット",
    x = "時間 (Time)",
    y = "値 (Value)"
  ) +
  theme_minimal()

print(p_full)

# 3.2. 最初の100時点の拡大プロット(挙動の確認)
# AR係数0.8の影響による「粘り気(前の値に引きずられる動き)」を確認します
p_zoom <- ggplot(df_ts_viz[1:100, ], aes(x = Time, y = Value)) +
  geom_line(color = "darkblue", linewidth = 0.8) +
  geom_point(size = 1.5, color = "darkblue", alpha = 0.6) +
  geom_hline(yintercept = 0, color = "black", linetype = "dashed") +
  labs(
    title = "最初の100時点の拡大プロット",
    x = "時間 (Time)",
    y = "値 (Value)"
  ) +
  theme_minimal()

print(p_zoom)
--- モデル設定 ---
AR係数: 0.8
MA係数: 0.6
最大ラグ: 20
Figure 1
Figure 2

Figure 1 からデータが0を中心に一定の幅(バンド)の中で推移していることが確認できます。

トレンド(右肩上がり等)や、発散(振幅がどんどん大きくなる)が見られないため、このデータは「定常(Stationary)」であると言えます。

Figure 2 から、点を結ぶ線を見ると、ジグザグと激しく上下する(ホワイトノイズ的)というよりは、「一度上がるとしばらく高い位置に留まり、下がると低い位置に留まる」という波のような動きが見て取れます。

これが AR係数=0.8 による強い「正の自己相関」の視覚的な特徴です。

# 4. 標本ACFの計算
# 標本ACFの計算 (stats::acf 関数を使用)
# plot = FALSE にすることで数値データのみ取得
sample_acf_obj <- acf(simulated_data, lag.max = max_lag, plot = FALSE)
sample_acf_vals <- as.numeric(sample_acf_obj$acf)

# 5. データの結合と可視化
# データフレームの作成
df_compare <- data.frame(
  Lag = 0:max_lag,
  Theoretical = as.numeric(theoretical_acf),
  Sample = sample_acf_vals
)

# 数値の確認(最初の5ラグ分)
cat("--- 自己相関の比較(先頭5ラグ)---\n")
print(head(df_compare, 6))
--- 自己相関の比較(先頭5ラグ)---
  Lag Theoretical    Sample
1   0   1.0000000 1.0000000
2   1   0.8931034 0.8920494
3   2   0.7144828 0.7139438
4   3   0.5715862 0.5756903
5   4   0.4572690 0.4667994
6   5   0.3658152 0.3822490

Lag 0 は自分自身との相関なので、常に 1.0 になります。

Lag 1 以降、Theoretical(理論値)と Sample(標本値)が近い値を示しています。

# プロットによる可視化
# 棒グラフ: 標本ACF (実際のデータから計算された値)
# 折れ線・点: 理論ACF (ARMAacfで計算された理論的相関構造)
p1 <- ggplot(df_compare, aes(x = Lag)) +
  # 標本ACF(棒グラフ)
  geom_bar(aes(y = Sample, fill = "標本ACF (シミュレーション)"),
    stat = "identity", width = 0.6, alpha = 0.6
  ) +
  # 理論ACF(折れ線と点)
  geom_line(aes(y = Theoretical, color = "理論ACF (ARMAacf)"),
    linewidth = 1
  ) +
  geom_point(aes(y = Theoretical, color = "理論ACF (ARMAacf)"),
    size = 3
  ) +

  # ゼロライン
  geom_hline(yintercept = 0, color = "black", linewidth = 0.5) +

  # 色の設定
  scale_fill_manual(name = "", values = c("標本ACF (シミュレーション)" = "skyblue")) +
  scale_color_manual(name = "", values = c("理論ACF (ARMAacf)" = "red")) +

  # ラベル設定
  labs(
    title = "ARMA(1,1)モデルにおける理論ACFと標本ACFの比較",
    x = "ラグ (Lag)",
    y = "自己相関 (Autocorrelation)"
  ) +
  theme_minimal() +
  theme(legend.position = "bottom")

print(p1)
Figure 3

Figure 3 から、関数 ARMAacf で計算された理論値(赤線)に、シミュレーション結果(青棒)が従っていること様子が見られ、関数 ARMAacf は、ARMAモデルの理論的な性質を捉えていることが確認できます。

以上です。