7.6 回帰による予測

\(y\)の予測は以下のように得られることを思い起こしましょう。 \[ \hat{y_t} = \hat\beta_{0} + \hat\beta_{1} x_{1,t} + \hat\beta_{2} x_{2,t} + \cdots + \hat\beta_{k} x_{k,t} \] 回帰式の推計された係数から成り、誤差は無視しています。予測変数の値\(x_{1,t},\dots,x_{k,t}\)\(t=1,\dots,T\)にわたって代入すると、\(y\)の(訓練セットでの)当てはめ値が出力されます。しかし、ここで興味があるのは、\(y\)の将来値を予測することです。

事前予測と事後予測

時系列データに回帰モデルを使う場合、予測を計算する際に何を既知と想定するかにより、生成する予測のタイプが異なり、それらを区別する必要があります。

事前予測は、事前に入手可能な情報だけを使う予測です。例えば、米国個人消費の伸び率(%)で標本の最後に続く四半期を事前予測するには、2019 Q2時点、および、それ以前に入手可能だった情報だけを使います。これは、その時点で入手可能な情報だけを使って事前に行う真正な予測です。ですから、事前予測を生成するには、予測変数を予測する必要があります。予測変数の予測を得るには、5.2節で紹介した単純な手法、あるいは、8章や9章で紹介するより洗練された時系列に特化したアプローチを使うことができます。別の手としては、政府機関など他のソースからの予測が入手可能で、使えるかもしれません。

事後予測は、予測変数について後から入手した情報を使う予測です。例えば、個人消費の事後予測は、予測変数の実績値が事前には入手不可能でも今は入手可能なら使います。これらは真正な予測ではないですが、予測モデルの挙動を研究するためには役に立ちます。

事後予測を生成するモデルの推計に、予測期間のデータを使ってはいけません。つまり、事後予測は、今知っていることを、予測変数(\(x\)変数)については想定して構いませんが、予測対象変数(\(y\)変数)については想定してはいけないのです。

事前予測と事後予測を比較して評価することは、予測の不確実性の源を区別する助けになります。予測誤差が生じたのは、予測変数の予測がお粗末だったからなのか、予測モデルがお粗末だったからなのか、の区別です。

事例: オーストラリア四半期ビール生産量

事前予測を生成する際、予測変数の将来の実績値は事前には既知ではないので、普通は使えません。しかし、7.4節で紹介した特殊な予測変数は、暦変数(例えば、季節ダミー変数や祝日を表す変数)か、時間で決まる関数(例えば、時間トレンド)に基づく変数なので、全て事前に既知です。そうしたケースでは、事前予測と事後予測に違いはありません。

recent_production <- aus_production %>%
  filter(year(Quarter) >= 1992)
fit_beer <- recent_production %>%
  model(TSLM(Beer ~ trend() + season()))
fc_beer <- forecast(fit_beer)
fc_beer %>%
  autoplot(recent_production) +
  labs(
    title = "回帰によるビール生産量の予測",
    y = "メガリットル", level = "区間予測"
  )
ビール生産量の回帰モデルからの予測。暗い網掛け部分は80%区間予測、薄い網掛け部分は95%区間予測

図 7.17: ビール生産量の回帰モデルからの予測。暗い網掛け部分は80%区間予測、薄い網掛け部分は95%区間予測

シナリオに基づく予測

この設定では、予測者は興味のある予測変数につき、あり得るシナリオを想定します。例えば、米国の政策立案者は、失業率に変化はないとしても、可処分所得1%増、個人貯蓄0.5%増の場合と、可処分所得1%減、個人貯蓄0.5%減の場合とで、標本の最後に続く4四半期での個人消費伸び率予測を比較することに興味があるかもしれません。予測結果を以下のように計算し、図7.18に示します。シナリオに基づく予測の区間予測は、予測変数の将来値に付随する不確実性を含んでいないことに留意してください。予測変数の値は既知と想定しているからです。

fit_consBest <- us_change %>%
  model(
    lm = TSLM(Consumption ~ Income + Savings + Unemployment)
  )
future_scenarios <- scenarios(
  "増加" = new_data(us_change, 4) %>%
    mutate(Income=1, Savings=0.5, Unemployment=0),
  "減少" = new_data(us_change, 4) %>%
    mutate(Income=-1, Savings=-0.5, Unemployment=0),
  names_to = "シナリオ")

fc <- forecast(fit_consBest, new_data = future_scenarios)
us_change %>%
  autoplot(Consumption) +
  autolayer(fc) +
  labs(title = "米国個人消費", y = "伸び率 (%)",
       level = "区間予測")
