2012-10-25 29 views
11

Birisinin yardımcı olabileceğini umduğum bir zaman serisi sorunum var!İnterpolasyon zamanları

Sorun, farklı zaman damgalarıyla iki veri kümesi etrafında dönüyor. Bir veri kümesi kalibrasyon verilerini içerir, diğeri örnek verileri içerir. Kalibrasyon örnekleri daha azdır.

Yapmak istediğim kalibrasyon verilerini (düşük frekans) örnek zaman serisine (yüksek frekans) enterpolasyon yapmaktır.

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

Büyük sorun (gördüğümü), verilerin frekinin rasgele değişmesidir.

Herhangi biriniz de benzer şeyler yapmak zorunda mıydınız? İstediğimi yapacak bir kron ya da hayvanat bahçesi fonksiyonu var mı (düşük frekans verisini her iki t de rastgele olan daha yüksek frekanslı veri üzerine enterpolasyon)?

cevap

16

Hayvanat bahçesinden (veya XTS) kullanın ve böyle yapardı:

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

Ayrıca böyle approx fonksiyonunu kullanabilir ve çok daha kolay olacaktır. Sadece veri çerçeveleriyle çalıştığınızdan emin olun. Ayrıca, kalibrasyondaki ve örnek veri kümesindeki sütunun formatının as.POSIXct ile aynı olduğundan emin olun.

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 

Devamı yaklaşık approxapproxfun documentation üzerinde.

İlgili konular