時系列データを主成分分析

このpdfの内容に, 時系列データに対して主成分分析, という話があったので, やってみます.

せっかくなので, threejsで3次元プロットもしてみます.

library(dplyr)
library(threejs)
library(data.table)
library(ggplot2)
library(reshape2)

時系列データで主成分分析 (ノイズ無し)

データの生成(ノイズ無し)

時系列データをします. 輪っかを作ります.

n = 1000
t = seq(from = 0, to = 1, length.out = n)
x = sin(2*pi*t) 
y = 0.5 * sin(2*pi*t) 
z = cos(2*pi*t) 
dat_ts = 
  data.frame(x=x, y=y, z=z)

dat_ts %>% head
##             x           y         z
## 1 0.000000000 0.000000000 1.0000000
## 2 0.006289433 0.003144717 0.9999802
## 3 0.012578618 0.006289309 0.9999209
## 4 0.018867305 0.009433652 0.9998220
## 5 0.025155245 0.012577623 0.9996836
## 6 0.031442191 0.015721095 0.9995056

時系列の様子 (各成分)

## x,y,zの時系列データの様子
dat_ts %>% mutate(time = 1:length(x)) %>%  
  melt(id="time", measure = c("x", "y", "z")) %>% 
  ggplot() + 
  geom_line(aes(x = time, y = value)) + 
  facet_grid(variable ~.)

時系列の様子 (x,y,z)

threejsで3次元プロットしましょう.

## (x,y,z)の時系列データの様子: 時間経過は白->赤
scatterplot3js(x,y,z, color = heat.colors(length(z)))

きれいな輪っかです. 色んな角度から眺めると楽しいです.

主成分分析

時系列データに対して主成分分析を行います.

各時刻のデータに対して, 第1, 第2主成分得点でプロットします.

3次元データが2次元に落ちます.

pr_res = 
  dat_ts %>% prcomp
pr_res$x %>% 
  plot(type = 'l')

丸です.

時系列データで主成分分析 (ノイズ有り)

データにノイズを乗せて, 同じことをやってみます.

データを生成 (ノイズ有り)

n = 1000
## 正規乱数
sd = 0.1
noize1 = rnorm(n, sd = sd)
noize2 = rnorm(n, sd = sd)
noize3 = rnorm(n, sd = sd)
t = seq(from = 0, to = 1, length.out = n)
x = sin(2*pi*t) + noize1 
y = sin(2*pi*t) + noize2 
z = cos(2*pi*t) + noize3
dat_ts = 
  data.frame(x=x, y=y, z=z)

dat_ts %>% head
##             x           y         z
## 1 -0.05930132  0.22434028 1.0647959
## 2 -0.26249592  0.04849740 1.1726992
## 3 -0.01384985 -0.06399518 1.0214186
## 4  0.15114716  0.09600564 1.0176801
## 5  0.05759213 -0.14795911 0.9500845
## 6  0.01126050  0.08036741 0.7415933
## x,y,zの時系列データの様子
dat_ts %>% mutate(time = 1:length(x)) %>%  
  melt(id="time", measure = c("x", "y", "z")) %>% 
  ggplot() + 
  geom_line(aes(x = time, y = value)) + 
  facet_grid(variable ~.)

## (x,y,z)の時系列データの様子: 時間経過は白->赤
scatterplot3js(x,y,z, color = heat.colors(length(z)))

主成分分析

時系列データに対して主成分分析を行います.

各時刻のデータに対して, 第1, 第2主成分得点でプロットします.

3次元データが2次元に落ちます.

pr_res = 
  dat_ts %>% prcomp
pr_res$x %>% 
  plot(type = 'l')

輪っかっぽいですね.