1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DMLの原理と実践③:時系列データにDMLを適用するときに考えること

1
Last updated at Posted at 2026-08-13

はじめに

 前々回の記事では,Double/Debiased Machine Learning(以下,DML)をFWL定理の延長として捉え,部分線形回帰モデルにおいてアウトカムと処置の双方から共変量によって予測可能な部分を取り除くという考え方を説明した.

 前回の記事では,その背後にあるネイマン直交性(Neyman Orthogonality),交差適合(Cross-Fitting),さらにDML推定量の漸近正規性について整理した.

 今回は,このDMLを時系列データに適用するには何を考えればよいのかについて考える.時系列データを分析していると,系列相関(Serial Correlation),トレンド(Trend),季節性(Seasonality),ラグ構造,内生性(Endogeneity)など,クロスセクションデータでは前面に出てこなかった問題が現れる.しかし,これらが存在するからといって,DMLが適用できないというわけではない.むしろ重要なのは,DMLのどの部分がi.i.d.データを前提としており,その部分を時系列解析の考え方でどのように置き換えればよいのかを理解することである.
 例えば,時点$t=1,2,\cdots,T$について,アウトカムを$Y_{t}$,関心のある変数を$D_t$,その他の共変量を$\boldsymbol{X}_t$として,次の部分線形回帰モデルを考える.

$$
Y_t = D_t\theta_{0} + g_{0}(\boldsymbol{X}_t) + U_t
$$

 クロスセクションデータの場合と同様に,$g_{0}(\boldsymbol{X}_t)$を線形関数に限定したくなければ,ランダムフォレストや勾配ブースティング,Lassoなどを使って柔軟に推定することができる.DMLの基本的な役割は,そのような複雑な局外母数を推定しながらも,関心のある低次元パラメータ$\theta_{0}$について通常の統計的推論を可能にすることである.
 時系列になっても,この基本的な発想は変わらない.変わるのは,大数の法則や中心極限定理をどのような依存構造のもとで利用するか,交差適合を時間的依存のもとでどのように行うか,標準誤差に系列相関をどのように反映するか,トレンドや季節性,単位根などをモデルの中でどう扱うか,そして処置の内生性をどのような情報集合のもとで考えるか,という部分である.
 最近では,Ciganovic et al.(2026)がDMLを時系列データへ拡張し,時系列に適した交差適合と,長期分散を用いた推論を理論化している.同論文は,通常のランダムな交差適合を時系列へそのまま適用すると,系列の依存構造を通じた情報漏洩が生じ得ることを指摘し,時間的依存を明示的に考慮した枠組みを提示している.
 ただし,この記事の目的はこの論文を解説することではなく,より基本的な立場から,「DMLは,時系列モデルの代わりになるものではなく,時系列モデルの中に存在する複雑な局外関数を柔軟に推定しながら,関心のあるパラメータについて推論するためのアプローチである」という見方を採用する.この視点に立つと,時系列DMLと古典的な時系列分析の関係はかなり見通しよく整理できる.

モデルの特定とパラメータの推定を分けて考える

 まず,データ分析を大きく,

  1. モデルの特定
  2. パラメータの推定と統計的推論

の2つに分けて考える.これは時系列データにDMLを適用するときに特に重要である.例えば,

$$
Y_t = D_t\theta_{0} + g_{0}(\boldsymbol{X}_t) + U_t
$$

というモデルを書いた時点で,既にモデルの特定は始まっている.$D_t$の効果は当期だけに現れるのか.過去の$Y_{t-1}$を条件付けるべきなのか.季節性は決定論的なのか確率的なのか.トレンドは存在するのか.$D_t$は過去のアウトカムに反応して決定されているのか.構造変化はないのか.これらはDMLが自動的に決めてくれる問題ではない.
 通常のARモデルでも,

$$
Y_t = \phi_{1}Y_{t-1} + \cdots + \phi_{p}Y_{t-p} + U_t
$$

と書く前に,定常性,ラグ次数,季節性,トレンドなどについて考える.DMLでも基本的には同じである.
 一方,DMLが主として関わるのは2つ目である.例えば,

$$
Y_t = D_t\theta_{0} + \boldsymbol{X}_t^{\top}\boldsymbol{\beta}_{0} + U_t
$$

と線形性を仮定できるのであれば,通常の回帰分析と時系列に適した標準誤差を用いればよい.しかしながら,

$$
Y_t = D_t\theta_{0} + g_{0}(\boldsymbol{X}_t) + U_t
$$

として,$g_{0}$を線形関数に限定したくない場合には事情が変わる.DMLは,$g_{0}$や後述する$m_{0}(\boldsymbol{X}_t)=\mathbb{E}[D_t\mid\boldsymbol{X}_t]$を機械学習によって柔軟に推定しつつ,$\theta_{0}$についての推論を保つための方法である.
 したがって,時系列DMLを理解するときには,「時系列モデルの特定+DMLによる局外母数の柔軟な推定」と分けて考えるとよい.

時系列版の部分線形回帰モデル

 時点$t=1,2,\cdots,T$について,

$$
W_t = \left(Y_t,D_t,\boldsymbol{X}_t\right)
$$

を観測するとする.以下の部分線形回帰モデルを考える.

$$
Y_t = D_t\theta_{0} + g_{0}(\boldsymbol{X}_t) + U_t
$$

$$
\mathbb{E}\left[U_t\mid D_t,\boldsymbol{X}_t\right] = 0
$$

 また,

$$
D_t = m_{0}(\boldsymbol{X}_t) + V_t
$$

$$
\mathbb{E}\left[V_t\mid\boldsymbol{X}_t\right] = 0
$$

とする.ここで,

$$
m_{0}(\boldsymbol{X}_t) = \mathbb{E}\left[D_t\mid\boldsymbol{X}_t\right]
$$

である.さらに,

