Rの関数:lagsarlm {spatialreg }

Rの関数から lagsarlm {spatialreg } を確認します。

関数 lagsarlm とは

lagsarlm は、空間的自己相関(Spatial Autocorrelation)を考慮した「空間ラグモデル(Spatial Lag Model)」を最尤法(Maximum Likelihood Estimation)により推定する関数です。

関数 lagsarlm の引数

library(spatialreg)
args(lagsarlm)
function (formula, data = list(), listw, na.action, Durbin, type, 
    method = "eigen", quiet = NULL, zero.policy = NULL, interval = NULL, 
    tol.solve = .Machine$double.eps, trs = NULL, control = list()) 
NULL
  1. formula

    • 回帰モデルの構造を定義する式です。
    • 従属変数と説明変数の関係を指定します(例: y ~ x1 + x2)。通常のlm関数と同様の形式を用います。
  2. data

    • formulaで指定された変数が格納されているデータフレームまたはリストです。
    • 分析対象となるデータセットを提供します。
  3. listw

    • spdepパッケージで作成されるlistwクラスの空間重み行列オブジェクトです。
    • 観測地点間の隣接関係と重みを定義します。当該オブジェクトを通じて、空間的な相互作用の構造がモデルに組み込まれます。
  4. na.action

    • 欠損値(NA)の処理方法を指定する関数です(例: na.fail, na.omit)。
    • データに欠損が含まれる場合の挙動を制御します。指定された関数に従い、分析から除外するなどの処理が行われます。
  5. Durbin

    • 空間ダービンモデル(Spatial Durbin Model)の仕様を指定する論理値または式です。
    • 説明変数の空間ラグ(隣接地域のXの影響)をモデルに含めるかを決定します。
      • TRUE: すべての説明変数の空間ラグを含めます。
      • 式(formula): 特定の説明変数の空間ラグのみを含めます。
      • FALSE(デフォルト): 説明変数の空間ラグを含めません(通常の空間ラグモデル)。
  6. type

    • モデルのタイプを明示的に指定する文字列です("lag", "mixed", "Durbin")。
    • Durbin引数との組み合わせでモデルの種類を決定します。Durbinが指定されると自動的に"mixed"として扱われます。
  7. method

    • 対数尤度関数のヤコビアン(\(|I - \rho W|\))を計算する手法を指定します。
    • 計算精度と速度のトレードオフを制御します。
      • "eigen"(デフォルト): 固有値を計算する正確な方法です。小・中規模データに適しています。
      • "Chebyshev", "LU"など: 大規模データ向けに近似計算や高速解法を用います。
  8. quiet

    • 実行経過のメッセージ表示を抑制するかを指定する論理値です。
    • コンソール出力を簡潔に保ちたい場合にTRUEを指定します。NULLの場合はグローバル設定に従います。
  9. zero.policy

    • 隣接地点を持たない「孤立点」がある場合の処理方針を指定する論理値です。
    • 孤立点を含むデータ(重み行列の行和が0)を許容する場合にTRUEとします。FALSEの場合、孤立点があるとエラー停止します。
  10. interval

    • 空間ラグパラメータ \(\rho\)の探索範囲を指定する数値ベクトルです。
    • 最適化計算において \(\rho\) が取り得る値の範囲を制限します。デフォルトでは重み行列の固有値に基づいて範囲が設定されます。
  11. tol.solve

    • 行列演算(逆行列計算等)における許容誤差(tolerance)です。
    • 数値計算上の特異性や不安定さを回避するために、極めて小さい値をゼロとみなす基準を設定します。
  12. trs

    • 重み行列のトレース(対角和)の計算済みベクトルです。
    • methodで近似手法(Chebyshev等)を選択した際、計算コストのかかるトレース計算をスキップするために利用されます。
  13. control

    • 最適化アルゴリズムの詳細設定を格納したリストです。
    • 収束判定基準(tol.opt)やヘッセ行列の計算方法など、数値最適化の微細な挙動を調整します。

シミュレーションコード

以下は、グリッドデータのサンプルを作成し、lagsarlmの挙動を確認するためのシミュレーションコードです。

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

サンプルデータの作成

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

# 乱数シードの固定(再現性確保のため)
seed <- 20251127
set.seed(seed)

# -----------------------------------------------------------------------------
# 1. 空間構造とサンプルデータの作成
# -----------------------------------------------------------------------------

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

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

# 近傍リスト(neighbours list)の作成:クイーン基準
# 縦・横・斜めの接するセルを隣接とみなします
nb <- cell2nb(side_length, side_length, type = "queen")

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

# データ生成計算用に、空間重み行列を疎行列形式(Sparse Matrix)に変換
W_mat <- as(listw_obj, "CsparseMatrix")

