時系列の基本モデル
(Press ?
for help, n
and p
for next and previous slide)
村田 昇
datasets::AirPassengers
(Rに標準で収録)出典
Box, G. E. P., Jenkins, G. M. and Reinsel, G. C. (1976) Time Series Analysis, Forecasting and Control. Third Edition. Holden-Day. Series G.
year | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1949 | 112 | 118 | 132 | 129 | 121 | 135 | 148 | 148 | 136 | 119 | 104 | 118 |
1950 | 115 | 126 | 141 | 135 | 125 | 149 | 170 | 170 | 158 | 133 | 114 | 140 |
1951 | 145 | 150 | 178 | 163 | 172 | 178 | 199 | 199 | 184 | 162 | 146 | 166 |
1952 | 171 | 180 | 193 | 181 | 183 | 218 | 230 | 242 | 209 | 191 | 172 | 194 |
1953 | 196 | 196 | 236 | 235 | 229 | 243 | 264 | 272 | 237 | 211 | 180 | 201 |
1954 | 204 | 188 | 235 | 227 | 234 | 264 | 302 | 293 | 259 | 229 | 203 | 229 |
1955 | 242 | 233 | 267 | 269 | 270 | 315 | 364 | 347 | 312 | 274 | 237 | 278 |
1956 | 284 | 277 | 317 | 313 | 318 | 374 | 413 | 405 | 355 | 306 | 271 | 306 |
1957 | 315 | 301 | 356 | 348 | 355 | 422 | 465 | 467 | 404 | 347 | 305 | 336 |
1958 | 340 | 318 | 362 | 348 | 363 | 435 | 491 | 505 | 404 | 359 | 310 | 337 |
1959 | 360 | 342 | 406 | 396 | 420 | 472 | 548 | 559 | 463 | 407 | 362 | 405 |
1960 | 417 | 391 | 419 | 461 | 472 | 535 | 622 | 606 | 508 | 461 | 390 | 432 |
Figure 1: 航空機旅客量データ・自己相関・季節性の確認
Figure 2: 時系列の分解による表現
Figure 3: モデルの推定とあてはめ
Figure 4: 航空機旅客量の予測
統計学・確率論における表現 : 確率過程
時間を添え字として持つ確率変数列
\begin{equation} X_{t},\;t=1,2,\dotsc,T \quad(\text{あるいは}\;t=0,1,\dotsc,T) \end{equation}
定義
平均 \(0\) 分散 \(\sigma^2\) である確率変数の 確率分布 \(P\) からの 独立かつ同分布な確率変数列
\begin{equation} X_{t} = \epsilon_{t}, \quad \epsilon_{t} \overset{i.i.d.}{\sim} P \end{equation}
記号 \(\mathrm{WN}(0,\sigma^2)\) で表記することが多い
\begin{equation} X_{t} \sim \mathrm{WN}(0,\sigma^2) \end{equation}
Figure 5: ホワイトノイズ (標準正規分布)
定義
\(\mu,\alpha\) を定数として 以下で定義される確率過程
\begin{equation} X_{t}=\mu+\alpha t+\epsilon_{t}, \quad \epsilon_{t} \sim \mathrm{WN}(0,\sigma^2) \end{equation}
Figure 6: トレンドのあるホワイトノイズ
定義
\(X_0\) を定数もしくは確率変数として 以下で帰納的に定義される確率過程
\begin{equation} X_{t}=X_{t-1}+\epsilon_{t}, \quad \epsilon_{t} \sim \mathrm{WN}(0,\sigma^2) \end{equation}
Figure 7: ランダムウォーク
ts()
, acf()
などfable/tsibble/feasts : 時系列のためのパッケージ
forecast
パッケージの tidyverse 版ARIMA()
, ACF()
, autoplot()
など#' 最初に一度だけ以下のいずれかを実行しておく
#' - Package タブから fable/tsibble/feasts をインストール
#' - コンソール上で次のコマンドを実行 'install.packages(c("fable","tsibble","feasts")'
関数 stats::ts()
ts(data = NA, start = 1, end = numeric(), frequency = 1,
deltat = 1, ts.eps = getOption("ts.eps"),
class = if(nseries > 1) c("mts", "ts", "matrix", "array") else "ts",
names = )
#' data: ベクトル,または行列(データフレーム)
#' start: 開始時刻
#' end: 終了時刻
#' frequency: 単位時間あたりの観測回数
典型的な使い方
x <- rnorm(24) # 正規分布のホワイトノイズ
ts(data = x) # t=1,2,... を添字とする単純な時系列
ts(data = x, start = c(2020,1), frequency =12) # 2020年1月からの月ごと
ts(data = x, start = c(2020,3), frequency =4) # 四半期ごと
ts
オブジェクトは通常その時間情報を利用して処理が行われるため
関数によっては扱いがベクトルと異なる場合があるので注意
関数 tsibble::tsibble()
(tidyverse系)
tsibble(..., key = NULL, index, regular = TRUE, .drop = TRUE)
#' ...: データ
#' key: indexの補助情報(同じ時間の異なるデータを表す)
#' index: 時間情報を表す列を設定
関数 tsibble::as_tsibble()
as_tsibble(x, key = NULL, index,
regular = TRUE, validate = TRUE, .drop = TRUE, ...)
#' x: データ(時系列オブジェクトやデータフレーム)
典型的な使い方
tsibble(date = as_date("2024-01-01") + 0:9,
value = rnorm(10))
tibble(year = 2001:2020,
value = rnorm(20)) |>
as_tsibble(index = year) # yearを時間情報に指定
AirPassengers |> as_tsibble() # 時系列オブジェクトの変換
関数 fabletools::autoplot()
autoplot(object, .vars = NULL, ...)
#' 詳細は '?fabletools::autoplot.tbl_ts()'を参照
典型的な使い方
#' 単一時系列の描画
x <- rnorm(240) # 正規分布のホワイトノイズ
ts(x, start = c(2000,1), frequency = 12) |> # 2000年1月から毎月のデータ
as_tsibble() |> # tsibbleクラスに変換
autoplot(value) # value (as_tsibbleによる時系列データの列名の規定値) を描画
#' 複数の系列を表示する場合
y <- rt(240, df=4) # t-分布のホワイトノイズ
z <- ts(tibble(x,y), start = c(2000,1), frequency = 12)
z |> as_tsibble() |>
autoplot(value) # 同一のグラフで色を変えて描画
z |> as_tsibble() |>
autoplot(value) + # 別にする場合は facet を指定すればよい
facet_grid(key ~ .)
定義 (AR(p); 次数 \(p\) の auto regressive の略)
\(a_1,\dotsc,a_p\)を定数とし \(X_1,\dotsc,X_p\)が初期値として与えられたとき 以下で帰納的に定義される確率過程
\begin{equation} X_{t}=a_1X_{t-1}+\cdots+a_pX_{t-p}+\epsilon_{t}, \quad \epsilon_{t} \sim \mathrm{WN}(0,\sigma^2) \end{equation}
Figure 8: AR過程
定義 (MA(q); 次数 \(q\) の moving average の略)
\(b_1,\dotsc,b_q\)を定数とし, \(X_1,\dotsc,X_q\)が初期値として与えられたとき 以下で帰納的に定義される確率過程
\begin{equation} X_{t} = b_1\epsilon_{t-1}+\cdots+b_q\epsilon_{t-q}+\epsilon_{t}, \quad \epsilon_{t} \sim \mathrm{WN}(0,\sigma^2) \end{equation}
Figure 9: MA過程
定義 (ARMA(\(p,q\)); 次数 \((p,q)\))
\(a_1,\dotsc,a_p,b_1,\dotsc,b_q\) を定数とし \(X_1,\dotsc,X_{\max\{p,q\}}\) が初期値として与えられたとき 以下で帰納的に定まる確率過程
\begin{align} X_{t} &= a_1X_{t-1}+\cdots+a_pX_{t-p}\\ &\quad+ b_1\epsilon_{t-1}+\cdots+b_q\epsilon_{t-q} +\epsilon_{t},\\ &\quad \epsilon_{t} \sim \mathrm{WN}(0,\sigma^2) \end{align}
Figure 10: ARMA過程
\(X_{t}\)の平均は時点\(t\)によらない
\begin{equation} \mathbb{E}[X_{t}]=\mu \quad \text{(時間の添字を持たない)} \end{equation}
\(X_{t}\)と\(X_{t+h}\)の共分散は時点\(t\)によらず時差\(h\)のみで定まる
\begin{equation} \mathrm{Cov}(X_{t},X_{t+h}) =\gamma(h) \quad \text{(時間の添字を持たない)} \end{equation}
特に\(X_{t}\)の分散は時点\(t\)によらない (\(h=0\)の場合)
\begin{equation} \mathrm{Var}(X_{t}) =\gamma(0), \quad \text{(\(X_{t}\)は二乗可積分であることを仮定)} \end{equation}
階差系列
ランダムウォークは階差をとればホワイトノイズ(定常過程)となる
\begin{equation} X_{t}=X_{t-1}+\epsilon_{t} \quad\Rightarrow\quad Y_{t}=X_{t}-X_{t-1}=\epsilon_{t} \end{equation}
対数変換
対数変換と階差で微小な比率の変動を取り出すことができる
\begin{equation} X_{t}=(1+\epsilon_{t})X_{t-1} \quad\Rightarrow\quad Y_{t}=\log(X_{t})-\log(X_{t-1}) =\log(1+\epsilon_{t}) \simeq\epsilon_{t} \end{equation}
トレンド成分+季節成分+変動成分への分解
適当な仮説のもとに取り扱いやすい成分の和に分解する
\(X_{t}\) と \(X_{t+h}\) の共分散は時点\(t\)によらずラグ\(h\)のみで定まる
自己共分散 (定常過程の性質よりラグは\(h\ge0\)を考えればよい)
\begin{equation} \mathrm{Cov}(X_{t},X_{t+h}) =\gamma(h) \end{equation}
\(X_{t}\) と \(X_{t+h}\) の相関も\(t\)によらずラグ\(h\)のみで定まる
自己相関
\begin{equation} \mathrm{Cov}(X_{t},X_{t+h})/\mathrm{Var}(X_{t}) =\gamma(h)/\gamma(0) \end{equation}
ラグ\(h\)の自己共分散の推定 : 標本自己共分散
\begin{equation} \hat\gamma(h) = \frac{1}{T}\sum_{t=1}^{T-h}(X_{t}-\bar{X})(X_{t+h}-\bar{X}) \end{equation}
\(\bar{X}=\frac{1}{T}\sum_{t=1}^TX_{t}\) は標本平均
ラグ\(h\)での自己相関の推定 : 標本自己相関
\begin{equation} \hat\gamma(h)/\hat\gamma(0) = \frac{\sum_{t=1}^{T-h}(X_{t}-\bar{X})(X_{t+h}-\bar{X})}{\sum_{t=1}^T(X_{t}-\bar{X})^2} \end{equation}
Figure 11: AR過程の自己相関
Figure 12: MA過程の自己相関
Figure 13: ARMA過程の自己相関
関数 stats::acf()
acf(x, lag.max = NULL,
type = c("correlation", "covariance", "partial"),
plot = TRUE, na.action = na.fail, demean = TRUE, ...)
#' x: 時系列データ
#' lag.max: 計算するラグの最大値
#' type: 標準は相関, 共分散と偏相関を選ぶこともできる
#' plot: 描画するか否か
#' na.action: 欠損値の処理,標準は欠損を含むと計算しない
#' demean: 共分散の計算において平均を引くか否か
plot
の真偽で描画(graphics系)・計算のみを制御できる関数 feats::ACF()
ACF(.data, y, ..., lag_max = NULL,
type = c("correlation", "covariance", "partial"),
na.action = na.contiguous, demean = TRUE, tapered = FALSE)
#' .data: 時系列データ (tsibbleクラス)
#' y: 計算対象の列名
#' type: 標準は相関, 共分散と偏相関を選ぶこともできる
#' na.action: 欠損値の処理,標準は欠損を含むと計算しない
#' demean: 共分散の計算において平均を引くか否か
acf()
とほぼ同様(lag=0を表示しない)に描画(graphics系)・計算を行うautoplot()
に渡せばグラフを描画する典型的な使い方
toy_acf <- arima.sim(model = list(ar = c(0.8, -0.64),
ma = c(-0.5)),
n = 200) |>
as_tsibble() |> ACF(value)
toy_acf |> autoplot()