Scott & Varian (2015) Bayesian variable selection for nowcasting economic time series.
Scott & Varian (2014) Predicting the present with Bayesian structural time series.
統計学者Steven Scottと経済学者Hal Varianが提案したnowcastingモデル(直近の予測や現時点の欠測値を予測することもできる)
説明変数が多次元の状態空間モデルで、Lassoのように説明変数の選択を行う仕組み(spike and slab事前分布)を導入している
モデル¶
構造時系列モデル(状態空間モデル)
観測方程式:
状態方程式:
状態の構成要素¶
局所線形トレンド(local linear trend)¶
:水準
:傾き
季節成分(Seasonality)¶
は季節数(例:なら曜日効果)
総和がゼロになるように構成
回帰成分(Regression Component)¶
静的または動的係数による回帰
静的:
動的:
Spike-and-Slab 事前分布¶
Spike-and-Slab事前分布はベイズ線形回帰などで変数選択に用いられるスパース事前分布
:スパイク部分(変数選択)¶
各変数が選ばれる確率(inclusion probability)に関する事前分布。独立ベルヌーイ分布を仮定する。
スパイク部分では、各説明変数 がモデルに含まれるかをベルヌーイ確率変数で表します。
ここで、 は 変数 がモデルに含まれる事前確率で、一般には期待されるモデルサイズ に基づき、
のように設定される(ただし、特定変数を必ず含めたい場合は とするなど調整可能)。
:スラブ部分(係数分布)¶
モデルに採用された変数( のもの)の回帰係数ベクトル に対して、共役な正規分布を事前として与える。
ここで:
は事前平均ベクトル(多くの場合 に設定)
は回帰係数の事前精度行列(Zellner の g-prior に基づく)
Zellner の g-prior に基づく精度構造¶
は回帰係数の事前精度行列で、Zellner (1986) による g-prior を用いて次のように設定される。
:データ情報量に対するスケール(「 個分の観測情報を持つ」という意味)
: 全体とその対角要素の重み付け比率(安定性を確保するため導入)
この構造により、 が非正定値の場合でも事前分布の正則性(propriety)が保証される。
残差分散の事前分布¶
残差分散 に対しては、共役な逆ガンマ分布を仮定します。
ここで、ハイパーパラメータは次のように設定されます:
: 擬似的な「観測数(情報量)」
( は事前的に期待される決定係数、 は目的変数の分散)
| 成分 | 役割 | 分布 |
|---|---|---|
| 変数選択(スパイク) | 独立ベルヌーイ分布 | |
| 採用変数の係数(スラブ) | 正規分布 | |
| 誤差分散 | ガンマ分布 |
これにより、
重要な変数だけを自動的に選択し(スパイク)
採用された係数に対して柔軟なガウス的事前を与える(スラブ)
Source
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
# ===== パラメータ設定 =====
pi = 0.2 # inclusion probability (π)
n = 100 # サンプルサイズ
g = 100 # Zellner's g-prior parameter
sigma_eps = 1.0 # 誤差分散 σ_ε
XTX_diag = 5.0 # X'X の代表的スケール(単純化のため1次元想定)
# Zellnerのg-priorに基づくスラブ分散
slab_var = sigma_eps**2 * g / n / XTX_diag
slab_std = np.sqrt(slab_var)
# スパイク部分:δ(0)を幅の狭い正規分布で近似
spike_std = 0.05
w = np.linspace(-3, 3, 400)
# 確率密度の計算
spike_pdf = (1 - pi) * norm.pdf(w, 0, spike_std)
slab_pdf = pi * norm.pdf(w, 0, slab_std)
spike_slab_pdf = spike_pdf + slab_pdf
# ===== 可視化 =====
plt.figure(figsize=(5, 3), dpi=100)
plt.plot(w, spike_pdf, "--", label="Spike (excluded, ρ=0)", alpha=0.6)
plt.plot(w, slab_pdf, "--", label="Slab (included, ρ=1)", alpha=0.6)
plt.plot(w, spike_slab_pdf, label="Spike-and-slab prior", linewidth=2, alpha=0.6)
plt.title("Spike-and-Slab Prior")
plt.xlabel("Coefficient value $β_j$")
plt.ylabel("Density")
plt.legend()
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()

参考¶
- Scott, S. L., & Varian, H. R. (2014). Predicting the present with Bayesian structural time series. International Journal of Mathematical Modelling and Numerical Optimisation, 5(1/2), 4. 10.1504/ijmmno.2014.059942