2012-10-25 16 views
11

私は誰かが助けてくれることを願っている時系列問題があります!時系列補間

この問題は、タイムスタンプの異なる2つのデータセットを中心に回っています。 1セットのデータは較正データを含み、他のセットはサンプルデータを含む。較正はサンプルよりずっと少ない頻度で行われます。

私がしたいのは、校正データ(低周波)をサンプル時系列(高周波数)に補間することです。

sam <- textConnection("time, value 
01:00:52, 256 
01:03:02, 254 
01:05:23, 255 
01:07:42, 257 
01:10:12, 256") 

cal <- textConnection("time, value 
01:01:02, 252.3 
01:05:15, 249.8 
01:10:02, 255.6") 

sample <- read.csv(sam) 

sample$time <- as.POSIXct(sample$time, format="%H:%M:%S") 

calib <- read.csv(cal) 

calib$time <- as.POSIXct(calib$time, format="%H:%M:%S") 

大きな問題は、データの周波数がランダムに変化することです。

似たようなことをした人がいますか?私が望むことをするクロノまたは動物園の機能はありますか(両方のTSがランダムであるより高い周波数のデータに低周波データを補間します)?

答えて

16

私は動物園(またはXTS)を使用し、このようにそれを行うだろう:

library(zoo) 
# Create zoo objects 
zc <- zoo(calib$value, calib$time) # low freq 
zs <- zoo(sample$value, sample$time) # high freq 
# Merge series into one object 
z <- merge(zs,zc) 
# Interpolate calibration data (na.spline could also be used) 
z$zc <- na.approx(z$zc, rule=2) 
# Only keep index values from sample data 
Z <- z[index(zs),] 
Z 
#      zs  zc 
# 2012-10-25 01:00:52 256 252.3000 
# 2012-10-25 01:03:02 254 251.1142 
# 2012-10-25 01:05:23 255 249.9617 
# 2012-10-25 01:07:42 257 252.7707 
# 2012-10-25 01:10:12 256 255.6000 
3

ます。また、このようapprox機能を使用することができ、それははるかに簡単になります。データフレームで作業していることを確認してください。また、as.POSIXctを使用して、キャリブレーションとサンプルデータセットのカラムのフォーマットが同じであることを確認してください。

calib <- data.frame(calib) 
sample <- data.frame(sample) 

IPcal <- approx(calib$time,calib$value, xout = sample$time, 
       rule = 2, method = "linear", ties = mean) 

IPcal <- data.frame(IPcal) 

head(IPcal) 

#    x  y 
#1 2017-03-22 01:00:52 252.3000 
#2 2017-03-22 01:03:02 251.1142 
#3 2017-03-22 01:05:23 249.9617 
#4 2017-03-22 01:07:42 252.7707 
#5 2017-03-22 01:10:12 255.6000 

approxfun documentationapproxについては、こちらをご覧ください。