$$
\ell_{0}(\boldsymbol{X}_t) = \mathbb{E}\left[Y_t\mid\boldsymbol{X}_t\right]
$$

とする.すると,

$$
\tilde{Y}_t = Y_t - \ell_{0}(\boldsymbol{X}_t)
$$

$$
\tilde{D}_t = D_t - m_{0}(\boldsymbol{X}_t)
$$

として,

$$
\tilde{Y}_t = \theta_{0}\tilde{D}_t + U_t
$$

を得る.
 前々回の記事で扱ったFWL定理と同じ構造である.$\boldsymbol{X}_t$から予測できる$Y_t$と$D_t$の部分を取り除き,残った変動同士から$\theta_{0}$を推定する.Ciganovic et al.(2026)も,時系列におけるDMLをこの部分線形回帰モデルの形から出発し,低次元パラメータ$\theta_{0}$を,高次元あるいは複雑な局外母数のもとで推定する問題として定式化している.
 したがって,時系列になったことでPartialling-outの考え方そのものが変わるわけではない.重要になるのは,$W_{1}, \cdots , W_{T}$が独立ではないという点である.

時系列DMLの中心問題は「依存」である

 クロスセクションデータに対するDMLでは,観測値$W_1,W_2,\cdots,W_n$をi.i.d.として扱っていた.時系列では,$W_t$と$W_{t-h}$の間に依存が存在する.しかし,依存が存在することと,統計的推論ができないことは同義ではない.通常の時系列解析でも,AR,MA,VARなどのモデルでは観測値は独立ではない.それでも,定常性,エルゴード性,Mixingなどの弱依存条件のもとで,大数の法則や中心極限定理を利用する.
 DMLでも基本的には同じである.前回の記事で見たように,適切な条件のもとではDML推定量は,

$$
\sqrt{T}\left(\hat{\theta}-\theta_{0}\right) = -A^{-1}\dfrac{1}{\sqrt{T}}\sum_{t=1}^{T}\psi_t + o_P(1)
$$

という漸近線形表現を持つ.ここで,

$$
\psi_t = \psi\left(W_t;\theta_{0},\eta_{0}\right)
$$

は真の局外母数を用いたオラクルスコア(Oracle Score)であり,

$$
A = \mathbb{E}\left[\partial_{\theta}\psi\left(W_t;\theta_{0},\eta_{0}\right)\right]
$$

である.したがって,時系列データで重要になるのは,

$$
\dfrac{1}{\sqrt{T}}\sum_{t=1}^{T}\psi_t
$$

について中心極限定理が成立するかである.

生データの自己相関よりもスコア過程を見る

 ここで,時系列DMLについて重要な点が1つある.$Y_t$や$D_t$そのものに自己相関があるからといって,直ちにDMLによる推論が難しくなるわけではない.最終的な漸近分布を決めるのは,$\psi_t$という直交化スコア過程(Orthogonal Score Process)である.
 部分線形回帰モデルのPartialling-outスコアならば,

$$
\psi_t = \left[Y_t-\ell_{0}(\boldsymbol{X}_t)-\theta_{0}{D_t-m_{0}(\boldsymbol{X}_t)}\right]{D_t-m_{0}(\boldsymbol{X}_t)}
$$

である.したがって,時系列DMLの推論を考えるときに本質的なのは,

$$
\operatorname{Cov}\left(\psi_t,\psi_{t-h}\right)
$$

である.
 例えば,$Y_t$自体には非常に強い自己相関があっても,$\boldsymbol{X}_t$に十分な状態変数やラグを含めた結果,$\psi_t$の系列依存が弱くなることもあり得る.逆に,$Y_t$のACFだけを見ると問題がなさそうでも,局外モデルが動学構造を十分に吸収しておらず,$\psi_t$に強い系列相関が残ることもある.

時系列版の中心極限定理

 オラクルスコアの自己共分散を,

$$
\Gamma(h) = \operatorname{Cov}\left(\psi_t,\psi_{t-h}\right)
$$

とする.そして,長期分散(Long-Run Variance)を,

$$
\Omega = \sum_{h=-\infty}^{\infty}\Gamma(h)
$$

とする.例えば,

$$
\sum_{h=-\infty}^{\infty}\left|\Gamma(h)\right| < \infty
$$

のように依存が十分速く減衰し,さらに適切なモーメント条件が成立していれば,

$$
\dfrac{1}{\sqrt{T}}\sum_{t=1}^{T}\psi_t \xrightarrow{d} \mathcal{N}(0,\Omega)
$$

を得ることができる.したがって,

$$
\sqrt{T}\left(\hat{\theta}-\theta_{0}\right) \xrightarrow{d} \mathcal{N}\left(0,A^{-1}\Omega A^{-1}\right)
$$

となる.
 Ciganovic et al.(2026)は,オラクルスコアについて有限の長期分散を仮定するとともに,その部分和過程について関数型中心極限定理(Functional Central Limit Theorem:FCLT)を仮定している.十分条件として,Summableな$\alpha$-mixingなども挙げられている.
 ここで重要なのは,DML独自の特殊な中心極限定理を使うという話ではないことである.通常の時系列解析と同様に,対象となる確率過程が十分な弱依存性を持ち,大数の法則や中心極限定理が利用できる状況に問題を落とし込む.DMLで違うのは,中心極限定理を適用する対象が,単純な回帰誤差ではなく,ネイマン直交スコアであるという点である.

トレンドについて考える

 時系列データにDMLを適用するとき,トレンドは明示的に考える必要がある.例えば,

$$
Y_t = \alpha_Y + \beta_Y t + \varepsilon_{Y,t}
$$

$$
D_t = \alpha_D + \beta_D t + \varepsilon_{D,t}
$$

のように,$Y_t$と$D_t$がともに時間とともに増加しているとする.このとき,$\theta_{0}=0$であっても,$Y_t$と$D_t$の間には強い相関が生じる.DMLでランダムフォレストや勾配ブースティングを使ったとしても,トレンドの存在を無視してよいことにはならない.

