kunekune_haniwaの日記

レベルを下げるあいつ。

Rで2つの時系列データ間の交差相関を取りたい

やりたいこと

Rで2つの時系列データ間の交差相関を取りたい。そして2つの系列データ間の遅れ時間や相関の周期性を調べたい。

やりかた

標準で交差相関をとる関数ccfが用意されている。

使用例

データの準備

library(tidyverse)
set.seed(123)

n = 200
df = tibble(
  No = 1:n,
  x = cumsum(rnorm(n)),
  y = lag(1.234*x -3.456 + rnorm(n),10,fill=NA)
) %>% 
  na.omit()

df %>% 
  gather("key", "value", -1) %>% 
  ggplot(aes(No, value, color=key)) + geom_point() + geom_line()

f:id:kunekune_haniwa:20210129223544p:plain

交差相関の計算

res = ccf(df$x, df$y)

-10で相関係数が最大になっている。サンプルデータを作るときもyはxに対して10コマ送らせているのできちんと遅れ時間を求められた。 f:id:kunekune_haniwa:20210129223618p:plain

移動平均みたいな感じで移動相関を取りたい

やりたいこと

Rで移動平均みたいに窓を動かしながら回帰分析をして決定係数や回帰係数を取り出したい。

解決法

rollRegres packageで解決。

使用例

サンプルデータはランダムウォークなxと段々と大きくなる誤差を組み合わせる。

library(rollRegres)
library(tidyverse)

# サンプルデータの作成
set.seed(123)
n = 200

df = tibble(
  No = 1:n,
  white_noise = rnorm(n),
  x = cumsum(white_noise),
  s = seq(0.1,2,length.out = n),
  noise = map_dbl(s,~rnorm(1,0,.x)),
  y = x*1.3421 + 5.1487 + noise
) %>% 
  select(No, x, y)

#移動相関を取る
out = roll_regres(y ~ x, df, width = 20,
  do_compute = c("sigmas", "r.squareds", "1_step_forecasts"))

do_computeを指定しないとR2とかが計算されないから必要なら指定する。窓のとり方は後方なので、基準点から過去方向にデータが選ばれる。