rによるデータサイエンス:12章「時系列」
DESCRIPTION
書籍:Rによるデータサイエンス(http://www.amazon.co.jp/dp/4627096011)の12章「時系列」の内容に沿った資料です。 第17回R勉強会@東京(#TokyoR)(http://atnd.org/events/19835)に使用。TRANSCRIPT
第12章:時系列
Rによるデータサイエンス
@teramonagi
1
本はこれです
2
12.1
基本概念とデータの操作
3
時系列とは
時間と共に変動する現象を時間の順序で記録したデータ 4
Rではts型が基本
5
データの形式と属性> class(lh)
[1] "ts"
> lh
Time Series:
Start = 1
End = 48
Frequency = 1
[1] 2.4 2.4 2.4 2.2 2.1 1.5 2.3 2.3 2.5 2.0 1.9 1.7 2.2 1.8 3.2 3.2 2.7 2.2(以下省略)
※女性の血液中の黄体ホルモンを10分間隔で測定したデータ・・・だそうです 6
データの形式と属性> start(UKgas)
[1] 1960 1
> end(UKgas)
[1] 1986 4
> frequency(UKgas)
[1] 4> UKgas
Qtr1 Qtr2 Qtr3 Qtr4
1960 160.1 129.7 84.8 120.1
1961 160.1 124.9 84.8 116.9
1962 169.7 140.9 89.7 123.3
1963 187.3 144.1 92.9 120.1
※1960年から1986年までのイギリスのガス消費量の時系列データ・・・だそうです 7
データの形式と属性> start(UKgas)
[1] 1960 1> end(UKgas)[1] 1986 4> frequency(UKgas)[1] 4> UKgas
Qtr1 Qtr2 Qtr3 Qtr41960 160.1 129.7 84.8 120.11961 160.1 124.9 84.8 116.91962 169.7 140.9 89.7 123.31963 187.3 144.1 92.9 120.1
※1960年から1986年までのイギリスのガス消費量の時系列データ・・・だそうです
1年を単位として
四半期ごとにデータがあるの
で48
Window関数で部分抽出
> window(UKgas, c(1975, 2), c(1979, 3))Qtr1 Qtr2 Qtr3 Qtr4
1975 321.8 177.7 409.81976 593.9 329.8 176.1 483.51977 584.3 395.4 187.3 485.11978 669.2 421.0 216.1 509.11979 827.7 467.5 209.7
9
グラフにしてみる> plot(UKgas, col=“blue”, lwd=3)
Time
UK
ga
s
1960 1965 1970 1975 1980 1985
20
06
00
10
00
10
データの作成方法
> x <- ts(1:24, start = c(2010, 1), frequency = 12)> class(x)[1] "ts"> x
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2010 1 2 3 4 5 6 7 8 9 10 11 122011 13 14 15 16 17 18 19 20 21 22 23 24
11
データの作成方法> x <- ts(1:24, start = c(2010, 1), frequency = 4)> x
Qtr1 Qtr2 Qtr3 Qtr42010 1 2 3 42011 5 6 7 82012 9 10 11 122013 13 14 15 162014 17 18 19 202015 21 22 23 24
12
Time
1960 1965 1970 1975 1980 1985
200
600
1000
ラグ処理ts.plot(UKgas,lag(UKgas,k=3),col=c(4,2),lwd=3)
13
差分処理
Time
diff
(UK
ga
s)
1960 1965 1970 1975 1980 1985
-40
00
20
0
plot(diff(UKgas), col = "blue", lwd = 3)
14
ラグ処理と差分処理の関係
diff(UKgas, lag = 2)
UKgas - lag(UKgas, k=-2)
||
15
12.2
自己共分散と自己相関
16
データ分析でよく使う統計
平均、分散、相関係数
時系列の時は・・・?
平均、自己共分散、自己相関
17
という時系列が手元にあったとし
て・・・
nyyy ,,, 21
18
n
t
tyn 1
1ˆ
(標本)平均
19
n
kt
kttk yyn
C1
ˆˆ1ˆ
(標本)自己共分散
20
0ˆ
ˆˆ
C
CR k
k
(標本)自己相関
21
自己相関のPLOTacf(UKgas, ci = 0.9)
0 1 2 3 4 5
-0.2
0.2
0.6
1.0
Lag
AC
F
Series UKgas
22
自己相関のPLOTacf(UKgas, ci = 0.9)
0 1 2 3 4 5
-0.2
0.2
0.6
1.0
Lag
AC
F
Series UKgas
横軸=年1年周期をもつの
で1、2等にピーク
23
自己相関のPLOTacf(diff(UKgas, lag = 4), ci = 0.9)
0 1 2 3 4 5
-0.2
0.2
0.6
1.0
Lag
AC
F
Series diff(UKgas, lag = 4)
24
n
kt
kttk yyn
C1
ˆˆ1ˆ
(標本)相互共分散
※y’・μ’はまた別な時系列とその標本平均だとする 25
0ˆ
ˆˆ
C
CR k
k
(標本)相互相関
26
イギリスで肺関連(気管支炎、肺気腫、喘息)の病気による死者数推移
ts.plot(mdeaths, fdeaths, col = 2:3, lwd = 2)
legend("topleft", c("male", "female"), col = 2:3, lty = 1)
27
その相互相関
ccf(mdeaths, fdeaths)28
12.3
スペクトル分析
29
スペクトル分析
周期性の解析
||
30
パワースペクトル密度関数
ikf
k
keCfp 2
自己共分散Ckのフーリエ変換
31
ピリオドグラム
jikfn
nk
kj eCp2
1
1
ˆˆ
(標本)自己共分散Ck
のフーリエ変換
22,1,0,
nn
n
jf j
32
周波数で物を見る
33
波の重ね合わせで物を見る
34
波の単位||
sin, cos, tan
35
波の単位||
sin, cos, tan
36
※tanは波ではないですよね?
波の単位||
sin, cos, tan
37
※使うのは実数だけですよね?
1つの波の例:cos関数
#cosを何回繰り返すのか
REP <- 5
#cosの周期(この逆数が周波数,0.2)
T <- 5
#サンプリングする個数
N <- 100
#データ生成
x <- (REP * T) * (1:N) / N
y <- ts(cos(2 * pi * x / T),start=1,frequency=(N/(REP*T)))
Plot(y)
38
frequency=(N/(REP*T)
)
単位時間あたりのデータ数
||
39
1つの波の例:cos関数
40
ピリオドグラム描く
spec.pgram(y, log = "no“)
41
周波数0.2(=1/5=1/周期)の位置にだけピーク
1つの波の例:cos関数
42
12.4
ランダムウォークと単位根
43
ランダムウォークと単位根
44
ランダムウォークと単位根
これ見て下さい
45
12.5
ARモデル
46
ARモデル
tit
p
i
it eyay1
2,0:
:
:
Ne
orderp
a
t
i
残差
次数
自己回帰係数
47
と
を決めたい 48
ar関数で推定
> (lh.ar <- ar(lh))
Call:
ar(x = lh)
Coefficients:
1 2 3
0.6534 -0.0636 -0.2269
Order selected 3 sigma^2 estimated as 0.1959
49
ar関数で推定
> lh.ar$order
[1] 3
> lh.ar$ar
[1] 0.653 -0.063 -0.22650
ar関数で推定
321 227.0064.0653.0 tttt yyyy
51
ar関数で推定
> Box.test(lh.ar$res, type="Ljung")
Box-Ljung test
data: lh.ar$res
X-squared = 0.0257, df = 1, p-value = 0.8728
Box-Pierce, Ljung-Box検定
残差が独立か否かチェック 52
予測
> (lh.pr <- predict(lh.ar, n.ahead=10))$pred
Time Series:
Start = 49
End = 58
Frequency = 1
[1] 2.461588 2.272267 2.199151 2.262914 2.352194 2.423066 2.449223 2.441544 2.418779 2.398456
$se
Time Series:
Start = 49
End = 58
Frequency = 1
[1] 0.4425687 0.5286675 0.5525786 0.5527502 0.5592254 0.5665903 0.5688786 0.5689385 0.5692396
[10] 0.5697534
53
予測> pred.upper <- lh.pr$pred + 2 * lh.pr$se
> pred.lower <- lh.pr$pred - 2 * lh.pr$se
> ts.plot(lh, lh.pr$pred, pred.upper, pred.lower,
+ gpars=list(col=c(1,2,3,3),lwd=3))
54
12.6
ARMA/ARIMA
モデル
55
ARMA/ARIMAモデル
jt
q
j
jtit
p
i
it ebeyay11
2,0:
:
:
Ne
orderp
a
t
i
残差
次数
自己回帰係数
56
テキストのコード、Rっぽくねぇ
57
arima関数で推定
> p <- 1:4
> d <- 0:1
> q <- 0:4
> lh.ari.all <- apply(expand.grid(p, d, q), 1, function(x)arima(lh, order = x))
> Reduce(function(x,y)if(x$aic<y$aic){x}else{y}, lh.ari.all)
Call:
arima(x = lh, order = x)
Coefficients:
ar1 ar2 ar3 intercept
0.6448 -0.0634 -0.2198 2.3931
s.e. 0.1394 0.1668 0.1421 0.0963
sigma^2 estimated as 0.1787: log likelihood = -27.09, aic = 64.18
58
12.7
その他のモデル
59
GARCHモデル
jt
r
j
jit
q
i
it heh1
2
1
2,0:
:
:
Ne
orderp
a
t
i
残差
次数
自己回帰係数
60
Not 時系列自体
But 分散のモデル
61
arima関数で推定install.packages("fGarch")
library(fGarch)
UKg.d <- diff(UKgas)
UKg.m <-garchFit(formula=~arma(1,1)+garch(1,1),data=UKg.d)
条件付き平均をarma(1,1)条件付き分散をgarch(1,1) とモデリング 62
Ukg.mはS4クラス
@fit:推計パラメーター・標準誤差等
@fitted:フィットさせた値(予測値)
@residuals:残差その他にも元データ、条件付分散、callオブジェクト等あり
63
メソッドもあり
plot:各種描画(選択)
show:オブジェクトの要約
summary : オブジェクトの要約
predict:予測値の算出
residuals:残差の表示
volatility:条件付き標準偏差計算
coef:推計パラメーター
formula:推計モデル
64
12.8
成分の分解
65
成分の分解観測値=トレンド+周期変動+残差
plot(stl(UKgas, s.window = "periodic"))
66
12.9
多変量時系列
67
というベクトルの時系列が手元にあったとし
て・・・
nYYY ,,, 21
68
サンプルデータ
library(tseries)
data(USeconomic)
USe.d <- diff(USeconomic[,1:2])
ts.plot(USe.d, lty=1:2, col = 1:2)
legend("bottomleft", colnames(USe.d), lty = 1:2, col = 1:2)
・実質GNPの対数値(季節調整済み)・実質M1の対数値(季節調整済み)
69
サンプルデータ
70
ベクトル自己回帰(VAR)モデル
> (USe.ar <- ar(USe.d, order.max = 2, aic=FALSE))Call:
ar(x = USe.d, aic = FALSE, order.max = 2)
$ar
, , 1
[,1] [,2]
[1,] 0.5446 -0.1888
[2,] 0.1981 0.1295
, , 2
[,1] [,2]
[1,] 0.1231 0.04513
[2,] 0.1371 0.07110
$var.pred
[,1] [,2]
[1,] 1.063e-04 1.506e-05
[2,] 1.506e-05 8.494e-05
71
ベクトル自己回帰(VAR)モデル
tttttt
tttttt
EGGMMG
EGGMMM
2121
1121
07.013.014.020.0
05.019.012.054.0
こんなモデルでました
の1階差分値log(GNP):
の1階差分値log(M1):
G
M
72
12.10
カオス時系列
73
カオス時系列
74
カオス時系列
こんなんが
簡単にでるらしい
75
その他参考パッケージ
– ade, its:時系列の操作例、モデルさk製に関する関数
– fracdiff:長期記憶時系列のモデル
– tsfa:時系列因子分析
– GeneTS:マイクロアレイ時系列解析パッケージ
– tsboot(boot), dynlm(dynlm),tsd/decdif/deccensus(pastecs)
– 統計数理研究所のTIMSAC(TIMe Series Analysis and Control program)
76