決定論的トレンド

 決定論的トレンド(Deterministic Trend)であれば,$t$や$t^2$などを$\boldsymbol{X}_t$へ含める方法が考えられる.より柔軟に$f(t)$をスプラインなどで推定してもよい.例えば,

$$
\boldsymbol{X}_{t} = \left(X_{1t},\cdots,X_{pt},t\right)
$$

とし,局外関数$g_{0}(\boldsymbol{X}_t)$にトレンドを吸収させることができる.ただし,これはあくまで決定論的なトレンドを扱っていることに注意が必要である.

確率的トレンドと単位根

 より注意が必要なのが,確率的トレンド(Stochastic Trend)である.例えば,

$$
Y_t = Y_{t-1} + \varepsilon_t
$$

のような単位根過程(Unit Root Process)を考える.この場合,$Y_t$は定常ではない.
 もし$Y_t$と$D_t$が互いに独立なランダムウォークであっても,水準同士を回帰すると高い$R^2$や見かけ上有意な係数が得られることがある.これは古典的な見せかけの回帰(Spurious Regression)の問題である.
 この問題はDMLを使っただけでは解決しない.機械学習モデルが非線形であることと,単位根を持つ確率過程の漸近論が成立することは別の話だからである.
 したがって,対象となる系列に単位根が疑われる場合には,差分を取る,対数差分を取る,成長率へ変換する,あるいは共和分関係を明示的にモデル化する,といった選択肢を検討する必要がある.

共和分を機械的な差分で消してはいけない

 ここで特に重要なのが,共和分である.もし$Y_t$と$D_t$がともに$I(1)$でありながら,その線形結合が定常になるような長期均衡関係が存在するのであれば,機械的に両方を差分化すると,分析したい長期関係を捨ててしまう可能性がある.したがって「非定常だから差分」という単純なルールではない.
 どの長期関係を推定したいのかを考え,必要であれば誤差修正モデル(Error Correction Model)型の構造を検討する必要がある.DMLを使う場合でも,この部分は古典的な時系列分析と何ら変わりはない.

季節性について考える

 季節性にもいくつか種類がある.例えば週次データで年間周期が存在するのであれば,

$$
\sin\left(\dfrac{2\pi t}{52}\right)
$$

$$
\cos\left(\dfrac{2\pi t}{52}\right)
$$

といったフーリエ項を$\boldsymbol{X}_t$へ含めることができる.
 高調波を増やせば,

$$
\sin\left(\dfrac{2\pi kt}{52}\right)
$$

$$
\cos\left(\dfrac{2\pi kt}{52}\right)
$$

を,$k=1,2,\cdots,K$について使うこともできる.
 あるいは,月ダミー,曜日ダミーなどでもよい.季節調整済みの系列を利用する方法もある.
 ただし,ここでも決定論的季節性(Deterministic Seasonality)と確率的季節性(Stochastic Seasonality)を区別する必要がある.毎年ほぼ同じパターンが繰り返されるのであればフーリエ項や季節ダミーで十分かも知れない.一方,季節方向にも確率的な非定常性がある場合には,季節差分など別の処理が必要になる場合がある.

系列相関とラグ構造

 時系列にDMLを適用するとき,ラグ変数を$\boldsymbol{X}_t$へ含めることは自然な選択肢である.例えば,

$$
D_t = m_{0}\left(D_{t-1},Y_{t-1},\boldsymbol{Z}_{t-1},\cdots\right) + V_t
$$

とすれば,$D_t$のうち過去の情報から予測可能な成分を取り除くことができる.このとき,

$$
\tilde{D}_t = D_t - m_{0}(\boldsymbol{X}_t)
$$

は,条件付けた情報集合からは予測できなかった$D_t$の変動となる.これは,時系列におけるDMLの解釈を考えるうえで非常に重要である.ただし,ラグを大量に入れればよいわけではない.
 例えば,$Y_{t-1}$が$D_{t-1}$の影響を既に受けている場合,どの効果を推定したいかによっては$Y_{t-1}$を条件付けることで過去の処置効果を部分的に取り除くことになる.つまり,時系列では「ラグ変数であるから処置前変数である」とは限らない.処置が繰り返される設定では,$Y_{t-1}$は今期の$D_t$よりは過去にあるものの,過去の$D_{t-1}$の処置後変数である可能性がある.これは静学的な統計的因果推論にはあまり現れない,時系列特有の論点の1つである.

情報集合を明示する

 時系列で条件付き外生性を考える場合,$\boldsymbol{X}_t$を単なる説明変数の集合として考えるよりも,情報集合(Information Set)として考える方がわかりやすい.例えば,$\mathcal{F}_{t-1}$を$t-1$までの情報集合とする.

$$
\boldsymbol{X}_t \subseteq \mathcal{F}_{t-1}
$$

とするのか,当期に観測される変数も含めるのかによって,モデルの意味が変わる.例えば,

$$
\mathbb{E}\left[U_t\mid D_t,\mathcal{F}_{t-1}\right] = 0
$$

を仮定するのであれば,$D_t$は過去の情報に条件付けたうえでは当期のアウトカムショックと無相関でなければならない.これはかなり強い仮定である場合がある.したがって,時系列分析では「何を共変量に入れたか」だけでなく,「その変数はいつ利用可能だったのか」を意識することが重要になる.

内生性について考える

 DMLについて最も誤解されやすい点の1つが,内生性(Endogeneity)である.DMLは,共変量を柔軟に調整することができる.しかし,

$$
\mathbb{E}\left[U_t\mid D_t,\boldsymbol{X}_t\right] = 0
$$

という条件を自動的に成立させるわけではない.例えば,意思決定者が観測している需要ショックを分析者が観測していないとする.意思決定者が需要が高くなりそうな期間に$D_t$を増やしているのであれば,$D_t$と$U_t$は相関する可能性がある.分析者の$\boldsymbol{X}_t$にその需要情報が十分に含まれていればDMLによって柔軟に調整できる.しかし,含まれていなければ,

