2012-10-25 41 views
11

我有一個時間序列問題,我希望有人可以幫忙!插值時間序列

問題圍繞着具有不同時間戳的兩組數據。一組數據包含校準數據,另一組數據包含樣本數據。校準比樣本少得多。

我想要做的是將校準數據(低頻)插入採樣時間序列(高頻)。

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") 

我看到的一個大問題是數據的頻率隨機變化。

有沒有人需要做類似的事情?是否有chron或動物園功能可以做我想做的事情(將低頻數據插入到兩個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 documentation更多關於approx