最近時系列データを使ってゴニョゴニョしたいことがありました。
定期的に状態空間モデルとか使って時系列モデリングしたくなるけど、だいたいのケースで何も覚えてなくて詰む。
— 野川の側 (@nogawanogawa) 2022年8月29日
時系列データだと、Rが使われることが多いと思うんですが、自分がRの書き方と時系列関係のライブラリの使い方を完全に忘れてました😇
ということで、復習します。 実質、完全初心者です😌、やりたいことを実現するために必要な部分を復習します。
そもそもRを書く環境準備
過去のDockerを使用して環境を構築していたので、これを使えば良さそう。
RStudioをあんまり使ったことがなくて便利さを理解してないというのが主な理由。jupyterは普段使ってるからこっちのほうがなれてるので。
関数の書き方
地味に関数の書き方から忘れてたのでメモ。
関数はfunction(){}
を使って定義するんですね。
sin_sample <- function(x) { sin(2 * pi * x / 12) # 周期12のsin波 }
こんな感じで、ベクトルに入れて突っ込めば系列を作る関数ができる。
l = 24 x <- seq(0, l, length=l) sin_sample <- function(x) { sin(2 * pi * x / 12) # 周期12のsin波 } plot(sin_sample(x))
時系列データの定義
ただベクトルシーケンスでは時刻のラベルがついてません。
その情報を付与した時系列データを作成するときはts
を使用します。
series <- rnorm(10) # 標準正規分布に従う乱数を生成 ts(series, freq=4)
周期が4だとQごとだと判断してくれている模様。
series <- rnorm(48) # 標準正規分布に従う乱数を生成 ts(series, freq=12)
周期が12だと月ごとだと判断してくれている模様。
時系列データの作成
時系列のデータの作り方までわかったので、最後は時系列のデータを作成しようと思います。
ただの乱数時系列データを作る
まずはなんの変哲もない、乱数に日付を付けただけの時系列データを作成します。
original <- ts(rnorm(48),freq=12, start = c(2017,1)) plot(original)
seasonality
今度は周期成分について考えてみます。
周期成分はsin, cosを使って作っても良いですが、
- 周期的であればよかった
- なるべくランダムっぽいほうが擬似データっぽい
の理由から、乱数データを周期性として使用します。
# 単純な標準正規分布に従う season <- rnorm(12) season <- c(season, season, season) season <- ts(season, freq=12, start = c(2017,1)) plot(season)
こんな感じで書くと、周期性(らしきもの)が取得できました。
trend
seasonalityと異なり、今回trendは自分でいじりたかったので、こちらは自分で定義します。 まず、横ばいのトレンドを作ってみます。
# trend trend <- ts(seq(0, 0, length=36), freq=12, start = c(2017,1)) trend plot(trend)
上がり調子にするには
# trend trend <- ts(seq(0, 4, length=36), freq=12, start = c(2017,1)) trend plot(trend)
組み合わせて系列を作ってみる
ここまでやってきたことを組み合わせて系列を作ってみます。 また、HoltWinters法でちゃんと想定した傾向に分解できるか確認します。
最後の分解の結果から、周期性やトレンドも想定したようにできているので、ダミーの時系列データが作成できました。 こんな感じにして、傾向を事前定義して逆算的に作ったら作りたかったダミーデータが作れることがわかりました。
参考文献
下記の文献を参考にさせていただきました。
- Arima function - RDocumentation
- Simulating from a specified seasonal ARIMA model | Rob J Hyndman
- 関数の作り方 | R の関数を一から作る方法
- たのしいR言語入門 - Qiita
感想
以上、一定傾向を持った時系列の疑似データを作成してみました。 このレベルからわからんかったので、一つ一つ確認しながらやってみた次第です。
これを何に使うかは、また今度。