$$
\mathbb{E}\left[U_t\mid D_t,\boldsymbol{X}_t\right] \neq 0
$$

となり得る.
 この問題は,ランダムフォレストを使うことでも,交差適合をすることでも,ネイマン直交スコアを使うことでも解決しない.DMLが取り除くのは局外母数の推定誤差による一次のバイアスであって,識別仮定の違反によるバイアスではないからである.

同時性とフィードバック

 時系列では,さらに同時性(Simultaneity)やフィードバック(Feedback)も問題になる.例えば,当期の$Y_t$を見ながら当期の$D_t$を変更できるとする.この場合,$Y_t\rightarrow D_t$という逆方向の関係も生じる.このとき,$D_t\rightarrow Y_t$という効果だけを通常の部分線形回帰モデルから識別することは難しくなる.また,$Y_{t-1}\rightarrow D_t$というフィードバックもよくある.後者については,$Y_{t-1}$を情報集合へ含めることで対応できる場合もあるが,それが妥当かどうかは推定したい効果に依存する.
 したがって,時系列にDMLを適用する場合,「どの時点の情報を条件付けているのか」を明示することが非常に重要になる.条件付き外生性が成立しないのであれば,操作変数を利用した部分線形回帰モデルなど,別の識別戦略を考える必要がある.

系列相関と内生性は別問題である

 系列相関と内生性は混同されやすい.例えば,

$$
U_t = \rho U_{t-1} + \varepsilon_t
$$

であっても,$D_t$と$U_t$が条件付きで無相関ならば,これは主として推論上の系列依存の問題である.
 一方,

$$
\operatorname{Cov}\left(D_t,U_t\mid\boldsymbol{X}_t\right) \neq 0
$$

ならば,これは識別の問題である.前者はHAC標準誤差や弱依存CLTなどで扱える可能性がある.後者はHACを使っても解決しない.

交差適合を時間方向にどう考えるか

 前回の記事では,クロスセクションデータに対するDMLについてランダムなK-fold交差適合を説明した.しかし,時系列データで観測時点をランダムにシャッフルしてfoldへ割り当てると,隣接した観測値が学習サンプルとテストサンプルへ分かれる.もし$W_t$と$W_{t-1}$の依存が強ければ,$t$期をtest sampleから除いたとしても,$t-1$期や$t+1$期をtraining sampleに含めることで,ほぼ同じ情報をモデルへ渡してしまう可能性がある.
 したがって,時系列では交差適合も依存構造に合わせて考える必要がある.

ブロック交差適合

 最も自然な方法の1つは,時間的に連続したブロックへ分割するブロック交差適合(Blocked Cross-Fitting)である.

|--- Fold 1 ---|--- Fold 2 ---|--- Fold 3 ---|--- Fold 4 ---|

 あるfoldを主サンプルとするとき,それ以外のfoldで局外母数を推定する.少なくとも,ランダムに時点をシャッフルするよりは時間構造を保存できる.ただし,隣接する学習ブロックと主ブロックの間には依然として強い依存が存在する可能性がある.

近傍除外交差適合

 そこで,主ブロックの前後を一定期間学習サンプルから除外する方法が考えられる.

|------ Train ------| gap |--- Main ---| gap |------ Train ------|

 このgapを大きくすれば,主サンプルと学習サンプルの依存を弱めやすくなる.一方で,学習に使えるデータは減る.
 時系列データはクロスセクションデータよりサンプルサイズが小さいことも多いため,「依存を弱める」ことと「学習データを確保する」ことの間にトレードオフが存在する.近傍除外交差適合(Neighbors-Left-Out Cross-Fitting)は,この考え方に近い.

逆向き交差適合

 Ciganovic et al.(2026)では,別の方法として逆向き交差適合(Reverse Cross-Fitting)が提案されている.同論文では,定常ガウス過程などが持つ時間可逆性(Time Reversibility)を利用し,時間反転した補助サンプルから局外母数を学習することで,bufferを大きく取ることによるデータ損失を抑えようとしている.ただし,これは時系列DML一般に必要な操作ではない.時間可逆性はかなり特定の確率過程上の性質であり,弱依存性,後述する条件付き安定性,時間可逆性はそれぞれ別の条件である.
 Ciganovic et al.(2026)自身も,逆向き交差適合をすべての時系列に対して一様に優れた方法とは位置付けていない.したがって,実務的には,ブロック交差適合,gapを設けた交差適合,前向き分割(Forward Splitting),近傍除外交差適合,逆向き交差適合などを,データの依存構造と分析目的に応じて選ぶことになる.

前向き分割は常に必要なのか

 ここには少しニッチだが重要な論点がある.時系列の機械学習では,「過去 → 学習」「未来 → 評価」という前向き分割が基本とされる.
 しかし,時系列DMLで常に未来のデータをを学習サンプルに使ってはいけない,というわけではない.DMLの目的が将来予測ではなく,ある定常なデータ生成過程のパラメータ$\theta_{0}$をオフラインで推定することであれば,未来の観測値を局外母数の推定に利用すること自体は,必ずしも因果的な先読みバイアス(Look-ahead Bias)を意味しない.重要なのは,主サンプルのイノベーションを学習サンプルがSystematicに予測してしまっていないか,同じPopulation局外関数を推定しているとみなせるか,必要な弱依存条件が成立しているか,である.
 一方,実運用で「その時点までに利用可能だった情報だけを使って推定した効果」を再現したいのであれば,前向き分割の方が自然である.つまり,予測評価におけるリーケージと,パラメータ推定における交差適合の独立性は,似ているが同一ではない.