# -----------------------------------------------------------------------------
# 2. 真のモデルパラメータの設定
# -----------------------------------------------------------------------------

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

# 真の回帰係数 (beta)
beta_0 <- 2.0 # 切片
beta_1 <- 1.5 # X1の係数
beta_2 <- -0.8 # X2の係数

# 真の空間ラグパラメータ (rho)
rho_true <- 0.6

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

# -----------------------------------------------------------------------------
# 3. 従属変数 y の生成 (空間ラグモデルのデータ生成プロセス)
# -----------------------------------------------------------------------------

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

I_mat <- Diagonal(n)

# (I - rho * W) の逆行列を計算
# rhoが存在することで、yの値は隣接地域のyの値に依存することになります
inv_mat <- solve(I_mat - rho_true * W_mat)

# 線形予測子 (X * beta)
X_beta <- beta_0 + beta_1 * X1 + beta_2 * X2

# 従属変数 y を生成
y_vec <- as.vector(inv_mat %*% (X_beta + epsilon))

# 解析用データフレームの作成
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  13.35 9.18 16.86 10.39 7.41 ...
 $ x1     : num  4.38 5.02 5.26 1.92 1.53 ...
 $ x2     : num  1.822 9.344 0.519 2.063 6.394 ...
NULL

サンプルデータの可視化

# -----------------------------------------------------------------------------
# 4. データの可視化
# -----------------------------------------------------------------------------

