2012-10-25 13 views
11

Ho un problema di serie storiche che spero che qualcuno possa aiutare!Intervalli di interpolazione

Il problema ruota attorno a due serie di dati con timestamp diversi. Un set di dati contiene dati di calibrazione, l'altro contiene dati di esempio. La calibrazione è molto meno frequente rispetto ai campioni.

Quello che mi piacerebbe fare è interpolare i dati di calibrazione (bassa frequenza) sulla serie temporale del campione (alta frequenza).

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

Il grosso problema (che vedo) è che il freq dei dati cambia casualmente.

Qualcuno di voi ha dovuto fare cose simili? Esiste una funzione chron o zoo che farebbe ciò che voglio (interpolare dati di bassa frequenza su dati freq più alti in cui entrambi i valori sono casuali)?

risposta

16

vorrei utilizzare zoo (o XTS) e farlo in questo modo:

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

è anche possibile utilizzare la funzione approx come questo e sarà molto più facile. Assicurati di lavorare con i frame di dati. Inoltre, assicurarsi che il formato della colonna in calibrazione e il set di dati campione siano gli stessi usando 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 

Per saperne di più su approxapproxfun documentation.