条件付き安定性

 クロスセクションデータに対するDMLでは,主foldの観測値と,それを除いて推定した局外母数との独立性を利用することができた.時系列では,観測値を分けても完全な独立性は得られない場合が多い.そこで重要になるのが,条件付き安定性(Conditional Stability)である.
 直観的には,学習サンプルを条件付けた後でも,主サンプルにおけるPlug-inバイアスが$\sqrt{T}$スケールで無視できるかを要請する.
 Ciganovic et al.(2026)は,主ブロックとAuxiliaryブロックが完全に独立である必要はなく,学習サンプルによって生じる条件付きPlug-inバイアスが$o_P(T^{-1/2})$であればよいとしている.これは時系列DMLを考えるうえでかなり有用な見方である.完全な独立を要求するのではなく,First Order Leakageが存在しないことを要求する.
 部分線形回帰モデルで局外母数の推定誤差を$\Delta m_t$と$\Delta g_t$と書けば,直交化のおかげで一次項が条件付き期待値の意味で消え,主要な残差が概ね$\Delta m_t\Delta g_t$や$(\Delta m_t)^2$のような二次項へ押し込まれることが理想である.

局外母数の収束速度は時系列でも重要である

 前回の記事で扱ったように,DMLでは局外母数の推定誤差が二次の積として効くため,典型的には$n^{-1/4}$程度の収束速度が目安として現れる.時系列では標本サイズを$T$と書けば,同様に,

$$
\left|\hat{\eta}-\eta_{0}\right|_{L_2} = o_P(T^{-1/4})
$$

のような条件が1つの基準になる.
 もちろん,実際の十分条件はモデルやスコアの形に依存し,2つの局外母数がそれぞれ必ず$T^{-1/4}$でなければならないわけではない.前回の記事で扱った積の収束レート条件と同様に,一方をより速く推定できれば,もう一方には緩い条件しか必要ない場合もある.
 ただし,時系列では観測数$T$が同じでも,強い系列相関によって有効サンプルサイズが小さくなることがあり,クロスセクションデータの感覚で「520点あるから十分」と単純に考えることはできない.

標準誤差は長期分散から作る

 時系列DMLでは,推定値だけでなく標準誤差も時系列用に修正する必要がある.Partialling-out Scoreを,

$$
\psi_t = \tilde{D}_t\left(\tilde{Y}_t-\theta_{0}\tilde{D}_t\right)
$$

とする.i.i.d.の場合には$\operatorname{Var}(\psi_t)$だけを考えればよかった.しかし,時系列では,

$$
\Gamma(h) = \operatorname{Cov}\left(\psi_t,\psi_{t-h}\right)
$$

が存在する.したがって,

$$
\Omega = \Gamma(0)+\sum_{h=1}^{\infty}\left[\Gamma(h)+\Gamma(h)^{\top}\right]
$$

という長期分散が必要になる.

HAC推定量

 交差適合によって得られたスコアを$\hat{\psi}_t$とする.ラグ$h$の標本自己共分散を,

$$
\hat{\Gamma}(h) = \dfrac{1}{T}\sum_{t=h+1}^{T}\hat{\psi}_t\hat{\psi}_{t-h}
$$

とする.不均一分散・自己相関整合的分散推定量(Heteroskedasticity and Autocorrelation Consistent Variance Estimator:HAC)では,例えばNewey-West型として,

$$
\hat{\Omega} = \hat{\Gamma}(0)+2\sum_{h=1}^{L}w_h\hat{\Gamma}(h)
$$

とする.Bartlettカーネルならば,

$$
w_h = 1-\dfrac{h}{L+1}
$$

である.また,

$$
\hat{A} = -\dfrac{1}{T}\sum_{t=1}^{T}\hat{\tilde{D}}_t^2
$$

とすれば,

$$
\widehat{\operatorname{Var}}\left(\sqrt{T}(\hat{\theta}-\theta_{0})\right) = \hat{A}^{-1}\hat{\Omega}\hat{A}^{-1}
$$

である.したがって,

$$
\widehat{\operatorname{se}}(\hat{\theta}) = \sqrt{\dfrac{\hat{A}^{-1}\hat{\Omega}\hat{A}^{-1}}{T}}
$$

となる.
 Ciganovic et al.(2026)でも,時系列DMLの漸近分散はオラクルスコアの長期分散によって決まり,HAC推定によって推論を行う構成になっている.

HACのバンド幅は小さな論点ではない

 HAC標準誤差を使えば終わり,というわけでもない.有限標本では,バンド幅(Bandwidth)$L$の選択が標準誤差にかなり影響することがある.$L$が小さ過ぎれば,長めの系列相関を無視する.逆に大き過ぎれば,多数の高ラグ自己共分散を推定することになり,分散推定量そのものが不安定になる.したがって,スコアのACF,残差の持続性,データ頻度,理論上想定される依存長などを踏まえて感度分析することが望ましい.時系列DMLでは,局外モデルの選択だけでなく,HACのカーネルやバンド幅も頑健性チェックの対象になる.

近単位根は特に厄介である

 もう1つ少しニッチな論点として,近単位根(Near Unit Root)がある.例えば,

$$
X_t = \rho X_{t-1}+\varepsilon_t
$$

で,

$$
\rho = 0.98
$$

のような場合を考える.形式上は$\lvert\rho\rvert<1$なので定常である.しかし,有限標本では非常に強い持続性を持ち,実質的には単位根に近い振る舞いをする.このようなデータでは,交差適合のgapを少し空けただけでは依存が十分弱くならない,HACバンド幅が大きくなりやすい,有効標本サイズが見かけの$T$よりかなり小さい,といった問題が起こる.したがって,「定常性検定で単位根が棄却されたから大丈夫」という二値的な判断だけでは不十分な場合がある.

長期記憶と弱依存性

 さらにニッチな話題として,長期記憶(Long Memory)がある.弱依存性の議論では,自己共分散が十分速く減衰して,

$$
\sum_{h=-\infty}^{\infty}\left|\Gamma(h)\right| < \infty
$$

