2012-10-25 6 views
11

Mam problem z szeregiem czasowym, który mam nadzieję, że ktoś może pomóc!Czasowniki interpolujące

Problem dotyczy dwóch zestawów danych z różnymi znacznikami czasu. Jeden zestaw danych zawiera dane kalibracyjne, a drugi zawiera przykładowe dane. Kalibracja jest znacznie rzadsza niż w przypadku próbek.

Co chciałbym zrobić, to interpolować dane kalibracji (low freq) do serii czasowej próbki (high freq).

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

Głównym problemem (który widzę) jest to, że freq danych zmienia się losowo.

Czy ktokolwiek z was musiał zrobić podobne rzeczy? Czy istnieje funkcja chron lub zoo, która zrobiłaby to, co chcę (interpolacja niskich danych freq na dane o wyższej częstotliwości, gdzie oba t są losowe)?

Odpowiedz

16

użyłbym Zoo (lub XTS) i zrobić to tak:

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

Można również użyć funkcji approx tak i to będzie dużo łatwiejsze. Tylko upewnij się, że pracujesz z ramkami danych. Upewnij się również, że format kolumny w kalibracji i zestaw danych próbek jest taki sam, używając 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 

Przeczytaj więcej o approx na approxfun documentation.

Powiązane problemy