p1 <- ggplot(sim_data, aes(x = x_coord, y = y_coord, fill = y)) +
  geom_tile() +
  scale_fill_viridis_c(option = "magma") +
  labs(
    title = "シミュレーションデータ: 従属変数 y の空間分布",
    subtitle = paste("真の空間ラグパラメータ rho =", rho_true),
    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

Figure 1 は、シミュレーションによって生成された従属変数 \(y\) の空間分布を可視化したヒートマップです。\(20 \times 20\) のグリッド(計400地点)上に値がプロットされています。

  • 座標軸:

    • 横軸(X座標)と縦軸(Y座標)は、それぞれの観測地点のグリッド上の位置を表しています。
  • 色の濃淡:

    • 右側の凡例(値)が示す通り、値が高いほど「明るい色(黄色~オレンジ)」、値が低いほど「暗い色(紫~黒)」で表現されています。
  • クラスターの形成:

    • Figure 1 全体を見渡すと、高い値(黄色)や低い値(紫)がランダムに散らばっているのではなく、ある程度の「塊(クラスター)」を形成している様子が見て取れます。
  • 隣接地点との類似性:

    • あるグリッドの色は、その隣接するグリッドの色と似通っている傾向があります。こちらは、数式 \(y = (I - \rho W)^{-1}(X\beta + \epsilon)\) における逆行列の効果により、ある地点のショックや特性が隣接地域へと波及し、空間的な滑らかさ(smoothness)が生まれているためです。
  • 説明変数の影響:

    • \(y\) の分布は空間的相互作用のみならず、説明変数 \(X_1, X_2\) の分布にも依存しています。本図に見られる全体的なグラデーションや局所的なパターンは、\(X\) の構造的要因と、空間重み行列 \(W\) による波及効果が合成された結果です。

もし \(\rho = 0\)(空間相関なし)であれば、色は不規則に混ざり合うはずです。しかし、Figure 1 では明らかな地域的なまとまりが確認できます。

モデルの推定と比較

通常の線形回帰モデル (OLS)
# -----------------------------------------------------------------------------
# 5. モデルの推定と比較
# -----------------------------------------------------------------------------

# (A) 通常の線形回帰モデル (OLS)
# 空間的自己相関を無視して推定を行います
model_ols <- lm(y ~ x1 + x2, data = sim_data)
cat("--- 通常の線形回帰モデル (OLS) ---\n")
summary(model_ols)
--- 通常の線形回帰モデル (OLS) ---

Call:
lm(formula = y ~ x1 + x2, data = sim_data)

Residuals:
    Min      1Q  Median      3Q     Max 
-4.7323 -1.2999 -0.0639  1.1799  7.3572 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  9.32774    0.25828   36.12   <2e-16 ***
x1           1.67796    0.04394   38.19   <2e-16 ***
x2          -0.83572    0.03036  -27.52   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.812 on 397 degrees of freedom
Multiple R-squared:  0.8282,    Adjusted R-squared:  0.8273 
F-statistic: 956.9 on 2 and 397 DF,  p-value: < 2.2e-16
空間ラグモデル (lagsarlm)
# (B) 空間ラグモデル (lagsarlm)
# 空間重み行列 listw を指定して、空間的相互作用を考慮します
model_sar <- lagsarlm(y ~ x1 + x2, data = sim_data, listw = listw_obj)
cat("--- 空間ラグモデル (lagsarlm) ---\n")
summary(model_sar)
--- 空間ラグモデル (lagsarlm) ---

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

Residuals:
      Min        1Q    Median        3Q       Max 
-2.454483 -0.608288 -0.051871  0.648733  2.798405 

Type: lag 
Coefficients: (asymptotic standard errors) 
             Estimate Std. Error  z value  Pr(>|z|)
(Intercept)  1.576548   0.259505   6.0752 1.238e-09
x1           1.523500   0.022948  66.3902 < 2.2e-16
x2          -0.780729   0.015609 -50.0172 < 2.2e-16

Rho: 0.61149, LR test value: 507.11, p-value: < 2.22e-16
Asymptotic standard error: 0.017655
    z-value: 34.637, p-value: < 2.22e-16
Wald statistic: 1199.7, p-value: < 2.22e-16

Log likelihood: -550.1844 for lag model
ML residual variance (sigma squared): 0.85795, (sigma: 0.92625)
Number of observations: 400 
Number of parameters estimated: 5 
AIC: 1110.4, (AIC for lm: 1615.5)
LM test for residual autocorrelation
test value: 1.7816, p-value: 0.18195
モデルの基本情報と残差 (Call, Residuals)
Call:lagsarlm(formula = y ~ x1 + x2, data = sim_data, listw = listw_obj)

Residuals:
      Min        1Q    Median        3Q       Max 
-2.454483 -0.608288 -0.051871  0.648733  2.798405 
Type: lag 
  • Residuals(残差):

    • モデルが説明しきれなかった誤差の分布です。Median(中央値)が -0.05 とほぼ 0 に近く、1Q(第1四分位数)と3Q(第3四分位数)の絶対値も近いため、残差はバランスよく正規分布に近い形状をしていると推測されます。
  • Type:

    • lag とあり、空間ラグモデル(SAR)として推定されたことが示されています。
回帰係数の推定 (Coefficients)
Coefficients: (asymptotic standard errors) 
             Estimate Std. Error  z value  Pr(>|z|)
(Intercept)  1.576548   0.259505   6.0752 1.238e-09
x1           1.523500   0.022948  66.3902 < 2.2e-16
x2          -0.780729   0.015609 -50.0172 < 2.2e-16

ここでは、説明変数 \(X\)\(y\) に与える直接的な影響(\(\beta\))が表示されています。

  • x1: 推定値は 1.5235 です。真の値は 1.5 でした。
  • x2: 推定値は -0.7807 です。真の値は -0.8 でした。
  • Intercept: 推定値は 1.5765 です。真の値は 2.0 でした。

x1 と x2 の係数は、真の値に近い値が推定されており、標準誤差(Std. Error)も小さく、p値(Pr(>|z|))は設定した有意水準を下回っています。

切片に関しては多少の乖離が見られますが、空間モデルにおいては、切片が空間的な波及効果の一部やノイズを吸収することがあり、許容範囲内と言えます。

空間ラグパラメータ (Rho)
Rho: 0.61149, LR test value: 507.11, p-value: < 2.22e-16
Asymptotic standard error: 0.017655
    z-value: 34.637, p-value: < 2.22e-16
Wald statistic: 1199.7, p-value: < 2.22e-16
  • Rho (推定値): 0.61149

    • シミュレーションで設定した真の値 0.6 に近い値です。隣接地域からの波及効果を特定できています。
  • LR test value / Wald statistic:

    • 尤度比検定(LR test)およびワルド検定の結果です。どちらもp値が < 2.22e-16 と設定した有意水準を下回っています。
    • 当該結果は、「\(\rho = 0\)(空間的自己相関はない)」という帰無仮説が棄却されることを意味します。すなわち、このデータには統計的に有意な空間的依存性が存在することを示唆しています。
モデルの当てはまり (Model Fit)
Log likelihood: -550.1844 for lag model
ML residual variance (sigma squared): 0.85795, (sigma: 0.92625)
Number of observations: 400 
Number of parameters estimated: 5 
AIC: 1110.4, (AIC for lm: 1615.5)
  • AIC (赤池情報量基準):

    • 空間ラグモデルのAIC: 1110.4
    • 線形回帰モデル(lm)のAIC: 1615.5
    • AICは値が小さいほどモデルの予測精度が良いとされます。ここでは空間ラグモデルの方が小さい値を示しています。
残差の診断 (LM test for residual autocorrelation)
LM test for residual autocorrelation
test value: 1.7816, p-value: 0.18195
  • 意味:

    • モデル推定後の「残差」に、まだ空間的自己相関が残っているかを確認する検定です。
  • 結果:

    • p値が 0.18195 であり、設定した有意水準を上回っています。
  • 解釈:

    • 帰無仮説(残差に空間相関はない)を棄却できません。これは、「モデルに取り込んだ Rho(空間ラグ項)によって空間的な依存性は説明され、残差はホワイトノイズになっている」ことを意味します。

考察

# -----------------------------------------------------------------------------
# 6. 結果の表示と考察
# -----------------------------------------------------------------------------

cat("----------------------------------------------------------------\n")
cat("【推定結果の比較】\n")
cat("真のパラメータ:\n")
cat(sprintf(
  "  (Intercept): %.2f\n  x1:          %.2f\n  x2:          %.2f\n  rho:         %.2f\n",
  beta_0, beta_1, beta_2, rho_true
))
cat("----------------------------------------------------------------\n")

cat("\n(A) 通常の最小二乗法 (OLS) の結果:\n")
# OLSの係数表を表示(空間相関のバイアスが含まれる可能性があります)
print(summary(model_ols)$coefficients[, 1:2])

cat("\n(B) 空間ラグモデル (lagsarlm) の結果:\n")
# summaryオブジェクトの取得
sum_sar <- summary(model_sar)

# 係数表の表示
# sum_sar$Coef を使用して、推定値と標準誤差を抽出します
print(sum_sar$Coef[, 1:2])

cat(sprintf(
  "\n推定された空間ラグパラメータ rho: %.4f (標準誤差: %.4f)\n",
  model_sar$rho, model_sar$rho.se
))
----------------------------------------------------------------
【推定結果の比較】
真のパラメータ:
  (Intercept): 2.00
  x1:          1.50
  x2:          -0.80
  rho:         0.60
----------------------------------------------------------------

(A) 通常の最小二乗法 (OLS) の結果:
              Estimate Std. Error
(Intercept)  9.3277446 0.25828185
x1           1.6779550 0.04393952
x2          -0.8357232 0.03036458

(B) 空間ラグモデル (lagsarlm) の結果:
              Estimate Std. Error
(Intercept)  1.5765484 0.25950454
x1           1.5235001 0.02294765
x2          -0.7807293 0.01560922

推定された空間ラグパラメータ rho: 0.6115 (標準誤差: 0.0177)

このシミュレーションの真のパラメータは以下の通りでした。

  • 切片 (Intercept): 2.0
  • x1: 1.5
  • x2: -0.8
  • rho (空間ラグ): 0.6

これを踏まえて、2つのモデルの結果を比較します。

通常の最小二乗法 (OLS) の結果について
              Estimate Std. Error
(Intercept)  9.3277446 0.25828185
x1           1.6779550 0.04393952
x2          -0.8357232 0.03036458

結果の解釈

OLSの推定結果は、lagsarlmの結果と比較して、真の値から大きく乖離しています。

特に切片(Intercept)に注目しますと、真の値が 2.0 であるのに対し、OLSでは 9.33大きな値が推定されています。

また、x11.68(真の値1.5)、x2-0.84(真の値-0.8)と、lagsarlmの結果と比較して、係数の推定に歪み(バイアス)が生じています。

データには「隣接地域の影響を受ける(\(\rho = 0.6\))」という強い空間的相互作用が含まれていますが、OLSはこの \(\rho Wy\) という項をモデルに含んでいません(欠落変数)。

それゆえ、本来は「隣接地域からの波及効果」として説明されるべき \(y\) の変動部分が、誤って切片や他の説明変数の効果として吸収されてしまっています(欠落変数バイアス)。

空間ラグモデル (lagsarlm) の結果について
              Estimate Std. Error
(Intercept)  1.5765484 0.25950454
x1           1.5235001 0.02294765
x2          -0.7807293 0.01560922
推定された空間ラグパラメータ rho: 0.6115 (標準誤差: 0.0177)

結果の解釈

一方、lagsarlm による推定結果は、真の構造をOLSよりも正確に捉えています。

  • x1: 1.52(真の値 1.5 にOLSよりも近い)
  • x2: -0.78(真の値 -0.8 にOLSよりも近い)
  • rho: 0.61(真の値 0.6 に近い)

切片(Intercept)も 1.58 となり、OLSの 9.33 と比較して、真の値 2.0 に近い水準まで補正されています。

lagsarlm は、モデル式 \(y = \rho W y + X \beta + \epsilon\) を用いて推定を行い、空間的な波及効果(\(\rho\))を明示的にモデルに組み込んでいるため、説明変数 \(X\) の係数(\(\beta\))から「空間的な相関によるノイズ」が分離され、純粋な \(X\) の影響力を正しく推定できています。

以上です。