となることをしばしば想定する.しかし,長期記憶過程では自己共分散がゆっくり減衰し,この和が発散する場合がある.その場合,通常の$\sqrt{T}$正規化やHAC漸近論がそのまま適用できない可能性がある.したがって,時系列DMLで「系列相関をHACで処理する」と言うときには,暗黙にある程度の短期記憶を想定している.この点は,DML固有というより時系列漸近論そのものの制約である.

構造変化

 時系列データでは,構造変化(Structural Break)も重要である.例えば,$g_{0}$や$m_{0}$が時点を通じて変化する可能性がある.さらに,$\theta_{0}$そのものが変化する場合もある.もし$\theta_t$が時間変化しているのに,

$$
Y_t = D_t\theta_{0} + g_{0}(\boldsymbol{X}_t) + U_t
$$

という固定係数モデルを推定すれば,$\hat{\theta}$は何らかの加重平均的なPseudoパラメータになる可能性がある.これは機械学習を高度化しても解決しない.局外関数だけを柔軟にしても,関心のあるパラメータそのものを固定しているからである.構造変化が疑われる場合には,構造変化(Break)ダミー変数,レジーム別推定,Rolling Window,時変(Time Varying)パラメータなどを検討する必要がある.

予測性能が最高の局外モデルが最良とは限らない

 DMLでは,$\ell_{0}(\boldsymbol{X}_t)$と$m_{0}(\boldsymbol{X}_t)$を予測する必要がある.そのため,RMSEの最も小さいモデルを選びたくなる.しかし,DMLの最終目的は$Y_t$や$D_t$の予測ではなく,$\theta_{0}$の推定である.例えば,$D_t$の予測モデルが過度に柔軟で,

$$
\hat{m}(\boldsymbol{X}_t) \approx D_t
$$

となれば,

$$
\hat{\tilde{D}}_t = D_t-\hat{m}(\boldsymbol{X}_t)
$$

の分散が極端に小さくなる.その場合,$\theta_{0}$を識別するために利用できるVariation自体がほとんど残らない.
 Ciganovic et al.(2026)のシミュレーションでも,高次元になるほど予測最適チューニングと,関心のあるパラメータバイアスを小さくするチューニングが一致しない場合があることが報告されている.
 したがって,時系列DMLでは,局外モデルのOut-of-Sample予測誤差,$\hat{\theta}$のlearner依存性,fold依存性,$\operatorname{Var}(\hat{\tilde{D}}_t)$,スコアの系列相関を合わせて見る方がよい.

シミュレーションデータを作る

 ここからは,時系列データを使ったDMLをPythonで実装する.アウトカムを売上$Y_t$,関心のある変数を広告費$D_t$とする.ただし,ここでは特定の分析フレームワークを念頭に置いているわけではなく,単に系列相関,トレンド,季節性,非線形な交絡を持つ時系列回帰の例として使う.
 真の効果を,

$$
\theta_{0}=0.8
$$

とする.
 以下のデータ生成過程では,需要状態に自己相関がある,価格に自己相関がある,競合活動に自己相関がある,広告費にも自己相関がある,広告費は需要状態や販促,季節性,トレンドに応じて決まる,売上には非線形な共変量効果がある,売上の誤差項にも系列相関がある,という状況を作る.

import numpy as np
import pandas as pd


def simulate_time_series(
    T=520,
    theta=0.8,
    seed=123
):
    rng = np.random.default_rng(seed)

    t = np.arange(T)

    trend = t / (T - 1)

    season_sin = np.sin(
        2 * np.pi * t / 52
    )

    season_cos = np.cos(
        2 * np.pi * t / 52
    )

    demand = np.zeros(T)
    competitor = np.zeros(T)
    price = np.zeros(T)
    u = np.zeros(T)
    ad_spend = np.zeros(T)

    promotion = rng.binomial(
        1,
        0.15,
        size=T
    ).astype(float)

    for i in range(1, T):

        demand[i] = (
            0.75 * demand[i - 1]
            + rng.normal()
        )

        competitor[i] = (
            0.55 * competitor[i - 1]
            + rng.normal()
        )

        price[i] = (
            0.80 * price[i - 1]
            + rng.normal(scale=0.6)
        )

        u[i] = (
            0.50 * u[i - 1]
            + rng.normal(scale=2.0)
        )

    ad_spend[0] = (
        20
        + rng.normal(scale=2.0)
    )

    for i in range(1, T):

        conditional_mean_d = (
            15
            + 3.0 * np.tanh(demand[i])
            + 2.5 * promotion[i]
            - 1.0 * competitor[i]
            + 2.0 * season_sin[i]
            + 4.0 * trend[i]
            + 0.40 * ad_spend[i - 1]
        )

        ad_spend[i] = (
            conditional_mean_d
            + rng.normal(scale=2.5)
        )

    ad_spend_lag1 = np.r_[
        ad_spend[0],
        ad_spend[:-1]
    ]

    g = (
        100
        + 7.0 * demand
        + 2.0 * demand ** 2
        - 4.0 * price
        + 2.5 * competitor
        + 8.0 * promotion
        + 10.0 * season_sin
        - 5.0 * season_cos
        + 15.0 * trend
        + 1.5 * demand * promotion
    )

    sales = (
        theta * ad_spend
        + g
        + u
    )

    return pd.DataFrame(
        {
            "sales": sales,
            "ad_spend": ad_spend,
            "demand": demand,
            "price": price,
            "competitor": competitor,
            "promotion": promotion,
            "ad_spend_lag1": ad_spend_lag1,
            "trend": trend,
            "season_sin": season_sin,
            "season_cos": season_cos
        }
    )

 共変量は,

x_cols = [
    "demand",
    "price",
    "competitor",
    "promotion",
    "ad_spend_lag1",
    "trend",
    "season_sin",
    "season_cos"
]

とする.トレンドや季節性も明示的に$\boldsymbol{X}_t$へ含めている.機械学習を使っているから時間構造を無視してよい,というわけではないことを意識した設計である.

