Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

25,057 views

Published on

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

Published in: Technology, Business
  • Be the first to comment

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

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

×