Your SlideShare is downloading. ×
xtsパッケージで時系列解析
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

xtsパッケージで時系列解析

13,595
views

Published on

Presentation document at Tokyo.R meeting on 2nd July 2011. …

Presentation document at Tokyo.R meeting on 2nd July 2011.
Rのxts(zoo)パッケージで時系列を捌くためのノウハウ(データ作成、便利関数)を紹介。

Published in: Technology, Business

0 Comments
25 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
13,595
On Slideshare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
118
Comments
0
Likes
25
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. xtsパッケージで時系列解析
    @teramonagi
    第15回R勉強会@東京(Tokyo.R#15)
    2011/07/02
    1
  • 2. アジェンダ
    自己紹介
    xtsパッケージって?
    xtsの作り方
    xtsで時系列処理
    2
  • 3. 自己紹介
    3
  • 4. Coming soon !
    4
  • 5. 自己紹介
    • ID:teramonagi
    (hatena/twitter/gmail)
    • 職業:クオントゥ
    • 6. 興味:.NET, 関数型言語 
    数理+Code+Bussiness =???
    Coming soon !
    5
  • 7. xtsパッケージって?
    6
  • 8. xtsパッケージ||時系列を処理するための便利パッケージ
    7
  • 9. Rには時系列のclassが…
    CRAN Task View: Time Series Analysis より
    8
  • 10. 結構ある
    CRAN Task View: Time Series Analysis より
    9
  • 11. 何を使えばよいのやら
    10
  • 12. そんな時のxtsパッケージ
    eXtensibleTime Series
    ベースはzooオブジェクト
    便利な関数がいっぱい
    他クラスへの(からの)変換制御が容易
    機能拡張が容易
    11
  • 13. そんな時のxtsパッケージ
    eXtensibleTime Series
    ベースはzooオブジェクト
    便利な関数がいっぱい
    他クラスへの(からの)変換制御が容易
    機能拡張が容易
    12
  • 14. xtsの作り方
    13
  • 15. 使用するデータ
    偽日経225データをご用意(http://dl.dropbox.com/u/9923352/mikkei225.csv)
    > x <- read.csv("http://dl.dropbox.com/u/9923352/mikkei225.csv")
    > str(x)
    'data.frame': 118 obs. of 5 variables:
    $ date : Factor w/ 118 levels "2011-01-04","2011-01-05",..: 1 2 3 4 5 6 7 8 9 10 ...
    $ open : num 10353 10388 10477 10505 10483 ...
    $ height: num 10410 10413 10530 10549 10537 ...
    $ low : num 10322 10358 10477 10502 10475 ...
    $ close : num 10398 10380 10529 10540 10509 …
    14
  • 16. いざxtsへ!(data.frame)
    > install.packages(xts)
    > library(xts)
    > as.xts(x)
    以下にエラー as.POSIXlt.character(x, tz, ...) :
    character string is not in a standard unambiguous format
    > xts(x)
    以下にエラー xts(x) : order.by requires an appropriate time-based object
    15
  • 17.  (;´Д`)
    ※as.xts, xts関数でも引数をちゃんと書けばいけますが、面倒…
    16
  • 18. いざxtsへ!(data.frame)
    > x.xts <- as.xts(read.zoo(x))
    > class(x.xts)
    [1] "xts" "zoo"
    > str(x.xts)
    An ‘xts’ object from 2011-01-04 to 2011-06-27 containing:
    Data: num [1:118, 1:4] 10353 10388 10477 10505 10483 ...
    - attr(*, "dimnames")=List of 2
    ..$ : NULL
    ..$ : chr [1:4] "open" "height" "low" "close"
    Indexed by objects of class: [Date] TZ:
    Original class: 'zoo'
    xts Attributes:
    NULL
    17
  • 19. Data.frameをxtsにしたい時は一旦zooオブジェクトを経由するのが楽
    18
  • 20. いざxtsへ!(csv)
    > url <- "http://dl.dropbox.com/u/9923352/mikkei225.csv"
    > x.xts <- as.xts(read.zoo(url, header = TRUE, sep = ","))
    > head(x.xts)
    open height low close
    2011-01-04 10352.58 10409.56 10321.67 10398.49
    2011-01-05 10387.55 10413.05 10357.61 10380.37
    2011-01-06 10477.09 10529.68 10477.09 10529.33
    2011-01-07 10505.29 10549.28 10501.59 10539.61
    2011-01-11 10482.92 10536.69 10474.59 10508.98
    2011-01-12 10563.10 10577.33 10503.78 10513.62
    19
  • 21. いざxtsへ!(matrix)
    > y <- matrix(1:20, ncol = 2)
    > z <- Sys.Date() - 1:10
    > x <- xts(y, order.by = z)
    > head(x)
    [,1] [,2]
    2011-06-19 10 20
    2011-06-20 9 19
    2011-06-21 8 18
    2011-06-22 7 17
    2011-06-23 6 16
    2011-06-24 5 15
    20
  • 22. いざxtsへ!(matrix)
    > y <- matrix(1:20, ncol = 2)
    > z <- Sys.Date() - 1:10
    > rownames(y) <- as.character(z)
    > x <- as.xts(y)
    > head(x)
    [,1] [,2]
    2011-06-19 10 20
    2011-06-20 9 19
    2011-06-21 8 18
    2011-06-22 7 17
    2011-06-23 6 16
    2011-06-24 5 15
    21
  • 23. xtsで時系列処理
    22
  • 24. 関数の紹介(coredata, index)
    データ・日付だけ抜く
    > head(index(x.xts))
    [1] "2011-01-04" "2011-01-05" "2011-01-06" "2011-01-07" "2011-01-11"
    [6] "2011-01-12"
    > head(coredata(x.xts))
    open height low close
    [1,] 10352.58 10409.56 10321.67 10398.49
    [2,] 10387.55 10413.05 10357.61 10380.37
    [3,] 10477.09 10529.68 10477.09 10529.33
    [4,] 10505.29 10549.28 10501.59 10539.61
    [5,] 10482.92 10536.69 10474.59 10508.98
    [6,] 10563.10 10577.33 10503.78 10513.62
    23
    time関数も可
  • 25. 裏を返すとデータだけ、日付だけの変更が可能
    24
  • 26. 発想としてはこんな感じ
    元になるデータ
    (vector or matrix)
    xts
    Object
    元になる日時
    (Date,POSIXlt, yearmon… )
    25
  • 27. 日付だけ変更(型変換、1秒加算)
    > y <- x.xts
    > indexClass(y)
    [1] "Date"
    > last(index(y))
    [1] "2011-06-27"
    > index(y) <- as.POSIXct(index(y)) + 1
    > indexClass(y)
    [1] "POSIXt" "POSIXct"
    > last(index(y))
    [1] "2011-06-27 09:00:01 JST"
    代わりにend(start)関数も使用可
    26
  • 28. 関数の紹介([, ])
    インデクサ(数値or日付っぽい文字列)でデータ抽出
    > x.xts[1:3]
    open height low close
    2011-01-04 10352.58 10409.56 10321.67 10398.49
    2011-01-05 10387.55 10413.05 10357.61 10380.37
    2011-01-06 10477.09 10529.68 10477.09 10529.33
    > x.xts['2011-06-22::']
    open height low close
    2011-06-22 9524.545 9657.915 9524.545 9628.725
    2011-06-23 9559.177 9653.867 9554.757 9598.197
    2011-06-24 9625.949 9694.609 9608.759 9678.229
    2011-06-27 9632.905 9637.475 9569.565 9577.295
    27
    x.xts[‘2011-06‘]で6月だけのデータ
  • 29. 関数の紹介(apply.xxx)
    xxx(yearly,monthly…)毎の集計(最大・最小・lambda exp…)
    > apply.monthly(x.xts, max)
    以下にエラー dimnames(x) <- dn :
    'dimnames' の長さ [2] が配列の大きさと違っています
    > apply.monthly(x.xts, function(y)sapply(y, max))
    open height low close
    2011-01-31 10594.733 10621.843 10566.553 10591.033
    2011-02-28 10882.025 10890.715 10819.595 10855.980
    2011-03-31 10732.936 10770.456 10672.576 10753.696
    2011-04-28 9773.167 9849.207 9718.147 9849.207
    2011-05-31 9963.861 10016.941 9935.741 10003.671
    2011-06-27 9709.612 9722.292 9660.872 9721.172
    28
  • 30. 複数列のデータの場合は、sapply(or apply(,2,))をかませろ!
    29
  • 31. apply.xxx関数で足りない時
    apply.xxxは以下しかない
    apply.daily(x, FUN, ...)
    apply.weekly(x, FUN, ...)
    apply.monthly(x, FUN, ...)
    apply.quarterly(x, FUN, ...)
    apply.yearly(x, FUN, ...)
    分、あるいはもっと小さい単位のマイクロ秒データを束にして処理したい時もある
    30
  • 32. 関数の紹介(endpoints, period.apply)
    組み合わせて強力な集計が可能
    > ep <- endpoints(x.xts, on = "months")
    > period.apply(x.xts, ep, function(x_)sapply(x_, max))
    open height low close
    2011-01-31 10594.733 10621.843 10566.553 10591.033
    2011-02-28 10882.025 10890.715 10819.595 10855.980
    2011-03-31 10732.936 10770.456 10672.576 10753.696
    2011-04-28 9773.167 9849.207 9718.147 9849.207
    2011-05-31 9963.861 10016.941 9935.741 10003.671
    2011-06-27 9709.612 9722.292 9660.872 9721.172
    31
  • 33. 関数の紹介(endpoints, period.apply)
    組み合わせて強力な集計が可能
    > ep <- endpoints(x.xts, on = "months", k = 3)
    > period.apply(x.xts, ep, function(x_)sapply(x_, max))
    open height low close
    2011-03-31 10882.025 10890.71 10819.595 10855.98
    2011-06-27 9963.861 10016.94 9935.741 10003.67
    32
  • 34. 関数の紹介(split)
    データをある時間単位でlist化
    > x.xts.June <- x.xts["2011-06"]
    > split(x.xts.June, "weeks")
    [[1]]
    open height low close
    2011-06-01 9709.612 9722.292 9660.872 9721.172
    2011-06-02 9560.639 9575.019 9517.289 9555.049
    2011-06-03 9551.175 9603.615 9491.265 9492.795
    2011-06-06 9467.313 9490.493 9359.723 9380.293
    [[2]]
    open height low close
    2011-06-07 9373.654 9457.104 9360.754 9445.394
    33
    週ごとにlist化
  • 35. zooパッケージ関数も適用可
    関数のローリング適用:rollapply
    各青矢印の期間で統計量算出
    元の時系列データ
    34
  • 36. zooパッケージ関数も適用可
    関数のローリング適用:rollapply
    > tail(rollapply(x.xts, 100, mean))
    open height low close
    2011-04-05 9905.609 9961.785 9836.091 9898.246
    2011-04-06 9896.647 9952.923 9827.107 9889.411
    2011-04-07 9888.149 9944.702 9818.797 9881.057
    2011-04-08 9879.627 9936.826 9810.408 9873.009
    2011-04-11 9871.232 9928.818 9802.288 9865.014
    2011-04-12 9862.969 9920.402 9794.668 9857.194
    100(日)平均を計算
    35
  • 37. zooパッケージ関数も適用可
    まとめて捌く:aggregate
    > aggregate(x.xts, as.yearmon, last)
    open height low close
    1 2011 10219.885 10265.865 10182.475 10237.825
    2 2011 10504.552 10628.772 10448.842 10624.102
    3 2011 9764.651 9765.181 9658.011 9754.471
    4 2011 9748.827 9849.207 9712.047 9849.207
    5 2011 9500.721 9697.471 9497.521 9693.851
    6 2011 9632.905 9637.475 9569.565 9577.295
    各月の月末値を抽出
    36
  • 38. zooパッケージ関数も適用可
    欠損値の補間: na.approx, na.spline
    > y.xts <- aggregate(x.xts, as.yearmon, last)
    > y.xts[3,1] <- NA
    > y.xts
    open height low close
    1 2011 10219.885 10265.865 10182.475 10237.825
    2 2011 10504.552 10628.772 10448.842 10624.102
    3 2011 NA 9765.181 9658.011 9754.471
    4 2011 9748.827 9849.207 9712.047 9849.207
    5 2011 9500.721 9697.471 9497.521 9693.851
    6 2011 9632.905 9637.475 9569.565 9577.295
    37
  • 39. zooパッケージ関数も適用可
    欠損値の補間: na.approx, na.spline
    > na.approx(y.xts)
    open height low close
    1 2011 10219.885 10265.865 10182.475 10237.825
    2 2011 10504.552 10628.772 10448.842 10624.102
    3 2011 10126.690 9765.181 9658.011 9754.471
    > na.spline(y.xts)
    open height low close
    1 2011 10219.885 10265.865 10182.475 10237.825
    2 2011 10504.552 10628.772 10448.842 10624.102
    3 2011 10207.079 9765.181 9658.011 9754.471
    線形補間
    スプライン補間
    38
  • 40. zooパッケージ関数も適用可
    欠損値の補間: na.locf
    > na.locf(y.xts)
    open height low close
    1 2011 10219.885 10265.865 10182.475 10237.825
    2 2011 10504.552 10628.772 10448.842 10624.102
    3 2011 10504.552 9765.181 9658.011 9754.471
    4 2011 9748.827 9849.207 9712.047 9849.207
    5 2011 9500.721 9697.471 9497.521 9693.851
    6 2011 9632.905 9637.475 9569.565 9577.295
    1つ前の値(1行前の値)で補間
    39
  • 41. その他便利関数
    Xts同士の結合(merge, rbind)
    日時Objで範囲抽出(window)
    欠損値補間(na.aggregate)
    xtsのままにする(Reclass)
    40
  • 42. まとめ
    xts = eXtensibleTime Series
    ベースはzooオブジェクト
    月ごとの集計等複雑な時系列処理もサクサク書ける
    詳しく知りたかったらCRANのzoo, xtsのManual読め
    41
  • 43. まとめ
    stackoverflowの[r],[time-series]もgood
    42