バッファ付きブロック交差適合

 今回は理解しやすさを優先し,連続したブロックを主サンプルとして,その周囲にgapを置くバッファ付きブロック交差適合(Buffered Block Cross-Fitting)を実装する.

def buffered_block_splits(
    n,
    n_splits=5,
    gap=4
):
    index = np.arange(n)

    blocks = np.array_split(
        index,
        n_splits
    )

    for test_idx in blocks:

        start = test_idx[0]
        end = test_idx[-1]

        left = max(
            0,
            start - gap
        )

        right = min(
            n - 1,
            end + gap
        )

        train_mask = np.ones(
            n,
            dtype=bool
        )

        train_mask[
            left:right + 1
        ] = False

        train_idx = index[
            train_mask
        ]

        yield train_idx, test_idx

 gap=4ならば,主ブロックの前後4期間を学習サンプルから除外する.この4という値に一般的な根拠があるわけではない.実際には,データ頻度,スコアのACF,残差の持続性,対象となる現象の時間スケールなどから検討する必要がある.

DMLを実装する

import statsmodels.api as sm

from sklearn.base import clone
from sklearn.ensemble import (
    HistGradientBoostingRegressor
)


def fit_time_series_dml(
    df,
    x_cols,
    n_splits=5,
    gap=4,
    hac_lags=8,
    seed=123
):
    y = df[
        "sales"
    ].to_numpy()

    d = df[
        "ad_spend"
    ].to_numpy()

    X = df[
        x_cols
    ].to_numpy()

    n = len(df)

    ell_hat = np.empty(n)
    m_hat = np.empty(n)

    model_y = (
        HistGradientBoostingRegressor(
            max_iter=300,
            learning_rate=0.05,
            max_leaf_nodes=15,
            l2_regularization=1.0,
            random_state=seed
        )
    )

    model_d = (
        HistGradientBoostingRegressor(
            max_iter=300,
            learning_rate=0.05,
            max_leaf_nodes=15,
            l2_regularization=1.0,
            random_state=seed + 1
        )
    )

    for train_idx, test_idx in (
        buffered_block_splits(
            n=n,
            n_splits=n_splits,
            gap=gap
        )
    ):

        learner_y = clone(
            model_y
        )

        learner_d = clone(
            model_d
        )

        learner_y.fit(
            X[train_idx],
            y[train_idx]
        )

        learner_d.fit(
            X[train_idx],
            d[train_idx]
        )

        ell_hat[test_idx] = (
            learner_y.predict(
                X[test_idx]
            )
        )

        m_hat[test_idx] = (
            learner_d.predict(
                X[test_idx]
            )
        )

    y_tilde = (
        y
        - ell_hat
    )

    d_tilde = (
        d
        - m_hat
    )

    regression = sm.OLS(
        y_tilde,
        d_tilde
    )

    result_hac = regression.fit(
        cov_type="HAC",
        cov_kwds={
            "maxlags": hac_lags
        }
    )

    theta_hat = (
        result_hac.params[0]
    )

    se_hac = (
        result_hac.bse[0]
    )

    score_hat = (
        d_tilde
        * (
            y_tilde
            - theta_hat
            * d_tilde
        )
    )

    return {
        "theta_hat": theta_hat,
        "se_hac": se_hac,
        "ell_hat": ell_hat,
        "m_hat": m_hat,
        "y_tilde": y_tilde,
        "d_tilde": d_tilde,
        "score_hat": score_hat
    }

 実行する.

df = simulate_time_series()

result = fit_time_series_dml(
    df=df,
    x_cols=x_cols,
    n_splits=5,
    gap=4,
    hac_lags=8
)

result[
    "theta_hat"
]

 ここで重要なのは,単に$\hat{\theta}$を見ることではない.時系列DMLでは,

np.var(
    result["d_tilde"]
)

によって処置残差に十分なVariationが残っているかを確認したり,

from statsmodels.graphics.tsaplots import (
    plot_acf
)

plot_acf(
    result["score_hat"],
    lags=30
)

によって交差適合スコアの自己相関を確認したりすることも重要である.

重要な共変量を落としたらどうなるか

 例えば,トレンドと季節性を意図的に除外してみる.

x_cols_misspecified = [
    "demand",
    "price",
    "competitor",
    "promotion",
    "ad_spend_lag1"
]
result_misspecified = (
    fit_time_series_dml(
        df=df,
        x_cols=x_cols_misspecified,
        n_splits=5,
        gap=4,
        hac_lags=8
    )
)

 この場合,どれだけ高度な機械学習器を利用していても,$\boldsymbol{X}_t$に存在しないトレンドや季節性を条件付けることはできない.これは時系列DMLに限らず,DML全般で非常に重要な点である.

観測されない内生性を入れてみる

 さらに厳しいシミュレーションとして,分析者には観測されない需要ショック$Q_t$を考える.$Q_t$が$D_t$にも$Y_t$にも影響するようにすると,

$$
\mathbb{E}\left[U_t\mid D_t,\boldsymbol{X}_t\right] = 0
$$

が破れる.この場合,DMLを正しく実装しても$\theta_{0}$は一般に回復しない.これはバグではなく,識別条件が成立していないからである.
 したがって,シミュレーションでは,すべての交絡を$\boldsymbol{X}_t$で観測できるケースと,重要な交絡を$\boldsymbol{X}_t$から落とすケースを比較すると,DMLの役割と限界が非常にわかりやすい.

Local Projectionについて

 最後に,少しニッチだが,時系列DMLとの相性がよい話題としてLocal Projectionについて触れておく.Jordà(2005)が提案した方法であり,将来のアウトカムについて,各horizonごとに直接回帰を行う.例えば,

$$
Y_{t+h} = D_t\theta_h + g_{0,h}(\boldsymbol{X}_t) + U_{t+h}
$$

