この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 ~.)
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')
輪っかっぽいですね.