シナリオに基づく予測による米国個人消費の伸び率(%)の予測

図 7.18: シナリオに基づく予測による米国個人消費の伸び率(%)の予測

予測のための回帰モデル構築

回帰モデルの大きな利点は、興味を持つ予測対象変数と予測変数間の重要な関係を取り込めることです。しかし、事前予測の場合、各予測変数の将来値が必要なことが課題になります。各予測変数を予測するのが難しくてできない場合、替わりに、全ての予測変数に特定の将来値を想定するシナリオに基づく予測が使えるかもしれません。

別のやり方としては、予測変数のラグ値を使う手があります。\(h\)期先の予測を生成することに興味があるとして、\(h=1,2\dots\)に対して、以下のように書けます。 \[ y_{t+h}=\beta_0+\beta_1x_{1,t}+\dots+\beta_kx_{k,t}+\varepsilon_{t+h} \] 予測変数はそれぞれ、\(y\)が観測されるよりも\(h\)時点前に観測された\(x\)値で形成されています。ですから、推計されたモデルを将来に、つまり、標本の最後の時点\(T\)を越えて延ばす際、全ての予測変数の値は入手可能です。

予測変数のラグ値を含めると、予測生成が容易になるだけでなく、モデルが直観的に理解しやすくなります。例えば、鉱工業生産を増やすことを狙った政策変更の影響は、個人消費に直ぐには出てこないかもしれません。影響が出るにはラグがありそうだからです。7.4節で分布ラグを予測変数として簡単に紹介した際、このことに触れました。時系列に観測される豊かな強弱を、より良く取り込む回帰モデルを生成するいくつかの方向性については、10節で議論します。

区間予測

7.18では、個人消費伸び率の予測一つ一つにつき、95%と80%の区間予測も含めています。重回帰モデルで区間予測を計算する一般的な公式は、7.9節で示します。いくらか高度な線形代数になるので、ここでは、以下の方程式を使って予測生成できる単回帰の区間予測を計算するケースを示します。 \[ \hat{y}=\hat{\beta}_0+\hat{\beta}_1x \] 回帰誤差が正規分布と想定すると、この予測に付随するおおよそ95%の区間予測は、以下のように得られます。 \[\begin{equation} \hat{y} \pm 1.96 \hat{\sigma}_e\sqrt{1+\frac{1}{T}+\frac{(x-\bar{x})^2}{(T-1)s_x^2}} \tag{7.4} \end{equation}\] ただし、\(T\)は観測値の総数、\(\bar{x}\)は観測された\(x\)値の平均、\(s_x\)は観測された\(x\)値の標準偏差、\(\hat{\sigma}_e\)(7.3)式で得られる回帰の標準誤差です。同様に、80%区間予測は1.96を1.28に置き換えることで得られます。1.96を表5.1で与えられる適切な値に置き換えれば、その他の区間予測が得られます。区間予測を得るのにfableパッケージを使っているなら、(7.4)式よりも(特に、\(T\)の値が小さい場合には)正確な計算が得られます。

(7.4)式は、\(x\)\(\bar{x}\)から離れるほど区間予測は広くなることを示しています。つまり、予測変数の値がその標本平均に近いほど、予測についてより確信を持てる、ということです。

事例

米国個人消費の事例での推計された単回帰線は、以下の通りでした。 \[ \hat{y}_t=0.54 + 0.27x_t \]

次の4四半期では、可処分所得は過去の平均値\(\bar{x}=0.73\)%で増加と想定すれば、個人消費は\(0.74\)%増加と予測され、対応する80%と95%の区間予測は(Rを使って計算すると)それぞれ、\([-0.02, 1.5]\)\([-0.42, 1.9]\)になります。もし可処分所得が12%増加と極端な想定をすると、図7.19に示す通り、区間予測はかなり広くなります。

fit_cons <- us_change %>%
  model(TSLM(Consumption ~ Income))
new_cons <- scenarios(
  "平均的な増加" = new_data(us_change, 4) %>%
    mutate(Income = mean(us_change$Income)),
  "極端な増加" = new_data(us_change, 4) %>%
    mutate(Income = 12),
  names_to = "シナリオ"
)
fcast <- forecast(fit_cons, new_cons)

us_change %>%
  autoplot(Consumption) +
  autolayer(fcast) +
  labs(title = "米国個人消費", y = "伸び率 (%)",
       level = "区間予測")
可処分所得が過去の平均\(0.73\)%で増加の場合と極端な12%増加の場合の区間予測

図 7.19: 可処分所得が過去の平均\(0.73\)%で増加の場合と極端な12%増加の場合の区間予測