を,$h=0,1,\cdots,H$について考える.通常のVARのように1つの動学モデルを推定して反復予測するのではなく,各$h$について別々に$Y_{t+h}$を$D_t$へ射影する.この意味でLocal Projectionと呼ばれている.

DMLとLocal Projection

 DMLを利用すると,各horizonについて,

$$
\ell_{0,h}(\boldsymbol{X}_t) = \mathbb{E}\left[Y_{t+h}\mid\boldsymbol{X}_t\right]
$$

と,

$$
m_{0}(\boldsymbol{X}_t) = \mathbb{E}\left[D_t\mid\boldsymbol{X}_t\right]
$$

を柔軟に推定し,

$$
\tilde{Y}_{t+h} = Y_{t+h}-\hat{\ell}_h(\boldsymbol{X}_t)
$$

$$
\tilde{D}_t = D_t-\hat{m}(\boldsymbol{X}_t)
$$

として,

$$
\tilde{Y}_{t+h} = \theta_h\tilde{D}_t + \text{誤差項}
$$

を推定することができる.
 Ciganovic et al.(2026)もこの形で時系列DMLをLocal Projectionへ拡張している.ただし,$\theta_h$を因果効果として解釈するためには,各$h$について,

$$
\mathbb{E}\left[U_{t+h}\mid D_t,\boldsymbol{X}_t\right] = 0
$$

のようなhorizon-specificな条件付き外生性が必要になる.

Local ProjectionではHACがさらに重要になる

 Local Projectionでは,$Y_{t+h}$がアウトカムになるため,$h>0$では隣接する回帰のアウトカムが重複する.例えば$h=4$なら,時点$t$と$t+1$を起点にした回帰では,対象となる将来期間が強く重なる.そのため,元のイノベーションが独立であったとしても,Local Projectionの回帰誤差には機械的な系列相関が生じ得る.
 これはLocal ProjectionでHAC標準誤差が重要になる理由の1つである.DMLを組み合わせても,この問題は消えない.むしろ,$\hat{\psi}_{t,h}$というhorizonごとの直交スコアについてLong-Run Varianceを考える必要がある.

Local Projectionは何を柔軟化しているのか

 Local ProjectionとDMLを組み合わせると,2種類の柔軟性が存在する.Local Projectionは$\theta_h$をhorizonごとに直接推定することで,動学的応答の形を柔軟にする.
 一方,DMLは$g_{0,h}(\boldsymbol{X}_t)$や$m_{0}(\boldsymbol{X}_t)$を機械学習によって推定することで,条件付き平均関係(Conditional Mean Relationship)を柔軟にする.両者は異なる部分を柔軟化している.この区別は重要である.

時系列DMLで最低限確認したいこと

 ここまでの議論をまとめると,時系列にDMLを適用するときには,少なくとも以下を考えたい.
 第一に,target parameterを定義する.$\theta_{0}$は当期効果なのか,将来効果なのか,長期効果なのかを明確にする.
 第二に,情報集合を定義する.$\boldsymbol{X}_t$に何を含めるのか,特に過去のアウトカム,処置,状態変数をどう扱うのかを考える.
 第三に,トレンドと季節性を考える.決定論的トレンドなのか,確率的トレンドなのか,決定論的季節性なのか,確率的季節性なのかで対処は異なる.
 第四に,系列相関を考える.生の$Y_t$や$D_t$だけでなく,最終的な直交スコアの依存を見る.
 第五に,交差適合を依存構造に合わせる.ランダムK-foldを機械的に使うのではなく,block,gap,前向き分割などを検討する.
 第六に,Long-Run Varianceを推定する.HACのカーネルやバンド幅も分析仕様の一部として扱う.
 第七に,内生性を別問題として考える.DMLによる柔軟な条件付けで解決できるのは観測された交絡であり,観測されない同時性や逆因果を自動的に解消するわけではない.
 第八に,構造変化を考える.局外関数だけではなく,$\theta_{0}$自体が一定であるという仮定も検討する.
 第九に,局外モデルの予測精度だけでなく,処置残差の分散と交差適合スコアの系列相関を診断する.

おわりに

 時系列データにDMLを適用するというと,DMLを時系列用の特殊なアルゴリズムへ作り替えるような印象を持つかも知れない.しかし,本質的にはそれほど大きく考え方を変える必要はない.
 通常の時系列分析では,トレンド,季節性,ラグ構造,定常性,構造変化などを考え,適切なモデルを特定する.さらに,系列相関のもとで大数の法則や中心極限定理が利用できる条件を整え,Long-Run Varianceに基づいて推論を行う.
 DMLでも同じである.違うのは,モデルの一部,$g_{0}(\boldsymbol{X}_t)$や$m_{0}(\boldsymbol{X}_t)$を線形関数として固定せず,機械学習によって柔軟に推定する点にある.
 その結果として生じる正則化スコアをネイマン直交性によって一次から取り除き,過学習による依存を交差適合によって抑える.
 さらに時系列では,「直交スコア+時系列を考慮した交差適合+弱依存性+Long-Run Variance」という形で推論を構成する.したがって,時系列DMLの核心は,系列相関をなくすことではない.系列依存の残るデータ生成過程の中で,ネイマン直交性によって直交化されたスコアについて,適切な大数の法則と中心極限定理が働くようにモデルを構成することにある.この意味で,DMLは古典的な時系列解析と対立するものではない.むしろ,「古典的な時系列解析+セミパラメトリック推論+機械学習」の接点にある手法と考えるのが自然である.
 時系列である以上,トレンドも季節性も単位根も内生性も無視することはできない.しかし,それらを適切にモデル化したうえで,残された複雑な条件付き期待値を機械学習へ委ねることができる.この「何を古典的な時系列モデルとして考え,何を機械学習へ委ねるのか」という役割分担こそが,時系列データにDMLを適用するときの最も重要な設計問題だと思う.

参考文献

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?