Rの関数:lagsarlm(type = “mixed”) {spatialreg }

Rの関数から lagsarlm(type = “mixed”) {spatialreg } を確認します。

本ポストはこちらの続きです。

Rの関数:lagsarlm {spatialreg }
const typesetMath = (el) => { if (window.MathJax) { // MathJax Typeset window.MathJax.typeset(); } else if (window.katex...

spatialregパッケージの関数 lagsarlm において、引数 type = "mixed" を指定することは、空間ダービンモデル(Spatial Durbin Model: SDM) を推定することを意味します。

当該モデルは、従属変数の空間ラグ(\(\rho Wy\))だけでなく、説明変数の空間ラグ(\(WX \gamma\))もモデルに組み込みます。

すなわち、ある地点の成果が、隣接地域の成果だけでなく、隣接地域の説明変数からも影響を受けるという仮定を置くモデルです。

数式は以下の通りです。

\[ y = \rho W y + X \beta + W X \gamma + \epsilon \]

ここで、\(\gamma\) は、隣接地域の説明変数が及ぼす影響を表す係数です。

以下は、この構造を持つサンプルデータを生成し、lagsarlm(type = "mixed") の挙動を確認するためのシミュレーションコードです。

なお、有意水準は5%とします。

空間構造と空間重み行列の作成

# 必要なパッケージの読み込み
library(spdep)
library(spatialreg)
library(Matrix)
library(ggplot2)

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

# グリッドサイズの設定(20x20 = 400地点)
side_length <- 20
n <- side_length * side_length

# 座標データの作成
coords <- expand.grid(x = 1:side_length, y = 1:side_length)

# 近傍リストの作成(クイーン基準)
nb <- cell2nb(side_length, side_length, type = "queen")

# 空間重み行列(listwオブジェクト)の作成:行規格化
listw_obj <- nb2listw(nb, style = "W")
W_mat <- as(listw_obj, "CsparseMatrix")

説明変数およびその空間ラグの生成

# 説明変数 X1, X2 の生成
X1 <- rnorm(n, mean = 10, sd = 2)
X2 <- runif(n, min = 0, max = 5)

# 説明変数の空間ラグ (WX) を計算
# 隣接地域の説明変数の平均値が、自地域に影響を与えると仮定します
WX1 <- as.vector(W_mat %*% X1)
WX2 <- as.vector(W_mat %*% X2)

真のモデルパラメータの設定 (空間ダービンモデル)

# 回帰係数 (beta): 自地域の説明変数が及ぼす直接的な影響
beta_0 <- 3.0 # 切片
beta_1 <- 1.5 # X1の係数
beta_2 <- -2.0 # X2の係数

# 空間ラグ係数 (gamma): 隣接地域の説明変数が及ぼす影響
gamma_1 <- 0.8 # WX1の係数 (正のスピルオーバー)
gamma_2 <- -1.5 # WX2の係数 (負のスピルオーバー)

# 空間自己回帰パラメータ (rho): 隣接地域の従属変数が及ぼす影響
rho_true <- 0.5

# 誤差項 (epsilon)
epsilon <- rnorm(n, mean = 0, sd = 1)

従属変数 y の生成

# モデル式: y = rho * Wy + X * beta + WX * gamma + epsilon
# 変形: (I - rho * W) * y = X * beta + WX * gamma + epsilon
# 解: y = (I - rho * W)^(-1) * (X * beta + WX * gamma + epsilon)

# 右辺の構造部分 (Trend + Lagged X + Error)
# ここで WX1, WX2 の項を含めて SDM のデータ生成プロセスとします
X_terms <- beta_0 + beta_1 * X1 + beta_2 * X2
WX_terms <- gamma_1 * WX1 + gamma_2 * WX2
total_disturbance <- X_terms + WX_terms + epsilon

# 逆行列による y の算出
I_mat <- Diagonal(n)
inv_mat <- solve(I_mat - rho_true * W_mat)
y_vec <- as.vector(inv_mat %*% total_disturbance)

# 解析用データフレームの作成
sim_data <- data.frame(
  id = 1:n,
  x_coord = coords$x,
  y_coord = coords$y,
  y = y_vec,
  x1 = X1,
  x2 = X2
)

# 生成したサンプルデータの一部を確認
cat("--- 生成したサンプルデータの一部を確認 ---\n")
print(str(sim_data))
--- 生成したサンプルデータの一部を確認 ---
'data.frame':   400 obs. of  6 variables:
 $ id     : int  1 2 3 4 5 6 7 8 9 10 ...
 $ x_coord: int  1 2 3 4 5 6 7 8 9 10 ...
 $ y_coord: int  1 1 1 1 1 1 1 1 1 1 ...
 $ y      : num  27.8 31.7 34.8 28.3 30.8 ...
 $ x1     : num  8.18 9.07 10.81 9.99 6.1 ...
 $ x2     : num  3.84 2.65 1.4 4.25 1.49 ...
NULL

通常の空間ラグモデル(SAR)の生成式に加え、WX_terms\(W X \gamma\))という項を追加しています。

WX1WX2 は、隣接グリッドの \(X\) の平均値(重み付き和)です。データ生成段階でこの項を加えることで、「隣の家の \(X\) が大きいと、自分の家の \(y\) も高くなる(あるいは低くなる)」 という空間ダービンモデルの構造を作り出しています。

データの可視化

p1 <- ggplot(sim_data, aes(x = x_coord, y = y_coord, fill = y)) +
  geom_tile() +
  scale_fill_viridis_c(option = "plasma") +
  labs(
    title = "シミュレーションデータ: 従属変数 y の空間分布 (Spatial Durbin Model)",
    subtitle = paste("rho =", rho_true, ", gamma1 =", gamma_1, ", gamma2 =", gamma_2),
    x = "X 座標", y = "Y 座標", fill = "値"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(family = "sans", face = "bold"),
    axis.title = element_text(family = "sans")
  )

print(p1)
Figure 1

モデルの推定 (type = “mixed”)

lagsarlm(..., type = "mixed") を実行しています。この設定により、Rは自動的に説明変数 \(X_1, X_2\) の空間ラグ \(WX_1, WX_2\) を計算し、説明変数としてモデルに追加します。

# lagsarlm 関数で type = "mixed" を指定
# こちらも Durbin = TRUE と指定することと同義です
model_sdm <- lagsarlm(y ~ x1 + x2, data = sim_data, listw = listw_obj, type = "mixed")

summary(model_sdm)

Call:lagsarlm(formula = y ~ x1 + x2, data = sim_data, listw = listw_obj,     type = "mixed")

Residuals:
      Min        1Q    Median        3Q       Max 
-2.534328 -0.662798  0.023382  0.624227  2.714906 

Type: mixed 
Coefficients: (asymptotic standard errors) 
             Estimate Std. Error  z value  Pr(>|z|)
(Intercept)  2.820246   1.000749   2.8181   0.00483
x1           1.489531   0.026538  56.1286 < 2.2e-16
x2          -1.956564   0.037965 -51.5365 < 2.2e-16
lag.x1       0.793247   0.118906   6.6712 2.537e-11
lag.x2      -1.566345   0.167936  -9.3271 < 2.2e-16

Rho: 0.51159, LR test value: 150.34, p-value: < 2.22e-16
Asymptotic standard error: 0.037766
    z-value: 13.546, p-value: < 2.22e-16
Wald statistic: 183.51, p-value: < 2.22e-16

Log likelihood: -563.1277 for mixed model
ML residual variance (sigma squared): 0.93628, (sigma: 0.96762)
Number of observations: 400 
Number of parameters estimated: 7 
AIC: 1140.3, (AIC for lm: 1288.6)
LM test for residual autocorrelation
test value: 0.2192, p-value: 0.63965

結果の表示と考察

cat("----------------------------------------------------------------\n")
cat("【推定結果の比較: 空間ダービンモデル (SDM)】\n")
cat("----------------------------------------------------------------\n")
cat("真のパラメータ設定:\n")
cat(sprintf("  (Intercept): %.2f\n", beta_0))
cat(sprintf("  x1 (beta):   %.2f\n", beta_1))
cat(sprintf("  x2 (beta):   %.2f\n", beta_2))
cat(sprintf("  lag.x1 (gamma): %.2f\n", gamma_1))
cat(sprintf("  lag.x2 (gamma): %.2f\n", gamma_2))
cat(sprintf("  rho:         %.2f\n", rho_true))
cat("----------------------------------------------------------------\n")

cat("\n(B) lagsarlm(type = 'mixed') の推定結果:\n")
# summaryオブジェクトの取得
sum_sdm <- summary(model_sdm)

# 推定された係数表 (Coef)
# ここには X の係数だけでなく、lag.X (WX) の係数も表示されます
print(sum_sdm$Coef[, 1:2])

cat(sprintf(
  "\n推定された空間自己回帰パラメータ rho: %.4f (標準誤差: %.4f)\n",
  model_sdm$rho, model_sdm$rho.se
))
----------------------------------------------------------------
【推定結果の比較: 空間ダービンモデル (SDM)】
----------------------------------------------------------------
真のパラメータ設定:
  (Intercept): 3.00
  x1 (beta):   1.50
  x2 (beta):   -2.00
  lag.x1 (gamma): 0.80
  lag.x2 (gamma): -1.50
  rho:         0.50
----------------------------------------------------------------

(B) lagsarlm(type = 'mixed') の推定結果:
              Estimate Std. Error
(Intercept)  2.8202457 1.00074887
x1           1.4895306 0.02653780
x2          -1.9565642 0.03796463
lag.x1       0.7932475 0.11890599
lag.x2      -1.5663452 0.16793556

推定された空間自己回帰パラメータ rho: 0.5116 (標準誤差: 0.0378)

回帰係数と空間ラグ係数の評価 (Coefficients)

  • 直接効果(自地域の要因):

    • x1: 推定値 1.49(真の値 1.50
    • x2: 推定値 -1.96(真の値 -2.00
    • 自地域の説明変数が及ぼす影響 \(\beta\) は、ほぼ復元されています。
  • 間接効果・スピルオーバー(隣接地域の要因):

    • lag.x1: 推定値 0.79(真の値 0.80
    • lag.x2: 推定値 -1.57(真の値 -1.50
    • lag.x と表示されている項目は、隣接地域の説明変数が自地域に及ぼす影響(パラメータ \(\gamma\))を表します。推定結果は真の値に近く、隣接地域からの波及効果を特定できています。
  • 切片:

    • 推定値 2.82(真の値 3.00)。標準誤差が 1.00 とやや大きいですが、p値 0.00483 は設定した有意水準を下回っています。

空間自己回帰パラメータ (Rho) の評価

  • Rho: 推定値 0.5116(真の値 0.50
  • 有意性: p値は < 2.22e-16 と設定した有意水準を下回っています。
  • SDMにおいては、説明変数の空間ラグ(\(WX\))と従属変数の空間ラグ(\(Wy\))の双方がモデルに含まれます。この状況下でも、lagsarlm は従属変数の空間的相互作用 \(\rho\) を、他の効果と混同することなく分離・推定しています。

モデルの適合度と診断

  • AIC (赤池情報量基準):

    • 空間ダービンモデル: 1140.3
    • 通常の線形回帰 (lm): 1288.6
    • SDMの方が通常の回帰モデルよりもAICが改善しています。
  • 残差の自己相関検定 (LM test for residual autocorrelation):

    • p値: 0.63965
    • 帰無仮説(残差に空間相関はない)を棄却できません。これは、モデルがデータの空間的なパターンを十分に吸い上げ、残差がホワイトノイズになっていることを意味します。

結論

この結果から、lagsarlm(type = "mixed") を用いることで、以下の3つの異なる効果を同時に識別できることが確認されました。

  1. 自地域の属性がもたらす直接的な効果(\(\beta\)
  2. 隣接地域の属性がもたらす外部性・スピルオーバー効果(\(\gamma\)
  3. 隣接地域の成果(従属変数)からのフィードバック効果(\(\rho\)

以上です。