rによるデータサイエンス:12章「時系列」

Post on 15-Jan-2015

11.359 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

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

(標本)平均

19

n

kt

kttk yyn

C1

ˆˆ1ˆ

(標本)自己共分散

20

ˆˆ

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

ˆˆ

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

top related