時系列パッケージのxtsを使っていて便利なのが、時系列の再集計、補完処理です。
不定期tickの時系列を再集計用tickを指定するだけで補完してくれる以下の関数は、痒いところに手が届く機能を提供していると思います。
na.approx 線形補完します
na.locf 直前の値をコピーします
こんな時系列の時どうする?
xtsであるカラムは線形補完したい、他のカラムはLOCF(Last Observation Carried Forward)したい、また数値と文字列が混在している。などです。
これが一筋縄でいかなかったのでまとめておきます。
数値カラムの線形補完
zooパッケージのna.approxがあなたの手間を一行で解決してくれます。
filled <- na.approx(object = xts$numeric, xout = grid, rule = 2)
数値カラムのLOCF
na.approxを並行移動させてもだめで、どうやらzooにアップキャストする必要がありました。
filled <- na.locf(object = as.zoo(xts$numeric), xout = grid, rule = 2)
さもないと、"Error in na.locf.xts(object = xts$numeric) : unsupported type"な、エラーが出てしまいます。xts自体にna.locfはあるにはあるようですが。
文字列カラムの線形補完
これはnon-senseですが、一応
filled <- na.approx(object = xts$chr, xout = grid, rule = 2)
"need at least two non-NA values to interpolate" エラーになります。zooキャストしても同じ。
文字列カラムのLOCF
文字列で埋めたいわけですが、以下もありそうなシナリオです。
filled <- na.locf(object = xts$chr, xout = grid, rule = 2)
zooキャストしないとunsupported typeエラー、zooキャストしても上記と同じエラーになります。
xtsのgithubに、charデータが通らないバグ報告が2015年にされていますが、openのままですね。
ただ、上の状況でxoutをなしにすると通りますので、根本的には動いているようです。xoutは便利なだけにそのまま動かしたいところです。
ワークアランドぽいもの
いくつか代替になりそうなものがありましたので、トライしてみました。
na.locf.default()
上記gitにdefaultをつけるとうまくいくとあります。
filled <- na.locf.default(object = as.zoo(xts$chr), xout = grid, rule = 2)
"Error during wrapup: zero non-NA points" と、同じようなエラーを吐きます。
na.approx( ... , method="constant")
実質これもおなじですが、同じエラーでした。そもそもxoutを使った展開が文字列に対しては機能していないようです。
filled <- na.approx(object = as.zoo(xts$chr), xout = grid, rule = 2, method="constant")
デバッガで追ってみると、
na.approx@github で、
26行目の
objectm <- merge(object.x, zoo(, xout))
で、うまくxoutとマージされてNAが埋め込まれた時系列ができあがっているのですが、そのあとにna.approx.defaultを経由してapproxを呼び出し、以下の中にある
以下の行で、
if (nx <= 1) {
if(method == 1)# linear
stop("need at least two non-NA values to interpolate")
if(nx == 0) stop("zero non-NA points")
}
そのエラーが発生しているようなのですが、具体的な解決法のようなものは見出せませんでした。。。
そもそもlocfは完全にna.approxのラッパになっており、na.apporxはもれなくapproxを呼んでいる、というのがなんとも罠なように思います。characterデータを一度integerに変換して戻すのがよさそうです。
便利すぎるライブラリを使うときは、こういった難所が待ち構えていることを覚悟したほうが良いですね。
追記
以下にPythonで行った例を示します(逃げたな!)
Rの時系列ライブラリxtsでつまづいた処理をPythonで